UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索

项目目录探索

  • C++工程一定不能是中文路径,中文项目名,最好全部不要用中文,蓝图项目可以是中文
  • 浅浅创建一个空项目,讲解一下之前UE4没有讲解的项目目录文件的分布组成
    在这里插入图片描述
  • .vs:文件夹一般是项目编译缓存文件夹,
  • Binaries:存储虚幻引擎二进制的,针对不同平台发布的配置等
  • Config:虚幻的配置文件夹,一般里面都是虚幻的配置,或者自己写的配置
  • Content:内容文件夹,一般开发者后续创建的资产都在这里面
  • DerivedDataCache:虚幻生成与管理派生数据的文件夹,包含着色器的编译,编译材质贴图等等
  • Intermediate:存储一些模型缓存图片缓存等等,这个一般我们是不需要管理的,一般编译器出问题要删除C++代码时,这个文件也是要被删除的
  • Saved:包含配置文件,快照日志文件那些
  • Source:代码存放的位置
  • 一般我们写C++代码很容易导致编译器爆掉,我们除了要删除相对的代码或者是代码文件,还要删除.vs这个缓存文件夹,和这三个Binaries,Intermediate,项目名.sln文件文件,然后右键项目名.uproject文件,里面会有重新构建项目的选项,重新构建项目除错

虚幻C++常用结构

  • 虚幻引擎C++类层级结构(Hierarchy),与UE4一样一样,复习一下
    在这里插入图片描述
  • 反射与垃圾回收也是一样的,使用宏进行标识,UE的UHT系统会帮我们进行垃圾回收
    在这里插入图片描述

创建Actor类

  • 创建一个Actor类,当在创建Actor类时如果添加了文件,则代码里面会有这个添加了文件的头文件它会让编译器找不到Actor类,UE4好像没有这种情况,UE5就有,我们删除这个文件就可以了
    在这里插入图片描述
    在这里插入图片描述
  • 然后在UE5中vs中生成代码时,记得要关闭热重载,不然vs中的编译不会通过
    在这里插入图片描述

渐渐来个Hellow World

  • 给Actor来个Mesh,打印一下Hellow World通过日志打印与屏幕打印
  • 打印到屏幕要加头文件,#include "Engine/Engine.h"
  • 给Mesh硬编码加上材质与网格要加头文件,#include "UObject/ConstructorHelpers.h"
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Properties")
	class UStaticMeshComponent* StaticMesh;
//上面是.h中Public的内容-------------------------------------------------------------------------------------------------------

#include "MyActor_One.h"
#include "Engine/Engine.h"
#include "UObject/ConstructorHelpers.h"
#include "Components/StaticMeshComponent.h"

// Sets default values
AMyActor_One::AMyActor_One()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
	RootComponent = StaticMesh;
	
	//硬编码材质与网格
	ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMeshAsset(TEXT("/Script/Engine.StaticMesh'/Engine/BasicShapes/Sphere.Sphere'"));
	ConstructorHelpers::FObjectFinder<UMaterialInterface> MaterialAsset(TEXT("/Script/Engine.Material'/Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial'"));
	if (StaticMeshAsset.Succeeded() && MaterialAsset.Succeeded())
	{
		StaticMesh->SetStaticMesh(StaticMeshAsset.Object);
		StaticMesh->SetMaterial(0, MaterialAsset.Object);
	}
}

// Called when the game starts or when spawned
void AMyActor_One::BeginPlay()
{
	Super::BeginPlay();

	UE_LOG(LogTemp, Warning, TEXT("Hello World"));
	UE_LOG(LogTemp, Warning, TEXT("Hello World"));
	UE_LOG(LogTemp, Error, TEXT("Hello World"));
	//这里的-1可以使用INDEX_NONE,INDEX_NONE也是-1,UE的宏
	GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT("Hello World")));
	
}	
  • 运行结果
    在这里插入图片描述

