各位看官老爷们,这里是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. BGV币与YFI币、YFII币存在着怎样的相关性?

    大多数的玩家并没有长期的打算,而是更倾向于关注短期利好的币种.比如最近在圈内赚足眼球的YFI,之所以能够成为明星角色,并非它的技术和平台,而是因为它在短期就创造了86倍的暴涨.YFI币的暴涨在某种程度 ...

  2. JavaScript高级-类的使用

    1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...

  3. 2021-02:Teams开发平台更新概述

    作为2021年工作计划的一部分,我会在每月的第三个星期五发布Teams开发平台的更新报告,给大家整理和讲解最新的平台功能,以及特色场景.这是第一篇文章,我会挑选截至到2月份一些重要的更新,以后每月的更 ...

  4. 在gradle中构建java项目

    目录 简介 构建java项目的两大插件 管理依赖 编译代码 管理resource 打包和发布 生成javadoc 简介 之前的文章我们讲到了gradle的基本使用,使用gradle的最终目的就是为了构 ...

  5. m1款MacBook Air 使用3个月总结及原生运行于apple架构软件推荐

    前言 我之前一直是一个坚定的Windows/Android党,大学的时候用过几台iPhone,感觉也就那样.这次m1版本的Mac一发布我直接又转回apple阵营了,11月份的时候官网订了一台m1 版本 ...

  6. 后端程序员之路 23、一个c++的api framework

    在"21.一个cgi的c++封装"中,我们封装了cgi,在这之上,我们可以再来封装一个webapi的framework.当然,前文的Casablanca是个不错的选择,但是它比较庞 ...

  7. Vuex理解与使用

    1.Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,用于管理页面的数据状态.提供统一数据操作的生态系统.在组件中可以任意获取仓库中的数据.和Vuex类似的还有redux ...

  8. ZooKeeper未授权访问漏洞确认与修复

    目录 探测2181 探测四字命令 用安装好zk环境的客户端连接测试 修复 修复步骤一 关闭四字命令 修复步骤二 关闭未授权访问 zookeeper未授权访问测试参考文章: https://www.cn ...

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

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

  10. HDOJ-1069(动态规划+排序+嵌套矩形问题)

    Monkey and Banana HDOJ-1069 这里实际是嵌套矩形问题的变式,也就是求不固定起点的最长路径 动态转移方程为:dp[i]=max(dp[j]+block[i].h|(i,j)∈m ...