创建首个代码项目,并添加新的C++类.
创建 Actor 子类
Actor 是可在场景中放置的最基本对象类型. 创建Actor 子类, 命名为 FloatingActor
添加组件
添加静态网络组件, 以使该 Actor 在场景中可见. 这里首先声明了静态网络组件的成员变量:
// 声明静态网络组件
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* VisualMesh;
UPROPERTY(VisibleAnywhere) 宏定义使得我们可以在编辑器中可以看到该组件.
在构造函数中初始化组件
FloatingActor 类的默认构造函数中:
// 创建静态网络组件并将其设为 FloatingActor 的根组件
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));
}
上述代码首先通过CreateDefaultSubobject创建静态网络组件, 并把该组件作为我们这个 FloatingActor 类的根组件, 因为 UStaticMeshComponent 组件继承自 UPrimitiveComponent(基元组件, 是拥有几何表示的场景组件), 而场景组件具有位置行为, 所以当把该静态网络组件设为根组件时, 其位置信息就代表了我们的 FloatingActor 类的位置信息.
接下来是使用 FObjectFinder 函数来查找资源目录下的 Shape_Cube (方块模型), 如果找到, 我们就把它绑定到我们的静态网络组件, 并设置静态网络组件的初始位置信息为 (0, 0, 0), 该过程也可以使用编辑器来完成, 编译后, 拖入场景中会对该类进行实例化, 从而调用该构造函数, 因为创建静态网络组件和绑定到根组件的代码已经执行完成, 这时在细节栏里可以看到该静态网络组件的相关设置, 其中就有设置其绑定的资源.
在 Tick 函数中控制行为
// 获取位置信息和旋转信息
FVector NewLocation = GetActorLocation();
FRotator NewRotation = GetActorRotation();
// 获取游戏运行时间
float RunningTime = GetGameTimeSinceCreation();
// 计算Δt内高度变化值 Δh = sin(t + Δt) - sin(t)
float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
NewLocation.Z += DeltaHeight * 20.0f;
// 计算Δt内角度变化值
float DeltaRotation = DeltaTime * 20.0f;
NewRotation.Yaw += DeltaRotation;
// 将位置信息和旋转信息同步到我们的 FloatingActor
SetActorLocationAndRotation(NewLocation, NewRotation);
Tick 函数在每一帧画面刷新时都会调用, 并传递两帧之间的时间差 Δt 参数, 我们利用该参数计算 FloatingActor 的位置信息和旋转信息应该如何变化. 上述代码实现了 FloatingActor 的上下浮动并顺时针旋转.
网友评论