宏的参数讲解

  • 变量的宏参数,UPROPERTY()
    • VisibleAnywhere:在蓝图中与视口中都可见
    • VisibleDefaultsOnly:只在蓝图中可见
    • VisibleInstanceOnly:只在视口中可见
    • EditAnywhere:在蓝图中与视口中都可编辑
    • EditDefultsOnly:在蓝图中可编辑
    • EditInstanceOnly:在视口中可编辑
    • BlueprintReadOnly:在蓝图中可读
    • BlueprintReadWrite:在蓝图中可读可写
    • Category:标签
    • meta = (MakeEditWidget = "true"):这是一个可选的元标记(Metadata),用于添加额外的属性信息。在这种情况下,MakeEditWidget 被设置为 “true”,这表示该属性可以在编辑器中作为一个小部件进行编辑。这通常用于自定义编辑器小部件以提供更直观的属性编辑体验。
    • meta=(ClampMin= -10,ClampMax= 10, UIMin= -10, UIMax= 10)):clamp:键盘输入值控制,ui:鼠标拉动值控制
    • meta = (AllowPrivateAccess = "true"):可以让内部的其他成员访问
  • 函数的宏参数:UFUNCTION()
    • BlueprintNativeEvent:BlueprintNativeEvent关键词允许在Unreal Engine蓝图中声明本地事件,并通过C++进行实现和扩展。在C++中实现一个蓝图本地事件时,需要在函数名后添加_Implementation作为后缀。这是为了区分虚函数和其实现函数,并保持代码的一致性和清晰度,总的来说就是会在C++中提供一个默认的实现,然后蓝图中去覆盖它改写它,在蓝图中实现这个函数时,如果调用一个父类的版本,它会先调用C++里面加了_Implementation这个函数,然后再去做蓝图其他的操作
    • BlueprintCallable:允许函数在蓝图中进行调用
    • BlueprintImplementableEvent:会把函数变成一个事件,把函数提升为事件后,就不能去初始化函数了,因为这个是在蓝图调用的事件
    • Category:标签

虚幻中的三维坐标

  • 在数学三维直角坐标系中里面XYZ也可以是,X:Roll,Y:Pitch,Z:Yaw,这是右手坐标系
  • 在UE中面XYZ也可以是,X:Pitch,Y:Yaw,Z:Roll,这是左手坐标系,UE中的
  • 在UE中XYZ轴的正向分别对应前方、右方和上方,显示的箭头颜色分别为红色、绿色和蓝色(三基色的习惯顺序)。
    在这里插入图片描述

虚幻5中的增强输入系统

  • UE5中已经摒弃掉了轴映射机制,改用为增强输入系统
  • UE5中没有默认开启增强输入系统,我们需要添加这个模块在项目名.Build.cs里面,这个完成后,最好是删除那几个文件重新构建一下避免一下后续的bug,项目目录探索那章
    在这里插入图片描述

定义绑定映射系统与处理函数

  • 增强输入系统的特定代码及定义一个映射绑定,一个移动轴的绑定,然后一个绑定的处理函数,这个处理函数要传入FInputActionValue的结构体要添加头文件#include "InputActionValue.h"在当前.h文件中
public:
	//映射绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputMappingContext* DefaultMappingContext;

	//移动绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputAction* MoveAction;

protected:
void CharacterMove(const FInputActionValue& value);
  • 这个处理函数基本就和之前写UE4时人物移动面向逻辑处理差不多
void AMyCharacter::CharacterMove(const FInputActionValue& value)
{
	FVector2D MovementVector = value.Get<FVector2D>();//获取速度
	if (Controller!=nullptr)
	{
		FRotator Rotation = Controller->GetControlRotation();
		FRotator YawRotation = FRotator(0, Rotation.Yaw, 0);
		//获取到前后单位向量
		FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		//获取左右单位向量
		FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		
		AddMovementInput(ForwardDirection, MovementVector.Y);
		AddMovementInput(RightDirection, MovementVector.X);
	}
}
  • 对比一下之前写的面向移动逻辑,这是之前UE4写的面向逻辑
    在这里插入图片描述
  • 那就来浅浅解释一下虚幻5中为什么这样写逻辑
    • 已知虚幻中的X:Pitch,Y:Yaw,Z:Roll

    • 我们获取到FInputActionValue这个结构体中的FVector2D,注意这里是FVector2D,这是数学平面坐标系
      FVector2D MovementVector = value.Get<FVector2D>();//获取速度
      在这里插入图片描述

    • 而在UE三维移动中,我们只需要关注Yaw(也就是Y)
      FRotator YawRotation = FRotator(0, Rotation.Yaw, 0);
      在这里插入图片描述

    • 然后在虚幻中默认为右方向以角色右手为正方向,所以那平面坐标系里面X是不是就是前后了,Y是左右
      FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
      FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
      在这里插入图片描述

    • 此时我们已经得到了前后左右的单位向量后,回到开始的逻辑因为UE5增强输入系统传入的是FInputActionValue结构体了,然后获取的是FVector2D这是个数学平面坐标系,所以添加到角色移动中,这里前后就是数学平面坐标系的Y了,左右就是X了
      AddMovementInput(ForwardDirection, MovementVector.Y);
      AddMovementInput(RightDirection, MovementVector.X);
      在这里插入图片描述

