更新日期:2021年1月25日。
项目源码:在终章发布
索引
简介
Actor(行动者)作为承载一切行动的基类对象,简言之它即是行动的播放器,而Player(角色)便是继承至它,在本章,我们将了解Player是如何应用行动的,以及它将如何被驱动!
正式开始
创建行动
点击上方菜单栏:HTFramework.GC
->FTG2D
->Create Player
,可以在Scene视图中创建一个角色模板:
角色模板自带四个组件(不要手动删除,这四个组件缺一不可):
1.FSM:
有限状态机,负责将角色的逻辑分散到各个不同的状态,且每个状态只处理自己关心的业务。
2.Player:
角色控制器,将角色的状态衔接到具体的行动上面。
3.BoxCollider2D:
角色的身体碰撞器组件。
4.Rigidbody2D:
角色的刚体组件。
角色的子级物体中有一个名为Hit的物体,他的名字为角色的近身武器,实际上也即是行动中的攻击碰撞盒所定义的目标对象,理论上此组件的属性不需要我们手动更改,近身武器会根据行动中的具体属性自动进行填充。
角色的属性
常规属性
1.阵营:
目前分为P1和P2,只有不同阵营的角色才是敌对关系。2.身体所在层:
为角色的所在层,角色的物体将被渲染到此层。3.武器所在层:
为角色武器的所在层,角色的所有近身武器、远程武器都将被渲染到此层(关于近身武器、远程武器的定义将在后续讲解)。4.启用格挡:
启用后,角色可以使用格挡,格挡能挡住一切正面攻击。5.格挡触发键:
默认的格挡组合键是Down
+A
键(关于键位的定义将在后续讲解)。6.AI类型:
为角色指定AI控制器类型,当且仅当此角色以AI方式创建时,将由AI控制器驱动。
注意:事实上此面板的属性大部分都不用手动设置,正确的做法是在创建角色时便进行相应的赋值,目前为止便是这么做的。
行动属性
输入
为角色的输入配置文件。
普通攻击类型的行动,可以在面板配置触发键。
音效属性
角色的音效属性主要包含一些公共的音效资源,比如从空中落地时的音效,死亡倒地时的音效,死亡喊叫的音效,主要是一些特殊状态才有的音效。
输入配置文件
在Project视图点击右键,选择创建菜单:Create
->HTFramework GC
->FTG2D
->Input Asset
,可以在选定位置创建一个输入配置资源,如下图:
目前输入配置文件中总共对应了8个输入键位,分别为上、下、左、右方向键,和A、B、C、D功能键,这里暂时只预定义了P1和P2的两种输入键,具体的键位如何定义将在后续讲解。
角色的状态机
上面完成了角色属性的配置,然后最重要的就是角色的状态机了,也即是角色逻辑的驱动器,在我们生成的角色模板中,已经自动为我们包含了默认情况下的各个角色状态:
FSM有限状态机秉承了将逻辑分散到各个状态的原则,使得每个状态只做自己所关心的事,大大的降低了耦合度,减少了代码量,提升了可读性,以及降低了后期维护的难度。
比如在这里,角色的默认状态是闲置,我们点击启用状态列表中的闲置状态后面的Edit按钮,直接查看其代码:
/// <summary>
/// 玩家状态 - 闲置
/// </summary>
[FiniteStateName("玩家状态/闲置")]
public class PlayerStateIdle : PlayerStateBase
{
/// <summary>
/// 行动状态
/// </summary>
public override MotionState State
{
get
{
return MotionState.Idle;
}
}
/// <summary>
/// 进入状态
/// </summary>
/// <param name="lastState">上一个离开的状态</param>
public override void OnEnter(FiniteStateBase lastState)
{
base.OnEnter(lastState);
//进入闲置状态时,立刻使自身切换到Idle行动
Oneself.PerformMotion(Oneself.IdleAsset);
}
/// <summary>
/// 切换状态的动机
/// </summary>
public override void OnReason()
{
base.OnReason();
//在闲置状态中,只关心他所感兴趣的动机
//如果角色离开地面
if (!Oneself.CheckGround())
{
//角色进入跳跃下降状态
Oneself.DoJumpDown();
return;
}
//如果角色由AI驱动
if (Oneself.IsAI)
{
//角色的AI驱动器开始处理闲置状态逻辑
Oneself.AIDriver.OnIdle();
}
else
{
//否则判断是否按左、右键
if (Main.m_Input.GetButton(Oneself.InputAsset.ButtonLeft) || Main.m_Input.GetButton(Oneself.InputAsset.ButtonRight))
{
//是则进入行走状态
Oneself.DoWalk();
return;
}
//否则判断是否按上键
if (Main.m_Input.GetButton(Oneself.InputAsset.ButtonUp))
{
//是则进入跳跃状态
Oneself.DoJump(Oneself.JumpPower);
return;
}
}
}
}
行走状态:
/// <summary>
/// 玩家状态 - 行走
/// </summary>
[FiniteStateName("玩家状态/行走")]
public class PlayerStateWalk : PlayerStateBase
{
/// <summary>
/// 行动状态
/// </summary>
public override MotionState State
{
get
{
return MotionState.Walk;
}
}
/// <summary>
/// 进入状态
/// </summary>
/// <param name="lastState">上一个离开的状态</param>
public override void OnEnter(FiniteStateBase lastState)
{
base.OnEnter(lastState);
进入行走状态时,立刻使自身切换到Walk行动
Oneself.PerformMotion(Oneself.WalkAsset);
}
/// <summary>
/// 切换状态的动机
/// </summary>
public override void OnReason()
{
base.OnReason();
//如果角色离开地面
if (!Oneself.CheckGround())
{
//角色进入跳跃下降状态
Oneself.DoJumpDown();
return;
}
//如果角色由AI驱动
if (Oneself.IsAI)
{
//角色的AI驱动器开始处理行走状态逻辑
Oneself.AIDriver.OnWalk();
}
else
{
//否则判断是否按上键
if (Main.m_Input.GetButton(Oneself.InputAsset.ButtonUp))
{
//是则进入跳跃状态
Oneself.DoJump(Oneself.JumpPower);
return;
}
//如果按左键
if (Main.m_Input.GetButton(Oneself.InputAsset.ButtonLeft))
{
//如果角色未面向左侧,则面向左侧
if (Oneself.Face != Direction.Left) Oneself.ChangeDirection(Direction.Left);
}
//如果按右键
else if (Main.m_Input.GetButton(Oneself.InputAsset.ButtonRight))
{
//如果角色未面向右侧,则面向右侧
if (Oneself.Face != Direction.Right) Oneself.ChangeDirection(Direction.Right);
}
//如果左、右键均未按,则离开行走状态
else
{
//进入闲置状态
Oneself.DoIdle();
return;
}
}
}
/// <summary>
/// 状态帧刷新
/// </summary>
public override void OnUpdate()
{
base.OnUpdate();
//角色处于此状态时才会进入此方法
//使得角色朝前方行走
Oneself.transform.Translate(Oneself.Forward * Oneself.WalkSpeed * Time.deltaTime, Space.World);
}
}
角色的其他状态雷同,这里就不做过多介绍了,到了这一步,虽然角色和行动都有了,但要直接运行起来还需要一个非常重要的东西,FTG2D的运行环境,这将是我们接下来需要了解的重点。
原文地址:https://blog.csdn.net/qq992817263/article/details/113140152
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。