Unity游戏角色OnePieceFTG设计

简介

Actor(行动者)作为承载一切行动的基类对象,简言之它即是行动的播放器,而Player(角色)便是继承至它,在本章,我们将了解Player是如何应用行动的,以及它将如何被驱动!

正式开始

创建角色

点击上方菜单栏:​​HTFramework.GC​​​->​​FTG2D​​​->​​Create Player​​,可以在Scene视图中创建一个角色模板:

【Unity】OnePieceFTG(三)角色_右键

角色模板自带四个组件(不要手动删除,这四个组件缺一不可):
​​
​1.FSM:​​​有限状态机,负责将角色的逻辑分散到各个不同的状态,且每个状态只处理自己关心的业务。
​​
​2.Player:​​角色控制器,将角色的状态衔接到具体的行动上面。
​​
​3.BoxCollider2D:​​​角色的身体碰撞器组件。
​​
​4.Rigidbody2D:​​角色的刚体组件。

【Unity】OnePieceFTG(三)角色_右键_02

角色的子级物体中有一个名为Hit的物体,他的名字为角色的近身武器,实际上也即是行动中的攻击碰撞盒所定义的目标对象,理论上此组件的属性不需要我们手动更改,近身武器会根据行动中的具体属性自动进行填充。

角色的属性

常规属性

【Unity】OnePieceFTG(三)角色_配置文件_03


角色的常规属性中,如下属性的意思不是那么显而易见:

​1.阵营:​​目前分为P1和P2,只有不同阵营的角色才是敌对关系。

​2.身体所在层:​​为角色的所在层,角色的物体将被渲染到此层。

​3.武器所在层:​​为角色武器的所在层,角色的所有近身武器、远程武器都将被渲染到此层(关于近身武器、远程武器的定义将在后续讲解)。

​4.启用格挡:​​启用后,角色可以使用格挡,格挡能挡住一切正面攻击。

​5.格挡触发键:​​​默认的格挡组合键是​​Down​​​+​​A​​键(关于键位的定义将在后续讲解)。

​6.AI类型:​​为角色指定AI控制器类型,当且仅当此角色以AI方式创建时,将由AI控制器驱动。

注意:事实上此面板的属性大部分都不用手动设置,正确的做法是在创建角色时便进行相应的赋值,目前为止便是这么做的。

行动属性

【Unity】OnePieceFTG(三)角色_ide_04


角色的行动属性,主要用以链接至各个行动资源,其中的​​输入​​为角色的输入配置文件。

【Unity】OnePieceFTG(三)角色_配置文件_05

普通攻击类型的行动,可以在面板配置触发键。

【Unity】OnePieceFTG(三)角色_右键_06


技能攻击类型的行动,可以在面板配置触发组合键,组合键可以进行自由组合,并可以设置此技能的触发状态,比如只包含Idle的话,证明此技能行动只有在角色处在Idle状态才能触发。

音效属性

【Unity】OnePieceFTG(三)角色_配置文件_07


角色的音效属性主要包含一些公共的音效资源,比如从空中落地时的音效,死亡倒地时的音效,死亡喊叫的音效,主要是一些特殊状态才有的音效。

输入配置文件

在Project视图点击右键,选择创建菜单:​​Create​​​->​​HTFramework GC​​​->​​FTG2D​​​->​​Input Asset​​,可以在选定位置创建一个输入配置资源,如下图:

【Unity】OnePieceFTG(三)角色_ide_08


目前输入配置文件中总共对应了8个输入键位,分别为上、下、左、右方向键,和A、B、C、D功能键,这里暂时只预定义了P1和P2的两种输入键,具体的键位如何定义将在后续讲解。

角色的状态机

上面完成了角色属性的配置,然后最重要的就是角色的状态机了,也即是角色逻辑的驱动器,在我们生成的角色模板中,已经自动为我们包含了默认情况下的各个角色状态:

【Unity】OnePieceFTG(三)角色_ide_09


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;                }            }        }    }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.

行走状态:

登录后复制

/// <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);        }    }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.

角色的其他状态雷同,这里就不做过多介绍了,到了这一步,虽然角色行动都有了,但要直接运行起来还需要一个非常重要的东西,FTG2D的战斗环境,这将是我们接下来需要了解的重点。

               



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空