UE4自定义MovementComponent组件
来源:互联网 发布:java大数字处理 编辑:程序博客网 时间:2024/05/20 00:37
自定义Movement组件
目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动。
基类:UMovementComponent
过程:
1.创建UCustomMovementComponenet继承UMovementComponent类,作为各种具体轨迹的父类,完成主要流程的实现。并提供接口给子类override实现具体计算过程。
2.实现子类轨迹计算过程。这里仅提供线性移动轨迹作为示例。
一、UCustomMovementComponent类
- /**
- * class : UCustomMovementComponent
- * author : Jia Zhipeng
- * Base class of custom movement component
- */
- UCLASS(ClassGroup = Movement, abstract, ShowCategories = (CustomMovement))
- class CLIENT_API UCustomMovementComponent : public UMovementComponent
- {
- GENERATED_UCLASS_BODY()
- public:
- /*Initialize target position, must be called before TickComponent.
- **@param bFixedPoint : whether target position is fixed point or target component
- */
- UFUNCTION(BlueprintCallable, Category = CustomMovement)
- virtual void SetTargetPosition(bool bFixedPoint, FVector PointLocation, USceneComponent* MoveTarget=nullptr);
- //Initialize params which will be used during computation, implementation in derived class.
- virtual void InitComputeParams() {};
- //Computation process, must be override in derived class.
- virtual void ComputeMovement(float DeltaTime, FVector& OutMoveDelta, FQuat& OutNewRotation) {};
- //Update process.
- virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;
- //Check whether should be stopped
- void CheckIsStop();
- protected:
- FVector GetTargetPosition();
- FVector GetHostPosition();
- //if bFixedPoint is true, use this location to update.
- FVector PointLocation;
- //The current target we are homing towards. Can only be set at runtime (when projectile is spawned or updating).
- TWeakObjectPtr<USceneComponent> MoveTarget;
- //If true, use fixed point to update location; else, use MoveTarget.
- uint32 bFixedPoint:1;
- //If true, stop TickComponent
- uint32 bStop:1;
- };
- UCustomMovementComponent::UCustomMovementComponent(const FObjectInitializer& ObjectInitializer)
- : Super(ObjectInitializer)
- {
- bStop = false;
- }
- void UCustomMovementComponent::SetTargetPosition(bool bFixedPoint, FVector PointLocation, USceneComponent* MoveTarget)
- {
- bStop = false;
- this->MoveTarget = MoveTarget;
- this->bFixedPoint = bFixedPoint;
- this->PointLocation = PointLocation;
- InitComputeParams();
- }
- void UCustomMovementComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
- {
- //Tick parent method first, in order to know whether UpdatedComponent is null.
- Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
- CheckIsStop();
- if (bStop)
- return;
- FVector OutMoveDelta;
- FQuat OutNewRotation;
- //计算Location和Rotation的变化
- ComputeMovement(DeltaTime, OutMoveDelta, OutNewRotation);
- //更改UpdatedComponent坐标值的调用方法
- MoveUpdatedComponent(OutMoveDelta, OutNewRotation, true); //whether change orientation?
- //UMovementComponent中注释说在更改Velocity变量后需要调用该方法改变UpdatedComponent的Velocity。看源代码后发现应该是其他如物理Body等需要使用该值。
- UpdateComponentVelocity();
- }
- void UCustomMovementComponent::CheckIsStop()
- {
- if (!UpdatedComponent)
- {
- bStop = true;
- return;
- }
- //whether target is exist
- if (!bFixedPoint && MoveTarget == nullptr)
- {
- bStop = true;
- return;
- }
- //reach the target location then stop
- float LocationDifference = (GetTargetPosition() - UpdatedComponent->GetComponentLocation()).Size();
- if (LocationDifference < SMALL_NUMBER)
- {
- bStop = true;
- return;
- }
- }
- FVector UCustomMovementComponent::GetTargetPosition()
- {
- if (bFixedPoint)
- return PointLocation;
- check(MoveTarget != nullptr);
- return MoveTarget->GetComponentLocation();
- }
- FVector UCustomMovementComponent::GetHostPosition()
- {
- check(UpdatedComponent);
- return UpdatedComponent->GetComponentLocation();
- <span <="" td="" style="word-wrap: break-word; margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">
0 0
- [UE4]自定义MovementComponent组件
- UE4自定义MovementComponent组件
- [UE4]逻辑状态机组件
- UE4 连接自定义服务器
- Ue4 4.14自定义角色
- ue4-自定义关卡类
- UE4 自定义Asset
- UE4 连接自定义服务器
- UE4 新建自定义Map
- ue4自定义服务器(转)
- UE4 4.13 创建自定义Button
- UE4 虚拟摇杆自定义设置
- UE4中使用自定义log
- UE4之自定义引擎类
- ue4-Network相关-组件及数据同步
- ue4-UDecalComponent组件,紧贴Mesh的材质
- UE4 C++计时器,创建对象,组件
- 自定义组件
- iOS 获取网络图片的宽高
- libevent 入门教程
- 计算机网络 时延、发送时延、传输时延、处理时延、排队时延、时延带宽积
- Builder(建造者模式)
- 线上应用故障排查之二:高内存占用
- UE4自定义MovementComponent组件
- linux忘记mysql密码
- 一个distinct问题引发的记录
- 傅里叶变换
- Chrome浏览器键盘快捷键
- 关于MPAndroidChart的Line图
- 安卓简单日历的实现
- dataSerVer操作方法总结
- web安全(8)-- 程序缺陷