绑定移动

  • 在SetupPlayerInputComponen()中进行绑定移动,我们需要将PlayerInputComponent转换为UEnhancedInputComponent,然后进行绑定为了增强型输入系统,这里需要头文件#include "EnhancedInputComponent.h"来使用UEnhancedInputComponent组件
  • BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterMove);
    • MoveAction:之前定义的移动绑定UInputAction
    • ETriggerEvent::Triggered:触发发生在一个或多个处理节拍之后,一般用Triggered比较多,其他不常用
    • this:自身来进行绑定
    • &AMyCharacter::CharacterMove:处理函数
// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
	if (EnhancedInputComponent)
	{
		//移动绑定
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterMove);
	}
}

绑定映射

  • 在BeginPlay()中绑定增强输入系统的映射,首先将Controller转换为APlayerController,成功后使用UEnhancedInputLocalPlayerSubsystem将本地玩家使用增强型输入系统需要使用头文件:#include "EnhancedInputSubsystems.h",成功后就绑定映射
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();
	APlayerController* PlayerController = Cast<APlayerController>(Controller);
	if (PlayerController)
	{
		UEnhancedInputLocalPlayerSubsystem* Subsystem = 
			ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
		if (Subsystem)
		{
			//映射到上下文
			Subsystem->AddMappingContext(DefaultMappingContext, 0);
		}
	}
}

编辑器操作

  • 创建一个输入操作蓝图与一个输入映射场景蓝图
    在这里插入图片描述
  • 将输入操作的值类型变更为Axis2D也就是Vector2D,因为我们角色是在平面上移动
    在这里插入图片描述
  • 在输入映射中添加映射,注意在虚幻中我们的轴默认是朝着右方向的,以角色的右手边为正方向,所以定义W向前的时候修改器要添加个拌合输入轴值,将右正方向旋转到向前的正方向
    在这里插入图片描述
  • S向后的修改器添加个拌合输入轴值,然后添加个否定(反向)
    在这里插入图片描述
  • D方向是朝右的,就不需要做任何修改
  • A方向就添加个否定即可
    在这里插入图片描述
  • 然后在角色蓝图中添加上增强输入系统
    在这里插入图片描述

视角移动绑定

  • 再添加一个UInputAction用来绑定视角,和视角处理函数
	//视角绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputAction* LookAction;


void CharacterLook(const FInputActionValue& value);
  • 视角处理函数
void AMyCharacter::CharacterLook(const FInputActionValue& value)
{
	FVector2D LookAxisVector = value.Get<FVector2D>();
	if (Controller != nullptr)
	{
		AddControllerPitchInput(LookAxisVector.Y);
		AddControllerYawInput(LookAxisVector.X);
	}
}

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
	if (EnhancedInputComponent)
	{
		//移动绑定
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterMove);
		EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterLook);
	}
}
  • 再建一个输入蓝图依然是FVector2D
    在这里插入图片描述
  • 添加到映射集合中,注意游戏中的视角是反向的,要修改为否定,只开启Y方向
    在这里插入图片描述

运行结果

请添加图片描述

限制上下视角范围

  • 限制角色上下视角范围和虚幻4中的写法差不多,只不过值变为了FInputActionValue结构体中的FVector2D 二维向量
void AMyCharacter::CharacterLook(const FInputActionValue& value)
{
	FVector2D LookAxisVector = value.Get<FVector2D>();
	if (Controller != nullptr)
	{
		GEngine->AddOnScreenDebugMessage(1, 10, FColor::Red, FString::Printf(TEXT("%f"),(GetControlRotation().Pitch)));
		AddControllerYawInput(LookAxisVector.X);
		if (GetControlRotation().Pitch < 270.f && GetControlRotation().Pitch>180.f && LookAxisVector.Y > 0.f)
		{
			return;
		}
		if (GetControlRotation().Pitch < 180.f && GetControlRotation().Pitch>45.f && LookAxisVector.Y < 0.f)
		{
			return;
		}
		AddControllerPitchInput(LookAxisVector.Y);
		
	}
}

