第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View 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();
}
}

View 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);
};