UE4 使用Animation Data Modifiers修改动画片段

文章介绍了如何利用UE动画蓝图的AnimationDataModifiers来精确修改动画片段,特别是通过创建自定义Blueprint继承AnimationModifier并实现OnApply方法,例如移除pelvis骨骼的动画信息,以避免录制功能的不精准问题。在实际操作中需要注意IncludeChildren选项的设置,以防止影响子骨骼。

UE动画蓝图有录制功能,遇到需要修改动画片段的问题时,通过录制未免得到的数据太不精准。而用AnimationDataModifiers也可以处理动画数据。

1.新建蓝图,继承AnimationModifier

在这里插入图片描述

2.实现On Apply方法,这个方法为应用Modifier时,触发的内容逻辑

测试蓝图的逻辑是移除pelvis骨骼的动画信息,Include Children记住不要勾选,否则会执行到子骨骼。
在这里插入图片描述

3.打开需要修改的动画,选择Animation Data Modifiers:

在这里插入图片描述

4.应用Modifier

在这里插入图片描述

UE5 GAS(游戏玩法能力系统)开发RPG游戏时,使用GameplayEffect修改角色属性可按以下步骤操作: ### 1. 定义属性集 首先需要定义一个继承自`UAttributeSet`的类,在这个类中声明角色的属性。例如: ```cpp // .h文件 #include "AttributeSet.h" #include "MyAttributeSet.generated.h" UCLASS() class MYRPG_API UMyAttributeSet : public UAttributeSet { GENERATED_BODY() public: UMyAttributeSet(); UPROPERTY(BlueprintReadOnly, Category = "Attributes", ReplicatedUsing = OnRep_Health) FGameplayAttributeData Health; ATTRIBUTE_ACCESSORS(UMyAttributeSet, Health) protected: UFUNCTION() virtual void OnRep_Health(const FGameplayAttributeData& OldHealth); }; // .cpp文件 #include "MyAttributeSet.h" UMyAttributeSet::UMyAttributeSet() { // 初始化属性值 Health.SetBaseValue(100.f); Health.SetCurrentValue(100.f); } void UMyAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) { GAMEPLAYATTRIBUTE_REPNOTIFY(UMyAttributeSet, Health, OldHealth); } ``` ### 2. 创建GameplayEffect 在UE编辑器中创建一个新的`GameplayEffect`资产。在`GameplayEffect`的配置中,可以设置属性修改的规则。例如,要修改角色的生命值属性,可以进行如下设置: - **Duration Policy**:选择属性修改的持续策略,如`Instant`(立即生效)、`HasDuration`(持续一段时间)等。 - **Modifiers**:添加属性修改器,指定要修改的属性(如`Health`)、修改方式(如`Add`、`Multiply`等)和修改值。 ### 3. 应用GameplayEffect 在代码中应用`GameplayEffect`到角色上,可通过`AbilitySystemComponent`来完成。示例代码如下: ```cpp #include "AbilitySystemComponent.h" #include "MyAttributeSet.h" #include "GameplayEffect.h" void AMyCharacter::ApplyHealthChange(float DeltaHealth) { UAbilitySystemComponent* ASC = GetAbilitySystemComponent(); if (ASC) { // 加载GameplayEffect资产 TSubclassOf<UGameplayEffect> HealthChangeEffectClass = LoadClass<UGameplayEffect>(nullptr, TEXT("/Game/Blueprints/GE_HealthChange.GE_HealthChange")); if (HealthChangeEffectClass) { // 创建GameplayEffectSpec FGameplayEffectSpecHandle EffectSpecHandle = ASC->MakeOutgoingSpec(HealthChangeEffectClass, 1.f, ASC->MakeEffectContext()); if (EffectSpecHandle.IsValid()) { // 设置属性修改值 EffectSpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Data.HealthChange")), DeltaHealth); // 应用GameplayEffect FActiveGameplayEffectHandle ActiveGEHandle = ASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get()); } } } } ``` ### 4. 处理属性修改通知 在属性集类中,可以重写属性复制通知函数,处理属性修改后的逻辑。例如: ```cpp void UMyAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) { GAMEPLAYATTRIBUTE_REPNOTIFY(UMyAttributeSet, Health, OldHealth); // 处理生命值变化逻辑,如更新UI等 AMyCharacter* OwningCharacter = Cast<AMyCharacter>(GetOwningActor()); if (OwningCharacter) { OwningCharacter->OnHealthChanged(Health.GetCurrentValue(), OldHealth.GetCurrentValue()); } } ``` ### 5. 蓝图实现 除了代码实现,也可以在蓝图中完成上述操作。在蓝图中可以通过`Ability System Component`节点来应用`GameplayEffect`,并处理属性修改事件。 通过以上步骤,就可以在UE5 GAS开发的RPG游戏中使用`GameplayEffect`修改角色属性。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值