转眼之间已经到了毕业实习的阶段,明明是计划之中的事情,却越发觉得它来得突然。时间留下过去,走在当下,奔向未来…从不让人有丝毫喘息的机会。
在学院的几年来,一直在变的世界一如既往的变幻,一直在变的人也从没停下脚步。而我,虽然想守护一些东西不去改变,也想尽力去改变一些东西,但大多事与愿违。守护着自己的信念、追求、理想却又要迎合…迎合已知的、未知的、迎合人事物、迎合不想迎合的…
不过幸好,越难得到的东西价值越高。从这个层面上来说或许最重要的已经不是结果。因为有要守护的东西、有自己想做的事情、需要付出巨大努力才能实现的目标。这是一路走来的见证、是活下去的意义。
请放心,您的打开方式完全正确,以上异常怪异的文字只是我临时的有感而发,干扰到您的正常阅读,非常抱歉。正文见下:
多数 ACT、ARPG 等类型游戏都会为角色设计两种或更多的姿态,当角色处于不同的状态时为角色对应不同的姿态。比如通常角色都处于闲置姿态下,但当角色攻击或受到伤害时切入战斗姿态,本文将对如何在 UDK 中实现这样的效果进行介绍。
我自己想了两种方法来实现姿态转换,以下分别介绍:
注:若您对 UnrealScript、AnimNode、AnimTree 等内容感到困扰,建议先阅读并学习 UDN 上的相关主题
使用动画节点切换姿态
个人比较推荐这个方法。用 UnrealScript 控制一个 AnimNodeBlend 节点混合到不同的分支上来实现姿态转换(我使用两个姿态进行的测试,如果有两个以上的姿态可考虑使用 AnimNodeBlendList 节点)
在角色的 AnimTree 中适当位置插入一个 AnimNodeBlend 节点,设置 NodeName,连接两个输入端到对应的节点上。
在您的角色 Pawn 类中声明该节点,查找并赋给变量:
// AttackOrIdleBlend 是我设置的 NodeName,您可任意更改 Var AnimNodeBlend AttackOrIdleBlend; //初始化动画树 simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp) { //FindAnimNode 是一个函数,可用于查找动画节点 AttackOrIdleBlend = AnimNodeBlend(SkelComp.FindAnimNode('AttackOrIdleBlend')); }
接下来是重点。我用一个变量来标记目前角色的姿态,调用 Tick 事件根据这个变量的值负责即时对角色做出相应的更改(包括变更武器放置的位置和控制 AnimNodeBlend 节点的混合目标):
// bIsATK 是我设置的变量名,这个变量用于标记角色处于什么姿态 Var bool bIsATK; //每帧执行事件 simulated event Tick(float DeltaTime) { if (bIsATK == True) { if (AttackOrIdleBlend.Child2Weight > 0.5f) //使用 0.5f 进行划分 { Mesh.AttachComponentToSocket(None,'BackWepon'); //清除背后的武器 Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'WeaponPoint'); //附加武器到角色手上 AttackOrIdleBlend.SetBlendTarget(0.0f,0.2f); } } else if (bIsATK == False) { if (AttackOrIdleBlend.Child2Weight < 0.5f) { Mesh.AttachComponentToSocket(None,'WeaponPoint'); //清除手上的武器 Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'BackWeapon'); //附加武器到角色背部 AttackOrIdleBlend.SetBlendTarget(1.0f,0.3f); } } }
此时可以写一个执行函数来进行调试,绑定到按键还可供玩家使用:
//执行函数 ToggleAttackState(若攻击则闲置,若闲置则攻击)
exec function ToggleAttackState()
{
if (bIsATK == True)
{
bIsATK = False;
}
else if (bIsATK == False)
{
bIsATK = True;
}
更改动画树切换姿态
通过更改动画树来切换姿态是我一开始使用的方式。这个方法将不同的姿态做成不同的动画树,比如分别制作闲置和攻击两种动画树,然后根据角色的所处状态分配对应的动画树实现姿态切换。
这个方法在使用的时候会有一些问题,由于每次重新赋予角色动画树并没有动画混合的过程,导致角色的一些动作无法平滑的过渡,造成瑕疵。因此不推荐使用。相较于之前的方法,需要调整一下 Tick 部分的代码:
simulated event Tick(float DeltaTime) //每帧执行事件 { if (bIsATK == True) { if (BodySkeletalMesh.AnimTreeTemplate != AnimTree'BSA_People.BodyAnimTree.ATK_BladeMaster_Kun_AnimTree') { Mesh.AttachComponentToSocket(None,'BackWepon'); //清除背后的武器 Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'WeaponPoint'); //附加武器到角色手上 BodySkeletalMesh.AnimTreeTemplate = AnimTree'BSA_People.BodyAnimTree.ATK_BladeMaster_Kun_AnimTree'; } } else if (bIsATK == False) { if (bodySkeletalMesh.AnimTreeTemplate != AnimTree'BSA_People.BodyAnimTree.Idle_ATK_BladeMaster_Kun_AnimTree') { Mesh.AttachComponentToSocket(None,'WeaponPoint'); //清除手上的武器 Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'BackWeapon'); //附加武器到角色背部 bodySkeletalMesh.AnimTreeTemplate = AnimTree'BSA_People.BodyAnimTree.Idle_ATK_BladeMaster_Kun_AnimTree'; } } }
以上就是两种在 UDK 中进行角色姿态转换的方法。这其中或许存在纰漏,或许还有更好的解决方案,希望大家多多指正,多多交流。