MyCharacter.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "InputActionValue.h"
#include "MyCharacter.generated.h"

UCLASS()
class MYOBJECTUE5_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AMyCharacter();

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllPrivateAccess = "true"))
	class USpringArmComponent* SpringArm;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllPrivateAccess = "true"))
	class UCameraComponent* MyCamera;

	//映射绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputMappingContext* DefaultMappingContext;

	//移动绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputAction* MoveAction;

	//视角绑定
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input", meta = (AllPrivateAccess = "true"))
	class UInputAction* LookAction;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

	void CharacterMove(const FInputActionValue& value);
	void CharacterLook(const FInputActionValue& value);

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

};

MyCharacter.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyCharacter.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "Engine/Engine.h"
// Sets default values
AMyCharacter::AMyCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	GetCharacterMovement()->bOrientRotationToMovement = true;
	GetCharacterMovement()->RotationRate = FRotator(0.f, 500.f, 0.f);
	GetCharacterMovement()->MaxWalkSpeed = 500.f;
	GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;
	GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;


	//相机臂
	SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
	SpringArm->SetupAttachment(GetRootComponent());
	SpringArm->TargetArmLength = 400.f;
	SpringArm->bUsePawnControlRotation = true;

	//相机
	MyCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("MyCamera"));
	MyCamera->SetupAttachment(SpringArm, USpringArmComponent::SocketName);//附加到末尾
	MyCamera->bUsePawnControlRotation = false;
}

// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();
	APlayerController* PlayerController = Cast<APlayerController>(Controller);
	if (PlayerController)
	{
		UEnhancedInputLocalPlayerSubsystem* Subsystem = 
			ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
		if (Subsystem)
		{
			//映射到上下文
			Subsystem->AddMappingContext(DefaultMappingContext, 0);
		}
	}
}

void AMyCharacter::CharacterMove(const FInputActionValue& value)
{
	FVector2D MovementVector = value.Get<FVector2D>();//获取速度
	if (Controller!=nullptr)
	{
		FRotator Rotation = Controller->GetControlRotation();
		FRotator YawRotation = FRotator(0, Rotation.Yaw, 0);
		//获取到前后单位向量
		FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		//获取左右单位向量
		FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		
		AddMovementInput(ForwardDirection, MovementVector.Y);
		AddMovementInput(RightDirection, MovementVector.X);
	}
}

void AMyCharacter::CharacterLook(const FInputActionValue& value)
{
	FVector2D LookAxisVector = value.Get<FVector2D>();
	if (Controller != nullptr)
	{
		GEngine->AddOnScreenDebugMessage(1, 10, FColor::Red, FString::Printf(TEXT("%f"),(GetControlRotation().Pitch)));
		AddControllerYawInput(LookAxisVector.X);
		if (GetControlRotation().Pitch < 270.f && GetControlRotation().Pitch>180.f && LookAxisVector.Y > 0.f)
		{
			return;
		}
		if (GetControlRotation().Pitch < 180.f && GetControlRotation().Pitch>45.f && LookAxisVector.Y < 0.f)
		{
			return;
		}
		AddControllerPitchInput(LookAxisVector.Y);
		
	}
}

// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
	if (EnhancedInputComponent)
	{
		//移动绑定
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterMove);
		EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AMyCharacter::CharacterLook);
	}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux安装mysql5.7(一遍过)

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

游戏盾的防御原理以及为什么程序类型更适合接入游戏盾。

游戏盾是一种专门用于游戏服务器的安全防护服务&#xff0c;旨在抵御各种网络攻击。它的原理主要包括以下几个方面&#xff1a; 流量清洗和过滤&#xff1a;游戏盾会对进入游戏服务器的流量进行实时监测、分析和过滤。它通过识别恶意流量和攻击流量&#xff0c;过滤掉其中的攻击…

多种混沌映射初始化种群MATLAB代码(开源代码)

五种混沌映射改进鲸鱼算法&#xff08;自行切换&#xff09;&#xff1a; clc clear close allSearchAgents_no30; % Number of search agents %种群数量Function_nameF1; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) %使用方程的名…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式&#xff08;Proxy&#xff09;是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理&am…

浅谈https

