效果
步骤
一、角色接触武器后直接拾取武器
在蓝图中我们可以通过节点让角色接触'BP_Weapon'时将其附加到角色手上,这里我们用 C++ 实现。
此时角色接触武器后,武器就会附加到角色手上。
二、角色接触武器后按 E 键拾取武器
新建一个输入操作,命名为'IA_Equip'。
打开输入映射上下文,添加一个映射。
在'SlashCharacter.h'中首先声明一个输入动作对象的指针'InteractAction',用来关联输入映射中定义的 IA_Equip。然后定义输入响应函数'Interact',当玩家触发 InteractAction 对应的输入时,虚幻引擎会自动调用这个函数。
在'SlashCharacter.cpp'中先不实现函数'Interact'具体逻辑。
通过增强输入组件执行输入动作绑定,把输入动作'InteractAction'和响应函数'Interact'关联起来。
在'BP_SlashCharacter'中设置'Interact Action'为'IA_Equip'。
此时按下 E 键就会执行函数'Interact',因此接下来需要实现函数'Interact'逻辑。逻辑是希望只有角色和 Item(包括武器)发生重叠时,才能被拾取。
首先在'SlashCharacter.h'中定义一个变量'OverlappingItem',用于存储角色拾取的物品。
再定义一个内联函数用于设置变量'OverlappingItem'的值。
在'Item.cpp'中设置物品与角色重叠后,角色可以获取到 Item,结束重叠后角色无法获取到 Item。
在'Weapon'中定义函数'Equip',作用是将武器的网格组件附着到目标父组件的指定插槽上。
回到'SlashCharacter.cpp',具体实现'Interact'函数如下,如果拾取的物品可以转换为武器类,就把武器附加到角色的手上。
此时运行游戏可以看到角色在未接触 Item 时,'OverlappingItem'为空。接触到 Item 后,'OverlappingItem'就有值了。当角色再次离开 Item 范围,'OverlappingItem'会再次为空。
当角色接触到 Item 条件下,并且 Item 是一个武器,此时按下 E 键就可以将武器拿在手中。
三、站立姿态切换到持剑站立姿态
如果要实现姿态的切换,就需要在动画蓝图中获取到此时角色是否处于持剑状态。因此我们需要在'SlashCharacter'中添加这种状态。首先新建一个头文件,命名为'CharacterTypes.h'。
在'CharacterTypes.h'中定义一个枚举类 ECharacterState。
在 ASlashCharacter 类中定义一个'ECharacterState'类型的变量'CharacterState',用于在角色中记录它当前的装备状态,默认为未装备武器状态。
再定义一个内联函数来获取这个'CharacterState'的值。
当角色按 E 拾取武器后,修改变量'CharacterState'的值。
在'SlashAnimInstance.h'中也定义一个'CharacterState'。
逐帧获取角色类中的状态变量来更新动画实例中的状态变量。
打开动画蓝图'ABP_SlashCharacter',根据变量'CharacterState'来切换播放不同的动画序列。'Blend Poses'节点可以根据枚举的不同来输出不同的动作姿态,其中'Blend Time'表示姿势切换时过渡所用的时间。
此时就可以根据'CharacterState'来决定使用哪一种站立姿势。
四、跑步姿态切换到持剑跑步姿态
在 Mixamo 中下载持剑跑步的动画资源,导入 UE。
打开 IK 重定向器'RTG_XBot',将持剑跑步动画重定向到角色 Echo 上。
在动画蓝图中,根据变量'Character State'来输出不同的持剑跑步姿势。注意设置新动画循环播放。
此时效果如文章开头所示。
代码
// Weapon.h
#pragma once
#include
()
AWeapon : AItem {
()
:
;
:
;
;
};


