更新日期:2021年1月27日。
项目源码:在终章发布

索引

  • 简介
  • 正式开始
    • 创建角色
    • 角色的属性
      • 常规属性
      • 行动属性
      • 音效属性
      • 输入配置文件
    • 角色的状态机

简介

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控制器驱动。

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

行动属性


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

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


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

音效属性


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

输入配置文件

在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的战斗环境,这将是我们接下来需要了解的重点。

【Unity】OnePieceFTG(三)角色相关推荐

  1. 详解Unity中的角色控制器

    前言 如何让玩家所操纵的角色动起来,这在Unity中很容易实现,但是如何确保玩家所操作的角色不会产生一些非常违反物理常识的情况?而这就需要进行大量的检测,已确保玩家所操纵的角色正常.所幸Unity为我 ...

  2. Unity 3D 动画系统(Mecanim)|| Unity 3D 人形角色动画(Avatar)

    Unity 3D 动画系统(Mecanim) Mecanim 动画系统是 Unity 公司推出的全新动画系统,具有重定向.可融合等诸多新特性,可以帮助程序设计人员通过和美工人员的配合快速设计出角色动画 ...

  3. C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码

    C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言

  4. unity第三天:物体的碰撞器与触发器

    unity第三天:碰撞器与触发器 前言 一.吃豆球的豆 二.吃豆球 三.又是豆 前言 15:06- 很好, 又是一个下午开始的博客-- Code Start! 一.吃豆球的豆 在新建一个cube,命名 ...

  5. Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画(Avatar) Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构.. 由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个 ...

  6. photon四种同步方式_Photon与Unity核心技术之角色动作同步 - 纳金网

    文章标题:Photon与Unity核心技术之角色动作同步 文章作者:海洋_(CSDN ) 本篇介绍关于使用Photon实现角色同步,客户端还是选择Unity开发,在实现动作之前,Unity为我们提供了 ...

  7. Unity 第三人称角色控制器:动画混合树、Cinemachine等功能或插件的使用

    前言: 无论是RPG.ACT.AVG还是TPS游戏,都有大量的以第三人称为人物视角的游戏作品,尤其是TPS,直接以第三人称为特点来命名 游戏类型: RPG:角色扮演游戏 ACT:动作游戏 AVG:冒险 ...

  8. 从制作OC形象到导入Unity并让角色动起来

    一直想让自己以前设计的oc能变成3d并且让她作为RPG的主角动起来,并且以此为契机熟悉3d建模与游戏开发领域,于是有了标题的这个想法. 这里记录一下新人第一次从Vroid捏OC,导入blender转f ...

  9. Unity的三种Interceptor

    Unity默认提供了三种拦截器:TransparentProxyInterceptor.InterfaceInterceptor.VirtualMethodInterceptor. Transpare ...

  10. MVC与单元测试实践之健身网站(三)-角色与权限

    管理员的维护功能完成后,还有权限和角色,三者构成权限系统.这里采用的RBAC是最经典.最简单的一种,权限-角色-管理员只能层层传递,并不能直接为管理员分配权限. 一 权限.角色管理 a) 权限 之前编 ...

最新文章

  1. python需要多久-在传智播客培训python需要多久?
  2. 研发和人力资源发展模式对比研究
  3. 接口 Swagger 部分Web API的隐藏
  4. PHP操作文件和目录的相关函数
  5. 修改程序的形而上学思考(随笔)
  6. 自创本派高考理数试题集现在发布
  7. 1.3 - 字典练习题
  8. P6039A高压衰减棒使用方法及注意事项
  9. 横向合计代码 锐浪报表_巧用锐浪报表:用报表脚本实现动态显示小数位数
  10. php model module,Yii2用Gii自动生成Module+Model+CRUD
  11. 如何自建微信外卖平台_本地外面平台怎么起步,如何自建微信外卖平台
  12. 高考读卡机是谁发明的?
  13. 时间轮盘app(抖音数字时钟罗盘)v1.4 安卓版
  14. 【自学笔记】尚硅谷数据结构与算法Chapter 2 稀疏数组和队列
  15. 【Books系列】2021年:蔡崇达《皮囊》读书笔记
  16. CSS实现水平居中与垂直居中
  17. 根据网络上的视频的m3u8文件通过ffmpeg进行合成视频
  18. 云计算学习7——云计算OpenStack运维基础
  19. 《机器学习实战》-04 朴素贝叶斯
  20. ORACLE DG概念及切换

热门文章

  1. 这些PCB专业术语,可以让学妹对你刮目相看
  2. 利用 itchat给微信好友发送生日快乐
  3. 坊间传言的“阿里云上市”,有三好和三不好
  4. 芯片手册、官方代码和电子书
  5. C语言求梅花数1到9999,找出1到10000的水仙花数,完全数,还有同构数
  6. android 6.0运行时权限应用之图库图片选取
  7. 【python圣诞树】圣诞节来了,还不快给女友来画一棵属于她的圣诞树
  8. Exception in thread “main” java.lang.NoClassDefFoundError: freemarker/template/Configuration 代码生成报错
  9. javascript---window.createPopup
  10. 解析PDF文件以及解决编码问题