学习虚幻C++开发日志——基础案例(持续更新中)

官方文档:虚幻引擎C++编程教程 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community

1.物体上下起伏并旋转

1.1第一种写法

创建一个继承于Actor的类,并为新的Actor命名为FloatingActor,然后点击Create Class

重新加载代码文件

在Games->(用户自定义工程文件名)->Source->FloatingActor.h

在头文件添加代码

cpp 复制代码
public:	
	// 设置构造默认函数
	AFloatingActor();

	UPROPERTY(VisibleAnywhere)
//使用继承于UObject的指针UStaticMeshComponent*
	UStaticMeshComponent* VisualMesh;

在源文件:

cpp 复制代码
//设置默认值
AFloatingActor::AFloatingActor()
{
	//将设置为每帧调用Tick()。如果你不需要它,你可以关闭它来提高性能。
	PrimaryActorTick.bCanEverTick = true;

    //创建Object,可在蓝图details查看
	VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	VisualMesh->SetupAttachment(RootComponent);//根组件
	//根组件另一种写法:RootComponent = VisualMesh;
	
	//不推荐此写法
	//静态网格体Copy Reference:/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'
	static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone"));

    //判断是否初始化成功
	if (CubeVisualAsset.Succeeded())
	{
		VisualMesh->SetStaticMesh(CubeVisualAsset.Object);
		VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
	}
}


void AFloatingActor::BeginPlay()
{
	Super::BeginPlay();
	//注意BeginPlay一定要调用Super::BeginPlay()
}


//调用每一帧
void AFloatingActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

    //初始化
	FVector NewLocation = GetActorLocation();
	FRotator NewRotation = GetActorRotation();
	float RunningTime = GetGameTimeSinceCreation();//得到在世界的时间从创建开始
	float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));  //设置高度变化呈现正弦曲线变化
    float DeltaRotation = DeltaTime * 20.0f;	//Rotate by 20 degrees per second旋转变化	
    
    NewLocation.Z += DeltaHeight * 20.0f;       //高度变化,系数放大20倍
	NewRotation.Yaw += DeltaRotation;

	SetActorLocationAndRotation(NewLocation, NewRotation);
}

思路:在默认构造函数初始化网格体,运用引擎内置函数SetStaticMesh和SetRelativeLocation。在Tick时间函数内先初始化状态信息,并运用数学函数改变状态数值,最后用SetActorLocationAndRotation函数实现Actor位置变化。

1.2第二种写法(初始化网格体)

在上述头文件添加新的代码 :

cpp 复制代码
public:
	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Name")
	UStaticMesh* NewMesh;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "FloatingActor")
	float FloatSpeed = 20.0f;

	UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "FloatingActor")
	float RotationSpeed = 20.0f;	

此写法是运用宏从而在蓝图进行快速修改

从而不需要前一种方法默认构造函数的指定网格体的写法:

cpp 复制代码
	//静态网格体Copy Reference:/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'
	static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone"));

在源文件的BeginPlay()函数处代码:

cpp 复制代码
void AFloatingActor::BeginPlay()
{
	Super::BeginPlay();
	//注意BeginPlay一定要调用Super::BeginPlay()

    //将原默认构造函数的判断放在这里
	if (NewMesh)
	{
		VisualMesh->SetStaticMesh(NewMesh);
		VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
	}
}
相关推荐
todoitbo25 分钟前
基于 DevUI MateChat 搭建前端编程学习智能助手:从痛点到解决方案
前端·学习·ai·状态模式·devui·matechat
Ma0407133 小时前
【机器学习】监督学习、无监督学习、半监督学习、自监督学习、弱监督学习、强化学习
人工智能·学习·机器学习
小熊officer3 小时前
Nginx学习
运维·学习·nginx
秋邱3 小时前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
Three~stone3 小时前
Matlab2025b的安装教程(附安装包和密钥破解文件)
学习·mysql·持续部署
爱学习的大牛1234 小时前
如何系统学习网络渗透测试:从入门到精通的完整指南
网络·学习
落子摘星4 小时前
suricata学习杂记(一)
学习·modbus·suricata·pdu
charlie1145141915 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
white-persist5 小时前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
AI绘画哇哒哒8 小时前
【收藏必看】大模型智能体六大设计模式详解:从ReAct到Agentic RAG,构建可靠AI系统
人工智能·学习·ai·语言模型·程序员·产品经理·转行