在之前的 一篇文章 ( 请先阅读 ) 中我曾讲过如何在 UDK 中实现角色姿态转换,不过今天将会使用一种更为有效的方法来完善这个效果,通过 UnrealScript States (状态) 来改进姿态抓换的代码和流程。

通过 “状态” 可以使复杂的行为便于管理,同时也增强了代码的易读性,UnrealScript 在编程语言的层次上支持状态。有关 “状态” 的具体介绍请参阅 《UDN : UnrealScript 状态》

本文将使用两个状态:分别是 闲置(Idle) 和 战斗(Attack) ,当玩家进入游戏时,默认会将角色置于 闲置(Idle) 状态下,当玩家发起攻击行为时将转换状态为 战斗(Attack) 。以下为代码:

再次警示:本站如无特殊说明,给出的代码均不是完整的、可以直接编译运行的代码。通常这些代码仅包含与文章主题相关的部分,您需要调整和补充才能使代码正确运作。

//闲置状态,这里使用 auto 关键字表示初始化时置于此状态 
Auto State Idle {
// inIdleState 函数的作用是将指定的动画混合节点混向 Idle分支
function inIdleState() {
if (AttackOrIdleTarget.Child2Weight < 0.5f)
{
CustomAnim.PlayCustomAnim('SW_A_None_Bat_EquipX',1.0f,0.2f,0.5f,False,True);
AttackOrIdleTarget.SetBlendTarget(1.0f,0.15f);
settimer(0.56f,false,nameof(WeaponToBack));
}
}
//调用 WeaponToBack 函数可将武器从角色手上放到背上 (剑士)
function WeaponToBack() {
Playsound(SoundCue'BSA_Sounds.CueSwordWeapon.Equip_SwordIn',false,True,,,True);
Mesh.AttachComponentToSocket(NoneMesh,'WeaponPoint'); Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'BackWeapon');
}
// Begin 标签表示该状态从此处开始
Begin: inIdleState();
}
//战斗状态
State Attack {
// inAttackState 函数的作用是将指定的动画混合节点混向 Attack 分支
function inAttackState() {
if (AttackOrIdleTarget.Child2Weight > 0.5f) {
Playsound(SoundCue'BSA_Sounds.CueSwordWeapon.Equip_SwordOut',false,True,,,True);
//将武器从角色背上转至手上 (剑士)
Mesh.AttachComponentToSocket(NoneMesh,'BackWeapon'); Mesh.AttachComponentToSocket(WeaponSkeletalMesh,'WeaponPoint');
AttackOrIdleTarget.SetBlendTarget(0.0f,0.15f);
}
}
//退出战斗姿态
exec function ExitAttackState() {
//跳转至 Idle 状态的 Begin 标签 
GotoState('Idle','Begin'); }
Begin: inAttackState();
}
至此,您已经拥有了两个状态,可以任意在需要的地方调用任何一种状态。比如在您的武器类或战斗类中的攻击部分中加入一个检查机制:如果角色处于 闲置(Idle) 则将其转入 战斗(Attack)
//这里的 BSA_BMPP 是我的自定义角色 Pawn 类
if (BSA_BMPP.IsInState('Idle')) {
BSA_BMPP.GotoState('Attack','Begin');
}

仅是一些 UnrealScript States 的简单用法,希望对您有所帮助。