各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊。

前文提到,凡是有“攻击”语义的对象,在游戏中,我们给予其一个“CanFight”组件予以表示。CanFight组件提供了底层的攻击函数,接受一个对象作为攻击目标,接受攻击点数和攻击类型作为攻击信息,将攻击施加在目标身上。但是我们的主角,他可是主角啊喂,总不能只有个光秃秃的攻击键吧,所以我们理所当然地要对这个底层攻击组件进行各种包装和扩展,使其成为游戏中能够被玩家认可的一个“技能”(Ability or spell)。

在这一部分中,不可避免的,我们要从C#脚本中脱身出来,制作一些简单的主角技能释放动画。也就是——和Unity的动画机打打交道,笔者对Unity动画机模型了解不深,在接下来的讲解中若有偏颇,还请各位不吝赐教!

首先我们先看一下我们的控制框架吧:

前文我们已经分析了移动组件和状态组件,他们分别负责执行不同需求的移动处理和整个主角的状态管理控制。在我们的框架中,每当主角接受到一个来自玩家的控制请求后,Player Controller捕获这个指令,并通知对应的组件进行响应。以技能指令为例,技能控制组件在接受到释放技能请求时,会先询问状态组件当前状态是否能够释放这个技能(在前文中我们也提过,比如我正在释放技能A,并且不希望被打断,那么按下B技能的控制键,主角应该不予响应)。如果返回值为true,那么表明状态组件已经允许,并将当前状态切换为释放A技能的状态,则在技能控制组件中,需要执行技能A有关的逻辑,并将unity动画机中的一个参数"技能编号",设置为当前释放的技能的编号,这样unity就会播放我们想要的动画。反之,如果返回值为false,说明当前状态优先级高于所请求的动作,那么这个动作(指令)就不会得到响应。

我们了解了控制主角的状态机模型后,我们便能够把注意力集中在技能的管理和实现这两个主要话题上。在我们设计的游戏中,主角拥有30+个不同的技能,但同时只有4个可以同时生效(即在一段时间内你只能选择4个可以使用的技能),不同的技能从属于不同的元素,拥有不同的特性...我们在这里不对本游戏的特殊需求做过多的实现上的分析,只是对一般技能-动画机的实现流程进行阐述,即在上面的流程图中,我们允许了技能释放之后,这个技能如何被释放出来,这个技能以什么形式储存在我们的场景中,如果我们对一般技能进行多维度扩展,我们如何实现等等。

首先一个技能,对外要开放一个使用该技能的接口,对内要保存该技能有关的逻辑、过程和数据结构,显然我们应该把技能这个实体组织成一个类,在每一个类中处理自己技能所负责的逻辑。更简便的做法是,将每一个技能组织成一个MonoBehavior,并挂载在主角物体上,这样我们既可以实现对技能资源的动态释放(disable or enable),也可以方便地管理和扩展技能树。

那么假定我们已经有了若干个技能组件,并且通过一个技能管理组件获得了所有父类为技能(Spell)类的子类,那么当技能管理组件在接受到一个唯一指定技能释放的请求时,他便直接调用对应技能的调用函数即可。与此同时,我们还应该激活动画机中的相应参数,使得主角做出我们想要的动作来,比如我们可以将Ability状态下的一个int参数作为技能的唯一标识,当这个标识不为0时,动画机播放对应技能的动画。同时,我们还可以在动画机的某一帧中添加回调函数,达到在先播放动画-再判定攻击-结束播放动画的效果,最后,应该在动画机的最后一帧添加回调函数清空释放技能的唯一标识,使得技能状态变量归位,动画不再重新播放。

感谢您阅读到这里!那么今天的分享就是这些,欢迎访问:

整个项目原型github地址:

www.gitHub.com/yunshiyue/elementgame

最后,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊,希望你对我们的项目能提出各种意见和想法,也欢迎各种合作!

下期再见!

