各位看官老爷们,这里是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. Python 爬虫使用动态切换ip防止封杀

    对于爬虫被封禁 ! 爬虫一般来说只要你的ip够多,是不容易被封的. 一些中小网站要封杀你,他的技术成本也是很高的,因为大多数网站没有vps,他们用的是虚拟空间或者是sae,bae这样的paas云. 其 ...

  2. 翻译:《实用的Python编程》02_04_Sequences

    目录| 上一节 (2.3 格式化) | 下一节 (2.5 Collections模块) 2.4 序列 序列数据类型 Python 有三种序列数据类型. 字符串:如 'Hello'.字符串是字符序列 列 ...

  3. A study on ILC for linear discrete systems with single delay

    论文题目就是随笔的题目,以后的随笔的命名都是如此,特此说明. 论文的主要内容是偏理论研究的,引入了离散矩阵延迟指数函数,来处理具有单时滞线性离散系统.对于离散延迟矩阵指数函数其定义为: \[e_{m} ...

  4. oracle 查锁

    reference:https://www.cnblogs.com/XQiu/p/5212787.html--以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$ ...

  5. ProBuilder快速原型开发技术 ---不规则模型与材质

    ProBuilder开发模型的强大之处,还在于可以按照要求精确定制不规则模型.克隆镜像模型.给模型着色以及添加材质等,下面笔者就这几方面进行讲解. 一:定制不规则模型 PB有一个专门定制不规则模型的功 ...

  6. 用于功率集成电路应用的600伏、10安、4H-SIC横向单沟道金属氧化物半导体场效应晶体管的演示和分析

    用于功率集成电路应用的600伏.10安.4H-碳化硅横向单沟道金属氧化物半导体场效应晶体管的演示和分析 摘要: 本文报道了一个具有大电流处理能力(10 A)的600伏4H-碳化硅横向场效应晶体管的演示 ...

  7. MySql_176. 第二高的薪水 + limit + distinct + null

    MySql_176. 第二高的薪水 LeetCode_MySql_176 题目描述 题解分析 代码实现 # Write your MySQL query statement below select( ...

  8. LeetCode-133克隆图(图的遍历+深拷贝概念)

    克隆图 LeetCode-133 使用一个map来存储已经遍历的结点,这个存起来的结点必须是新new的才符合题意 /* // Definition for a Node. class Node { p ...

  9. 再来认识一下 Java 序列化

    前言 在面试中,Java 序列化被问到的几率还是挺高的.所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解. 序列化基础知识 什么是序列化? Java 序列化是 JDK 1.1 ...

  10. go中sync.Once源码解读

    sync.Once 前言 sync.Once的作用 实现原理 总结 sync.Once 前言 本次的代码是基于go version go1.13.15 darwin/amd64 sync.Once的作 ...