转眼之间已经到了毕业实习的阶段 , 明明是计划之中的事情 , 却越发觉得它来得突然 . 时间留下过去 , 走在当下 , 奔向未来 … 从不让人有丝毫喘息的机会 .

在学院的几年来 , 一直在变的世界一如既往的变幻 , 一直在变的人也从没停下脚步 . 而我 , 虽然想守护一些东西不去改变 , 也想尽力去改变一些东西 , 但大多事与愿违 . 守护着自己的信念 , 追求理想却又要迎合 … 迎合已知的 , 未知的 , 迎合人事物 , 迎合不想迎合的 …

不过幸好 , 越难得到的东西价值越高 . 从这个层面上来说或许最重要的已经不是结果 . 因为有要守护的东西 , 有自己想做的事情 , 需要付出巨大努力才能实现的目标 . 这是一路走来的见证 , 是活下去的意义 .

请放心 , 您的打开方式完全正确 , 以上异常怪异的文字只是我临时的有感而发 , 干扰到您的正常阅读 , 非常抱歉 . 正文见下 :

多数 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 中进行角色姿态转换的方法。这其中或许存在纰漏,或许还有更好的解决方案,希望大家多多指正,多多交流。