蓝图继承 C++ 类

在上一篇文章 《实现移动立方体》 中,我们使用编写的 C++ 类,并添加立方体组件,实现了移动的立方体。

我们之前学习过蓝图的操作。为了使这个 C++ 类,利用上蓝图可视化方便的优点,我们可以让蓝图类继承这个 C++ 类。

我们在“内容侧滑菜单”的“C++类”目录下,找到我们的 C++ 类。然后右击,选择 创建基于 ... 的蓝图类

创建好蓝图类之后,会显示如图 1 所示,我们熟悉的蓝图类视口。我们可以在此视口里,使用现有的 Mesh 素材,创建想要的组件。此处,我们用多个墙壁制作了一个类似石柱的物体。并且在细节窗体中,把移动方向参数设置为上下移动。

细节窗体中,如果有参数信息和代码不同步,则需要关闭 UE 编辑器,用 VS 再编译一下项目。

图1 蓝图

我们想实现石柱上下移动的功能。原先我们实现的移动逻辑是,以当前位置为中间点,两边范围移动。但是现在物体的默认坐标点,在物体顶部边缘。按照现在的逻辑,石柱会缩到地底下。

尝试修改枢轴位置,也未解决,留作问题。

为此,如代码清单 1 所示,对目前的移动逻辑进行了修改。移动逻辑修改为,从起点到移动向量方向上指定的距离。即变成单侧往返移动,而不是两侧。

代码清单 1 移动逻辑
  1. void AMovingPlatform::HandleMovementBetweenStartAndEnd(float DeltaTime)
  2. {
  3.     FVector CurrentLocation = GetActorLocation();
  4.     FVector ProposedNewLocation = CurrentLocation + (_CurrentVelocity * DeltaTime);
  5.  
  6.     FVector EndPoint = FVector::DotProduct(_CurrentVelocity, MovementVelocity) > 0
  7.         ? _StartPosition + MovementVelocity.GetSafeNormal() * MaxTravelDistance
  8.         : _StartPosition;
  9.  
  10.     if (FVector::DotProduct(CurrentLocation - EndPoint, _CurrentVelocity) < 0)
  11.         SetActorLocation(ProposedNewLocation);
  12.     else
  13.     {
  14.         float Overshoot = FVector::Dist(CurrentLocation, EndPoint);
  15.  
  16.         FVector NewLocation = EndPoint - _CurrentVelocity.GetSafeNormal() * Overshoot;
  17.  
  18.         _CurrentVelocity *= -1;
  19.  
  20.         SetActorLocation(NewLocation);
  21.     }
  22. }

最终实现的效果如下视频所示。