1.网络传输的安全性 http 协议&#xff1a;不安全&#xff0c;未加密https 协议&#xff1a;安全&#xff0c;对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点&#xff1a; 加解密使用 相同 秘钥 高效&#xff0c;适用于大量数据的加密场景 算法公开&a…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

Linux安装mysq 8.0服务端和客户端(亲测保成功)

1. 查看当前是否有已经安装好的mysql,先卸载 # 命令 rpm -qa|grep -i mysql# 结果显示 mysql-community-libs-5.7.42-1.el7.x86_64 mysql-community-common-5.7.42-1.el7.x86_64 mysql-community-libs-compat-5.7.42-1.el7.x86_64 mysql57-community-release-el7-10.noarch my…

perl脚本获取Windows系统常用路径信息

windows系统常用的路径,比如临时目录、资源文件夹、字体保存目录、应用程序数据存放目录等等。在日常操作的时候寻找略有不便。这里用perl写一个脚本&#xff0c;并把这些目录信息格式化为json&#xff0c;方便查找。如下是perl代码&#xff1a; #! /usr/bin/perl use v5.14; …

中国科技巨头:集体变革中 /华为鸿蒙 4:功能、模型、生态三大升级 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 中国科技巨头&#xff1a;集体变革中 华为鸿蒙 4&#xff1a;功能、模型、生…

2002-2021年全国各地级市环境规制18个相关指标数据

2002-2021年全国各地级市环境规制18个相关指标数据 1、时间&#xff1a;2002-2021年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、地区、年份、工业二氧化硫排放量(吨)、工业烟粉尘排放量(吨)、工业废水排放量(万吨)、工业废水排放达标量(万吨)、工业二氧…

华为OD机试 - 攀登者1(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…

SpringSecurity6 | 修改默认用户

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏: MySQL学习 🥭本文内容:SpringSecurity6 | 修改默认用户 📚个人知识库 :知识库,欢迎大家访问 学习参考…

一款带键扫的LED驱动电路

一、基本概述 TM1628A是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电…

ProEasy机器人案例:电池边包胶

如下图所示&#xff0c;对一个电池三边包边&#xff0c;因客户现场有很多规格电池的大小&#xff0c;所以就需要建立动态的工具坐标来实现适配所有种类的电池 程序如下&#xff1a;Ddome程序 function Speed(num) --速度设置 MaxSpdL(2000) --movl最大速度…

机器学习 sklearn 中的超参数搜索方法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

一个能让你涨薪5k的自动化测试小技巧项目流程优化

引言及概览 项目流程优化是一个持续过程&#xff0c;每个公司&#xff0c;每个团队情况不一样&#xff0c;总原则是&#xff1a;如果在项目过程中你感觉到某一点很别扭、很不爽、痛了&#xff0c;那么这就是优化点。 优化的手段是多样化的&#xff0c;如通过流程规范去约束、…

将图像增广应用于Mnist数据集

将图像增广应用于Mnist数据集 不用到cifar-10的原因是要下载好久。。我就直接用在Mnist上了&#xff0c;先学会用 首先我们得了解一下图像增广的基本内容&#xff0c;这是我的一张猫图片&#xff0c;以下为先导入需要的包和展示图片 import time import torch from torch im…

C++ STL容器与常用库函数

STL是提高C编写效率的一个利器 STL容器&#xff1a; 一、#include <vector> 英文翻译&#xff1a;vector &#xff1a;向量 vector是变长数组(动态变化)&#xff0c;支持随机访问&#xff0c;不支持在任意位置O(1)插入。为了保证效率&#xff0c;元素的增删一般应该在末尾…

测开速成考点

用户登录界面需要做哪些测试&#xff1f; ⑴功能&#xff1a;  正确的用户名&#xff0c;正确的密码&#xff0c;点击提交按钮&#xff0c;验证能否正确登录 是否跳转正确页面。  错误的用户名 或 密码&#xff0c;点击提交&#xff0c;提示相应的错误信息。  记住用户名…

JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存

目录 1.HTML模板 2.获取DOM元素和定义变量 3.创建两个canvas元素&#xff0c;并设置它们的宽度和高度 4.绑定触摸事件&#xff1a;touchstart, touchmove, touchend和click 5.实现触摸事件回调函数&#xff1a;startDrawing, draw和stopDrawing 6.实现绘制线段的函数&…