• 02UEc++【打飞艇:无人机运动】


    项目设置里创建三个动作:上下,前后,旋转

    2.在头文件里,添加两个public的变量

    1. //向上加速度
    2. UPROPERTY(EditAnywhere , BlueprintReadWrite , Category = "init")
    3. float LiftAcc = 100.0f;
    4. //最大向上推力
    5. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "init")
    6. float LiftThrustMax = 2000.0f;

     3.三个输入相关的函数

    1. private:
    2. UFUNCTION()
    3. void Lift( float val);
    4. UFUNCTION()
    5. void Forward(float val);
    6. UFUNCTION()
    7. void Turn(float val);

    4.进入无人机的源文件

    引入头文件

    1. #include "Kismet/KismetMathLibrary.h"
    2. #include "Kismet/KismetSystemLibrary.h"

    5.在void ADrone::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)函数中进行绑定,输入函数

    1. PlayerInputComponent->BindAxis(TEXT("Lift"), this, &ADrone::Lift);
    2. PlayerInputComponent->BindAxis(TEXT("Forward"), this, &ADrone::Forward);
    3. PlayerInputComponent->BindAxis(TEXT("Turn"), this, &ADrone::Turn);

    6.定义list函数

    1. void ADrone:: Lift(float val)
    2. {
    3. //推进力变化
    4. UpThruster->ThrustStrength += val * LiftAcc * GetWorld()->DeltaTimeSeconds;
    5. //限制推进力变化
    6. UpThruster->ThrustStrength = FMath::Clamp(UpThruster->ThrustStrength, -LiftThrustMax, LiftThrustMax);
    7. //打印推进力
    8. FString::SanitizeFloat(UpThruster->ThrustStrength);
    9. UKismetSystemLibrary::PrintString(this,FString::SanitizeFloat(UpThruster->ThrustStrength));
    10. }

    7.添加向前的加速度,和最大力量

    1. //向前加速度
    2. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "init")
    3. float ForwardAcc = 1000.0f;
    4. //最大向前推力
    5. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "init")
    6. float ForwardThrustMax = 2000.0f;

     8.在源文件中定义向前函数

    1. void ADrone::Forward(float val)
    2. {
    3. //推进力变化
    4. ForwardThruster->ThrustStrength += val * LiftAcc * GetWorld()->DeltaTimeSeconds;
    5. //限制推进力变化
    6. ForwardThruster->ThrustStrength = FMath::Clamp(ForwardThruster->ThrustStrength, -ForwardThrustMax, ForwardThrustMax);
    7. }

    9.头文件添加一个转向力

    1. //转向力
    2. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "init")
    3. float TurnThrust = 5000.0f;

    10.定义转向函数

    1. void ADrone::Turn(float val)
    2. {
    3. OutCollision->AddTorqueInDegrees(this->GetActorUpVector() * val * TurnThrust);
    4. }

     11.当我们松开键盘,推进力应该恢复初始状态,这个功能在每帧函数里实现

    1. if (InputComponent->GetAxisValue(TEXT("Lift")) == 0.0f)
    2. {
    3. UpThruster->ThrustStrength = 980.0f;
    4. }
    5. if (InputComponent->GetAxisValue(TEXT("Forward")) == 0.0f)
    6. {
    7. ForwardThruster->ThrustStrength = 0.0f;
    8. }

    12.点击场景中的无人机,进行设置操作权限

    13.添加弹簧臂和相机 ,更容易观察

    14.设置臂长

    15.再添加两个输入

    16.接下来用蓝图实现弹簧臂的摇动

       17.设置弹簧臂

     18.测试成功。

     ==========================================

    让螺旋桨动起来

    1.添加一个数组容器和一个函数,权限是private

    1. private:
    2. //TArray 是虚幻引擎中最常用的容器类。
    3. TArray paddles;
    4. void RotatePaddle(float Delta);

    2.在构造函数中将四个螺旋桨的指针存入容器

    1. //将螺旋桨放入容器
    2. paddles.Add(Paddle1);
    3. paddles.Add(Paddle2);
    4. paddles.Add(Paddle3);
    5. paddles.Add(Paddle4);

    3.添加一个螺旋桨旋转速度变量,public权限

    1. //螺旋桨旋转速度
    2. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "init")
    3. float PaddleRotateSpeed = 1500.0f;

    4.定义RotatePaddle函数

    1. void ADrone::RotatePaddle(float Delta)
    2. {
    3. for (auto Paddle : paddles)
    4. {
    5. Paddle->AddRelativeRotation(FRotator(.0f, Delta*PaddleRotateSpeed, .0f));
    6. }
    7. }

    5.在每帧函数里调用这个函数

    RotatePaddle(DeltaTime);

    ==================================

    前进和后退时,设置机身倾斜

    1.在Forward函数里面,得到机身实时的前倾角度值,如果倾斜度小于30,就允许倾斜

    1. //获得机身实时前倾角度
    2. float pitch = Mesh->GetRelativeRotation().Pitch;
    3. //如果倾斜度小于30,就允许倾斜
    4. if (FMath::Abs(pitch) < 30.0f)
    5. {
    6. Mesh->AddRelativeRotation(FRotator(100.0f * GetWorld()->DeltaTimeSeconds * val, .0f, .0f));
    7. }

    2.在每帧函数里,当不向前(向后)的时候,从倾斜状态恢复水平状态

    1. void ADrone::Tick(float DeltaTime)
    2. {
    3. Super::Tick(DeltaTime);
    4. if (InputComponent->GetAxisValue(TEXT("Lift")) == 0.0f)
    5. {
    6. UpThruster->ThrustStrength = 980.0f;
    7. }
    8. if (InputComponent->GetAxisValue(TEXT("Forward")) == 0.0f)
    9. {
    10. //推力清零
    11. ForwardThruster->ThrustStrength = 0.0f;
    12. //检测倾斜状态
    13. if (Mesh->GetRelativeRotation().Pitch != 0.0f)
    14. {
    15. //此时的倾斜量
    16. float CurrentPitch = Mesh->GetRelativeRotation().Pitch;
    17. FString::SanitizeFloat(CurrentPitch);
    18. UKismetSystemLibrary::PrintString(this, FString::SanitizeFloat(CurrentPitch));
    19. //向反方向进行倾斜
    20. Mesh->AddRelativeRotation(FRotator(-CurrentPitch * DeltaTime, .0f, .0f));
    21. //避免机身抖动
    22. if (FMath::Abs(Mesh->GetRelativeRotation().Pitch) <= KINDA_SMALL_NUMBER)
    23. {
    24. Mesh->SetRelativeRotation(FRotator(.0f, .0f, .0f));
    25. }
    26. }
    27. }
    28. //旋转螺旋桨
    29. RotatePaddle(DeltaTime);
    30. }

  • 相关阅读:
    悟了!阿里p9专家强推的《java虚拟机并发编程》后悔没早看到!
    githubssh配置
    Python中zip函数的使用方法
    No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集&代码 下载)
    Kubernetes的原理及应用详解(一)
    9.图片分类数据集
    压缩包里的文件名可以这样隐藏起来
    搭建自己的脚手架
    qt学习之旅--QToolBar的使用(一)
    餐饮行业数字化营销方案 | 如何用优质内容驱动营收、口碑双增长
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/126805580