各位看官老爷们,这里是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. C++算法代码——鹅卵石游戏

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2334 题目描述 为了消磨时光,奶牛Bessie和她的朋友Elsie喜欢玩一种她们在农 ...

  2. 宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

    一.背景小故事 笔者手里有个朋友交给我去日常运维项目是PHP+微信小程序,部署在Linux系统上. 这个项目是用宝塔面板去进行日常的可视化运维管理,用起来蛮香的. 如不清楚宝塔的同学,可以自行了解,这 ...

  3. JAVA 8 新特性实用总JAVA 8 新特性实用总结结

    JAVA 8 新特性实用总结 作为一个工作两年多的 老 程序猿,虽然一开始就使用 jdk1.8 作为学习和使用的版本,随着技术的迭代,现有的 JDK 版本从两年前到现在,已经飞速发展到了 JDK 15 ...

  4. java基础第11期——Stream流、方法引用、junit单元测试

    1.Stream流 Stream流与io流是不同的东西,用于解决集合类库已有的弊端, 1.1 获取Stream流: Collection集合的Stream方法,注意Map集合要经过转化 default ...

  5. H5跳转app代码

    不罗嗦直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. C#关于panle重叠

    当多个panle重叠不显示不出来的时候  选择视图---------------其它窗口----------------文档大纲  然后拖动进行调整

  7. C语言:试探算法解决“八皇后”问题

    #include <stdio.h> #define N 4 int solution[N], j, k, count, sols; int place(int row, int col) ...

  8. 前端问题录——在导入模块时使用'@'时提示"Modile is not installed"

    前情提要 为了尽可能解决引用其他模块时路径过长的问题,通常会在 vue.config.js 文件中为 src 目录配置一个别名 '@' configureWebpack: { resolve: { a ...

  9. Svelte 极简入门

    ​弹指之间即可完成.   注意:原文发表于 2017-8-7,随着框架不断演进,部分内容可能已不适用.     Svelte 是一种新型框架.   以往我们要引入一个框架或者类库,可以通过在页面上放置 ...

  10. Linux没有ens33解决方案

    一.前言 运行环境:window10+VMware14+Centos7 博主最近遇到一个比较郁闷的问题,在虚拟机上操作Linux系统查看IP的时候,发现没有ens33或者eth0了,试了很多办法都没有 ...