Unity2D项目-平台、解谜、战斗! 1.5 Player框架、技能管理组件的更多相关文章

  1. Unity2D项目-平台、解谜、战斗! 0.1 序言:团队、项目提出、初步设计、剧情大纲

    各位看官老爷们,这里是RuaiRuai工作室(以下简称RR社),一个做单机游戏的兴趣作坊. 本文跟大家聊一下社团内第一个游戏项目.算是从萌新项目组长的角度,从第一个里程碑的结点处,往前看总结一下项目之 ...

  2. Unity2D项目-平台、解谜、战斗! 1.3移动组件

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 在这一篇中,我们将会自顶向下地讨论本2D游戏中主角不可或缺的一个功能--移动控制. 首先我们简单分析一下2D游戏中主角与移动相 ...

  3. Unity2D项目-平台、解谜、战斗! 1.2战斗组件Defence、Attack

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 接上文,我们定义了两个分别具有"攻击"和"被攻击"语义的组件CanFight和CanB ...

  4. Unity2D项目-平台、解谜、战斗! 1.1战斗底层组件CanFight-CanBeFighted

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文对该2D项目中战斗底层组件的开发及设计思路做一个总结,希望各路同行多多交流,各路大佬多多指点. 实例特征分析 首先对于各个 ...

  5. Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...

  6. eclipse里面构建maven项目详解(转载)

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  7. [转帖](整理)GNU Hurd项目详解

    (整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...

  8. pythonchallenge 解谜 Level 0

    解谜地址: http://www.pythonchallenge.com/pc/def/0.html 这题没什么难度,意思就是得到2的38次方的值,然后,替换 http://www.pythoncha ...

  9. pythonchallenge 解谜

    所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址  http://www.pythonchallenge.com/ 接下来会写破解教程~

随机推荐

  1. Android 之 EditText

    1.使用EditText 的SetInput的方法设置输入类型: 1 //输入类型为没有指定明确的类型的特殊内容类型 2 editText.setInputType(InputType.TYPE_NU ...

  2. 1098 Insertion or Heap Sort——PAT甲级真题

    1098 Insertion or Heap Sort According to Wikipedia: Insertion sort iterates, consuming one input ele ...

  3. js中国标准时间转换成datetime格式

    var format = function (time, format) { var t = new Date(time); var tf = function (i) { return (i < ...

  4. es命令测试

    1.新建索引并赋值 :put/索引名/文档名/id //文档名后面会逐渐取消 相当表 PUT /test1/type1/1{ "nmae":"hb", &quo ...

  5. 逆向基础 C++ Primer Plus 第二章 开始学习C++

    C++ Primer Plus 第二章 开始学习C++ 知识点梳理 本章从一个简单的C++例子出发,主要介绍了创建C++程序的步骤,以及其所包含的预处理器编译指令.函数头.编译指令.函数体.注释等组成 ...

  6. mac 下如何轻松安装神器 Anaconda

    本文推荐使用homebrew 安装 1.打开终端执行 brew cask install anaconda3 然后就可以喝一杯咖啡了,终端会自动执行安装好 如果终端卡在update homebrew ...

  7. pytorch(09)transform模块(基础)

    transforms transforms运行机制 torchvision.transforms:常用的图像预处理方法 torchvision.datasets:常用数据及的dataset实现,mni ...

  8. Java I/O流 05

    I/O流·文件递归 统计该文件夹的大小 * 需求:从键盘就收一个文件夹路径,统计该文件夹的大小 package com.heima.test; import java.io.File; import ...

  9. Java 查找算法

    1 查找算法介绍 在 java 中,我们常用的查找有四种: 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找   2 线性查找算法 有一个数列: {1,8, 10, ...

  10. C语言之结构体内存的对齐

    C语言之结构体内存的对齐 大纲: 零.引例 一.结构体内存对齐规则 二.怎样计算结构体的大小 三.设计结构体时要注意的方面   四.为什么存在内存对齐 五.修改默认对齐数 在前面的章节中,我们谈到了C ...