[toc]
从 C++ 入手
计划学习路径参考 UE 官方文档: https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPProgrammingQuickStart/
# 新建一个 Actor
# 什么是 Actor
类似于 Unity 中的 GameObject, 即万物基类 (暂时这么理解,后面有变动再改)
# 创建一个 C++ Actor
在 UE5 中,面板有变动.UE4 中需要通过文件创建一个新的 C 类,但是 UE5 中的路径变更为了:工具 -> 新建 C 类 之后选择 C++ 的基类为 Actor
然后创建出来自己想要的类 (这里命名为 FloatingActor)
# 编辑 FloatingActor
这个文件的路径是在 Games/[你的项目名称]/Source/[你的项目名称]/FloatingActor.cpp/h
和 C++ 同理,.h 中通常存放一些暴露相关的接口和对象 这里我们在 AFloatingActor (); 下面声明一个可视化的 Mesh 和可显示在任意地方的宏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "FloatingActor.generated.h" UCLASS ()class DEMO_API AFloatingActor : public AActor{ GENERATED_BODY () public : AFloatingActor (); UPROPERTY (VisibleAnywhere) UStaticMeshComponent* VisualMesh; protected : virtual void BeginPlay () override ; public : virtual void Tick (float DeltaTime) override ; };
# 构造函数
在 FloatingActor.cpp 中有一个初始化函数, AFloatingActor()
这个函数可以作为构造函数来使用 我们在其中为 VisualMesh 赋值一个新的 Mesh 对象.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 AFloatingActor::AFloatingActor () { PrimaryActorTick.bCanEverTick = true ; VisualMesh = CreateDefaultSubobject <UStaticMeshComponent>(TEXT ("Mesh" )); VisualMesh->SetupAttachment (RootComponent); static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset (TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube" )) ; if (CubeVisualAsset.Succeeded ()) { VisualMesh->SetStaticMesh (CubeVisualAsset.Object); VisualMesh->SetRelativeLocation (FVector (0.0f , 0.0f , 0.0f )); } }
其中, RootComponnet
是全局根对象,然后创建一个资源读取的 Asset (暂时这么理解), 如果读取成功了,则将 mesh 的信息和位置都初始化一下.
# BeginPlay
类似于 Unity 的 Start
# Tick
每帧执行的函数,类似于 Update 在这个函数里,我们让当前这个对象不断地旋转和浮动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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)); NewLocation.Z += DeltaHeight * 20.0f ; float DeltaRotation = DeltaTime * 20.0f ; NewRotation.Yaw += DeltaRotation; SetActorLocationAndRotation (NewLocation,NewRotation); }
# 编译 FloatingActor
当我们编写完这个对象后,需要编译一下 Games 下的项目,这样才能让这个对象在编辑器中可以供我们操作
# 查看内容库
类似于 Unity 中的 Project, 即所有资源的库存,包括我们刚才制作的 FloatingActor. 这里可以设置停靠在布局中
# 实例化 FloatingActor
将内容库中的 Actor 拖入到场景中即可
# 结果