Unity2D项目-平台、解谜、战斗! 1.5 Player框架、技能管理组件
各位看官老爷们,这里是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框架、技能管理组件的更多相关文章
- Unity2D项目-平台、解谜、战斗! 0.1 序言:团队、项目提出、初步设计、剧情大纲
各位看官老爷们,这里是RuaiRuai工作室(以下简称RR社),一个做单机游戏的兴趣作坊. 本文跟大家聊一下社团内第一个游戏项目.算是从萌新项目组长的角度,从第一个里程碑的结点处,往前看总结一下项目之 ...
- Unity2D项目-平台、解谜、战斗! 1.3移动组件
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 在这一篇中,我们将会自顶向下地讨论本2D游戏中主角不可或缺的一个功能--移动控制. 首先我们简单分析一下2D游戏中主角与移动相 ...
- Unity2D项目-平台、解谜、战斗! 1.2战斗组件Defence、Attack
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 接上文,我们定义了两个分别具有"攻击"和"被攻击"语义的组件CanFight和CanB ...
- Unity2D项目-平台、解谜、战斗! 1.1战斗底层组件CanFight-CanBeFighted
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文对该2D项目中战斗底层组件的开发及设计思路做一个总结,希望各路同行多多交流,各路大佬多多指点. 实例特征分析 首先对于各个 ...
- Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制
各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...
- eclipse里面构建maven项目详解(转载)
本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1 环境安装及分配 Maven是基于项目对象模 ...
- [转帖](整理)GNU Hurd项目详解
(整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...
- pythonchallenge 解谜 Level 0
解谜地址: http://www.pythonchallenge.com/pc/def/0.html 这题没什么难度,意思就是得到2的38次方的值,然后,替换 http://www.pythoncha ...
- pythonchallenge 解谜
所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址 http://www.pythonchallenge.com/ 接下来会写破解教程~
随机推荐
- java中的桥接方法
本文转载自java中什么是bridge method(桥接方法) 导语 在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料 ...
- 手把手教你gitlab汉化
详细教程如下: 一.在Github上 https://gitlab.com/xhang/gitlab/-/tags 下载对应的版本到服务器中 这种-zh结尾的才是汉化包,下载速度可能比较慢,有条件的可 ...
- SpringCloud之服务配置
1.config 1.1定义 对于分布式微服务,有很多的配置,那么修改起来很麻烦.这就需要对这些配置文件进行集中式的管理,config的功能就是用来统一管理配置文件的.它为微服务提供集中化的外部配置支 ...
- Java RPC 框架 Solon 1.3.7 发布,增强Cloud接口能力范围
Solon 是一个微型的Java RPC开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC. ...
- Spirent Tester二层裸流配置
1.OLT配置 配一个VLAN,若GE口打Tag,不需要打PVID,打Untag,配PVID. 在ONU上配一个Other Bridge Wan链接. 2.TestCenter配置 选定两个TestC ...
- ISC BIND9 - 最详细、最认真的从零开始的BIND 9 服务讲解
DNS and BIND 服务的搭建说明 目录 目录 DNS and BIND 服务的搭建说明 1. 背景 1.1 DNS 1.2 FQDN 1.3 BIND 1.4 本文中搭建模拟DNS服务网络虚拟 ...
- 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...
- pygame模块使用时出现AttributeError: module ‘pygame’ has no attribute '…'错误解决方法
pygame模块使用时出现AttributeError: module 'pygame' has no attribute '-'错误解决方法 首先在pygame中存在init()模块,出现这样的问题 ...
- Mongo的相关语法
mongod的条件操作符 $gt -------- greater than > $gte --------- gt equal >= $lt -------- less than < ...
- 使用函数式语言实践DDD
长期以来我都在实践OOP,进而通过OOP来实现DDD,特别是如何通过面向对象的技巧来建立一个领域模型.OO的一些特性在建立领域模型时显得恰如其分,能否掌握OO的技巧,对创建领域模型有着至关重要的作用. ...