使Actor运动
2024年1月7日 2024年1月11日
三种运动类型
枚举 | 实现 | |
---|---|---|
静止 | Static | |
Z方向上正弦运动 | Sin | 修改Z坐标 |
绕Z轴旋转 | Rotate | 修改Yaw |
创建枚举类
EMoveType
1UENUM(BlueprintType) 2enum class EMoveType : uint8 3{ 4 Static, 5 Sin, 6 Rotate 7};
在蓝图编辑器中可使用该类型
创建结构体
FMoveSetting
存放运动类型和相关参数
- | |
---|---|
Amplitude | 正弦运动振幅; 旋转步长 |
Frequency | 正弦运动频率 |
MoveType | 运动类型 |
InitialTransform | 起点 |
1USTRUCT(BlueprintType) 2struct FMoveSetting 3{ 4 GENERATED_USTRUCT_BODY() 5 6 UPROPERTY(VisibleDefaultOnly, Category = "MoveSetting") 7 float Amplitude = 50.0f; 8 9 UPROPERTY(VisibleDefaultOnly, Category = "MoveSetting") 10 float Frequency = 2.0f; 11 12 UPROPERTY(VisibleInstanceOnly, Category = "MoveSetting") 13 EMoveType MoveType = EMoveType::Static; 14 15 FTransform InitialTransform; 16};
在蓝图编辑器中可使用该类型
添加并配置运动参数
- 添加运动参数
添加数据成员
protected
1UPROPERTY(VisibleAnywhere) 2FMoveSetting MoveSetting;
- 配置运动参数
-
在实例的细节面板中查看
-
在原型的细节面板中查看
-
结构体成员的访问说明符受到数据成员的访问说明符的限制,数据成员的访问说明符宜大不宜小
实现Actor运动
添加接口
- | |
---|---|
InitMoveSetting | 初始化运动参数 |
MoveInForce | 在Tick函数中调用; 每秒更新Actor位置 |
private
1void InitMoveSetting(); 2void MoveInForce();
保存Actor初始变换
用来计算相对变换
- | |
---|---|
AActor::GetActorTransform | 获取Actor变换信息 |
1MoveSetting.InitialTransform = GetActorTransform();
计算相对变换
获取程序运行时长
用来计算相对变换
- | |
---|---|
AActor::GetWorld | |
UWorld::GetTimeSeconds | 获取程序运行时长 |
1if (GetWorld()) 2{ 3 float Time = GetWorld()->GetTimeSeconds(); 4}
Z方向上正弦运动
-
从初始变换提取位置信息
- FTransForm::GetLocation 从变换信息中提取位置信息 1FVector InitialLocation = MoveSetting.InitialTransform.GetLocation();
-
获取Actor对象当前位置信息
- AActor::GetActorLocation 获取Actor当前位置信息 1FVector CurrentLocation = GetActorLocation();
-
计算Z方向位移
1CurrentLocation.Z = InitialLocation.Z + MoveSetting.Amplitude * FMath::Sin(MoveSetting.Frequency * Time);
-
更新位置信息
- AActor::SetActorLocation 设置Actor位置信息 1SetActorLocation(CurrentLocation);
绕Z轴旋转
-
从初始变换提取旋转分量
- FTransForm::Rotator 从变换信息提取旋转分量 1FRotator InitRotation = MoveSetting.InitialTransform.Rotator();
-
获取Actor对象当前旋转信息
- AActor::GetActorRotation 获取Actor对象当前旋转信息 1FRotator CurrentRotation = GetActorRotation();
-
计算相对旋转
1CurrentRotation.Yaw = (InitRotation.Yaw + Time * MoveSetting.Amplitude);
-
更新旋转信息
- AActor::SetActorRotation 设置Actor旋转 1SetActorRotation(CurrentRotation);