六一的部落格


关关难过关关过,前路漫漫亦灿灿。



三种运动类型

枚举 实现
静止 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};

在蓝图编辑器中可使用该类型



添加并配置运动参数

  1. 添加运动参数

    添加数据成员

    protected
    1UPROPERTY(VisibleAnywhere)
    2FMoveSetting MoveSetting;
  2. 配置运动参数
    • 在实例的细节面板中查看


    • 在原型的细节面板中查看


结构体成员的访问说明符受到数据成员的访问说明符的限制,数据成员的访问说明符宜大不宜小


实现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方向上正弦运动

  1. 从初始变换提取位置信息

    -
    FTransForm::GetLocation 从变换信息中提取位置信息
    1FVector InitialLocation = MoveSetting.InitialTransform.GetLocation();
  2. 获取Actor对象当前位置信息

    -
    AActor::GetActorLocation 获取Actor当前位置信息
    1FVector CurrentLocation = GetActorLocation();
  3. 计算Z方向位移

    1CurrentLocation.Z = InitialLocation.Z + MoveSetting.Amplitude * FMath::Sin(MoveSetting.Frequency * Time);
  4. 更新位置信息

    -
    AActor::SetActorLocation 设置Actor位置信息
    1SetActorLocation(CurrentLocation);

绕Z轴旋转

  1. 从初始变换提取旋转分量

    -
    FTransForm::Rotator 从变换信息提取旋转分量
    1FRotator InitRotation = MoveSetting.InitialTransform.Rotator();
  2. 获取Actor对象当前旋转信息

    -
    AActor::GetActorRotation 获取Actor对象当前旋转信息
    1FRotator CurrentRotation = GetActorRotation();
  3. 计算相对旋转

    1CurrentRotation.Yaw = (InitRotation.Yaw + Time * MoveSetting.Amplitude);
  4. 更新旋转信息

    -
    AActor::SetActorRotation 设置Actor旋转
    1SetActorRotation(CurrentRotation);

使Actor运动


三种运动类型

枚举 实现
静止 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};

在蓝图编辑器中可使用该类型



添加并配置运动参数

  1. 添加运动参数

    添加数据成员

    protected
    1UPROPERTY(VisibleAnywhere)
    2FMoveSetting MoveSetting;
  2. 配置运动参数
    • 在实例的细节面板中查看


    • 在原型的细节面板中查看


结构体成员的访问说明符受到数据成员的访问说明符的限制,数据成员的访问说明符宜大不宜小


实现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方向上正弦运动

  1. 从初始变换提取位置信息

    -
    FTransForm::GetLocation 从变换信息中提取位置信息
    1FVector InitialLocation = MoveSetting.InitialTransform.GetLocation();
  2. 获取Actor对象当前位置信息

    -
    AActor::GetActorLocation 获取Actor当前位置信息
    1FVector CurrentLocation = GetActorLocation();
  3. 计算Z方向位移

    1CurrentLocation.Z = InitialLocation.Z + MoveSetting.Amplitude * FMath::Sin(MoveSetting.Frequency * Time);
  4. 更新位置信息

    -
    AActor::SetActorLocation 设置Actor位置信息
    1SetActorLocation(CurrentLocation);

绕Z轴旋转

  1. 从初始变换提取旋转分量

    -
    FTransForm::Rotator 从变换信息提取旋转分量
    1FRotator InitRotation = MoveSetting.InitialTransform.Rotator();
  2. 获取Actor对象当前旋转信息

    -
    AActor::GetActorRotation 获取Actor对象当前旋转信息
    1FRotator CurrentRotation = GetActorRotation();
  3. 计算相对旋转

    1CurrentRotation.Yaw = (InitRotation.Yaw + Time * MoveSetting.Amplitude);
  4. 更新旋转信息

    -
    AActor::SetActorRotation 设置Actor旋转
    1SetActorRotation(CurrentRotation);