UDK 角色姿态转换(UnrealScript 控制 AnimTree)

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

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

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

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

ToggleCharacterState_1

多数 ACT、ARPG 等类型游戏都会为角色设计两种或更多的姿态,当角色处于不同的状态时为角色对应不同的姿态。比如通常角色都处于闲置姿态下,但当角色攻击或受到伤害时切入战斗姿态,本文将对如何在 UDK 中实现这样的效果进行介绍。

我自己想了两种方法来实现姿态转换,以下分别介绍:

注:若您对 UnrealScript、AnimNode、AnimTree 等内容感到困扰,建议先阅读并学习 UDN 上的相关主题

使用动画节点切换姿态

个人比较推荐这个方法。用 UnrealScript 控制一个 AnimNodeBlend 节点混合到不同的分支上来实现姿态转换(我使用两个姿态进行的测试,如果有两个以上的姿态可考虑使用 AnimNodeBlendList 节点)
在角色的 AnimTree 中适当位置插入一个 AnimNodeBlend 节点,设置 NodeName,连接两个输入端到对应的节点上。

ToggleCharacterState_3

在您的角色 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;
}

更改动画树切换姿态

通过更改动画树来切换姿态是我一开始使用的方式。这个方法将不同的姿态做成不同的动画树,比如分别制作闲置和攻击两种动画树,然后根据角色的所处状态分配对应的动画树实现姿态切换。

ToggleCharacterState_2

这个方法在使用的时候会有一些问题,由于每次重新赋予角色动画树并没有动画混合的过程,导致角色的一些动作无法平滑的过渡,造成瑕疵。因此不推荐使用。相较于之前的方法,需要调整一下 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 中进行角色姿态转换的方法。这其中或许存在纰漏,或许还有更好的解决方案,希望大家多多指正,多多交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值