第一次提交
This commit is contained in:
50
Source/PHY/Private/Anim/RetargeterAnim.cpp
Normal file
50
Source/PHY/Private/Anim/RetargeterAnim.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
//
|
||||
|
||||
|
||||
#include "RetargeterAnim.h"
|
||||
|
||||
#include "Components/RetargeterComponent.h"
|
||||
#include "Retargeter/IKRetargeter.h"
|
||||
|
||||
void URetargeterAnim::NativeInitializeAnimation()
|
||||
{
|
||||
Super::NativeInitializeAnimation();
|
||||
|
||||
// 尝试从拥有者获取RetargeterComponent
|
||||
if (const AActor* Owner = GetOwningActor())
|
||||
{
|
||||
RetargeterComponent = Owner->FindComponentByClass<URetargeterComponent>();
|
||||
|
||||
if (RetargeterComponent)
|
||||
{
|
||||
// 绑定到retarget改变事件
|
||||
RetargeterComponent->OnRetargetChanged.AddDynamic(this,&URetargeterAnim::OnRetargetChanged);
|
||||
|
||||
// 获取当前的retarget信息
|
||||
CurrentRetargetInfo = RetargeterComponent->GetRetargetInfo_Implementation();
|
||||
OnRetargetChanged(CurrentRetargetInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void URetargeterAnim::BeginDestroy()
|
||||
{
|
||||
// 解绑代理以防止内存泄漏
|
||||
if (RetargeterComponent)
|
||||
{
|
||||
RetargeterComponent->OnRetargetChanged.RemoveDynamic(this, &URetargeterAnim::OnRetargetChanged);
|
||||
RetargeterComponent = nullptr;
|
||||
}
|
||||
|
||||
Super::BeginDestroy();
|
||||
}
|
||||
|
||||
void URetargeterAnim::OnRetargetChanged(const FRetargetInfo& NewRetargetInfo)
|
||||
{
|
||||
CurrentRetargetInfo = NewRetargetInfo;
|
||||
if (!CurrentRetargetInfo.Retargeter.IsNull())
|
||||
{
|
||||
IkRetargeter = CurrentRetargetInfo.Retargeter.LoadSynchronous();
|
||||
}
|
||||
}
|
||||
|
||||
43
Source/PHY/Private/Anim/RetargeterAnim.h
Normal file
43
Source/PHY/Private/Anim/RetargeterAnim.h
Normal file
@@ -0,0 +1,43 @@
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Animation/AnimInstance.h"
|
||||
#include "Gameplay/PHYGameInstance.h"
|
||||
#include "RetargeterAnim.generated.h"
|
||||
|
||||
struct FRetargetProfile;
|
||||
struct FRetargetInfo;
|
||||
|
||||
class URetargeterComponent;
|
||||
|
||||
/**
|
||||
* Retargeter动画实例,用于处理角色网格的IK retarget逻辑
|
||||
*/
|
||||
UCLASS()
|
||||
class PHY_API URetargeterAnim : public UAnimInstance
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
protected:
|
||||
virtual void NativeInitializeAnimation() override;
|
||||
virtual void BeginDestroy() override;
|
||||
|
||||
private:
|
||||
/** 当前的retarget信息 */
|
||||
FRetargetInfo CurrentRetargetInfo;
|
||||
|
||||
/** IK Retargeter实例 */
|
||||
UPROPERTY(BlueprintReadOnly, Category = "PHY|Retargeter", meta = (AllowPrivateAccess = "true"))
|
||||
UIKRetargeter* IkRetargeter;
|
||||
|
||||
/** Retargeter组件的引用 */
|
||||
UPROPERTY()
|
||||
TObjectPtr<URetargeterComponent> RetargeterComponent;
|
||||
|
||||
/** 当retarget信息改变时调用 */
|
||||
UFUNCTION()
|
||||
void OnRetargetChanged(const FRetargetInfo& NewRetargetInfo);
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user