万用技能指示器
前言
这几天研究了下 技能指示器 发现作者好久没更新了,而且由于其用到了Projector组件,无法在URP管线下正常工作,所以我把它的Shader稍微改了下,接口之类的也改了下,如果需要技能指示器贴合地形的话可以接入 https://github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader ,本仓库 也给了一个示例。
使用此指示器需要Odin插件,因为需要在编辑器编辑指示器的大小,实时预览,用到了OnValueChanged特性。
预览图如下
功能
非指向性
指向性(无范围提示)
指向性(有范围提示)
区域选择性
可变角扇形
状态指示器
贴花
使用说明
指示器基类中重要字段,支持运行时使用其对应属性实时更改。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717 ...
(译)C#的反射为什么慢?怎么加快反射调用?
前言
我们知道C#反射慢,但是当中很多人不知道它为什么慢,并且如何解决反射调用方法慢的问题呢? 这篇文章会给你一个答案。本文译自:https://mattwarren.org/2016/12/14/Why-is-Reflection-slow/
C#的反射为什么慢
反射的设计初衷
在运行时非常快的访问我们所需要的代码的信息。
在编译时非常直接的访问生成代码所需的信息。
垃圾回收器/计算堆栈能够在不对程序加锁/分配内存的情况下访问必要的信息。
能极大减少一次性需要加载的类型数量。
能极大减少给定类型加载时所需要加载的额外类型数目。
类型系统数据结构必须在NGEN映像中是可存储的。
我们可以看到,它只强调了最少依赖加载,并没有说我们可以直接从元数据获取所有CLR数据类型。也没有说所有的反射用法都是快的,只是说反射获取一些信息很快。 MethodTable的数据被分为“热”和“冷”两种数据结构来提升工作效率和缓存利用率,MethodTable本身只存储那些在程序稳定状态(是否可以翻译成一般运行时?)下被需求的“热”数据。EEClass储存那些只在类型加载时,JIT编译时,反射时需 ...
基于行为树的MOBA技能系统:动画系统
动画系统已有重构版本,可前往 朝花夕拾·动画系统的重构 进行查看
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
这一篇来谈谈动画系统部分,别的先不说,先给大伙来个开幕雷击
相信很多读者都受过这个蜘蛛网的荼毒+迫害,事实上我并不是很能知道Unity出这个蜘蛛网有什么用,折磨我们吗?
其实我们想一想,我们真的需要这种可视化吗?
我对于这个问题的答案是否定的,在游戏开发中我们会有自己的状态系统,而动画系统往往就是与我们自己的状态系统相绑定的,根据状态来播放相应的动画,所以我们的需求就是切换状态然后播放动画,不需要知道,也不需要想象哪个动画可以切换到另一个动画,哪个不可以,这都是由我们状态系统控制的,所以完全不需要这个可视化工具,也不需要每次都一大堆的SetXXX,只需要几个能用的API就行。
所以众多开发者也是不堪其辱,干脆不用这个蜘蛛网方案,退而求其次,使用Animation自己控制播放,但是这样的话就没有办法使用Animator的新功能,比如动画重定向、Blend Tree、Avatar Mas ...
基于行为树的MOBA技能系统:Buff系统
## 前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
本篇文章主要讲一下Buff系统的设计。Buff系统是战斗系统中最为重要的一个部件,我们技能效果就是依靠Buff系统实现的,比如伤害,治疗,破甲,眩晕,护盾,斩杀等,也就是说一个技能真正的核心就是组成它的那些Buff,这一点其实在《可视化节点技能编辑器的制作》一文中的示例中有体现。
这就可以引申出一个“万物皆Buff”的思想,所有的行为/效果都可以用一个Buff来实现,常规的比如一个持续伤害Buff,特殊的比如一个播放特效Buff,往客户端同步数据Buff。
指导思想有了,并且经过《可视化节点技能编辑器的制作》文中Buff系统相关介绍,我们可以知道这种方式确实可行,那么具体怎么抽象出一个健壮的Buff系统就是我们需要考虑的事情了。
本文更多的是介绍Buff系统Runtime的架构设计,Editor的架构设计可从下图得知,更详细的内容在《可视化节点技能编辑器的制作》中:
正文
基类抽象
首先我们Runtime下的Buff需要有数据载体,用于记载此 ...
基于行为树的MOBA技能系统:碰撞系统
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
一些游戏中简单的碰撞系统,可能就是手写几个圆形,矩形,扇形就够用了,但是Moba类游戏很多技能碰撞体是畸形的,比如派克的R,男枪的Q,R等都是不规则的,所以我们需要一个稳健的物理库来支持这些,自己处理碰撞体顶点数据,创建碰撞体到物理世界中,因为游戏类型原因,我选择了Box2D:https://github.com/erincatto/Box2D,对于FPS游戏,只有Bullet(3D物理库):https://github.com/bulletphysics/bullet3 可选,这里就不多说了。
由于碰撞系统本身需要和技能系统产生非常紧密的联系,所以涉及到的内容也会比较多,主要包括
Box2D物理库介绍
Box2D碰撞体编辑器拓展,负责制作碰撞体和导出碰撞体数据:https://www.lfzxb.top/box2d-unityvistualeditor/
Box2D碰撞关系编辑器拓展,负责维护碰撞体之间的碰撞关系,并自动生成代码:https://w ...
基于行为树的MOBA技能系统:数值系统
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
在战斗系统中数值系统也是一个核心的系统,当今主流做法是将一个属性分为两个相关联的属性,比如最大生命值就会被分为基础最大生命值 + 额外最大生命值两者之和
基础最大生命值一般而言是初始恒定的
额外最大生命值一般而言是受英雄自身属性,等级,装备,Buff影响的,比如对于力量英雄而言+1力量会为英雄提供20最大生命值,提升一级会为英雄提升80最大生命值,一件装备会提升20%额外最大生命值
其他的例如攻击力,移速,魔法值,法强,护甲,魔抗等都是如此。
此外,还有常见的伤害处理,减速处理等间接影响属性的类型。
分类
战斗数据处理主要分为两大类
直接作用于属性上,例如最大生命值,魔法恢复速度,移速等
间接作用于属性上,例如伤害,减速,魔法消耗等
并且直接作用复杂度 < 间接作用复杂度
由于间接作用类型的存在,我们就不能用诸如
final = ((base + add) * (100 + pct) / 100);
的形式来处理属性变更了,我们需要找到 ...
基于行为树的MOBA技能系统:技能系统与网络同步
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
从我个人的感受而言,如果说技能系统开发难度为7,那么网络同步的开发难度就是10,因为它的触手涉及技能系统方方面面,稍有不慎就会有可怕的连锁反应导致混乱。
包括守望先锋的三面分享,其中网络同步部分读起来最为吃力,断层的感觉最强,但越是这样,越能说明守望先锋网络同步方案的健壮性
对于本文内容的拓展延伸与具体实现,参见
基于行为树的MOBA技能系统:基于状态帧的战斗,技能编辑器与录像回放系统设计
基于行为树的MOBA技能系统:基于状态帧的战斗,技能编辑器与录像回放系统开发手札
本文大量内容参照了:《守望先锋》GDC2017技术分享精粹重制版总目录 中的文章
守望先锋网络同步总结
同步数据设计
感觉先说明一下网络同步环境和数据结构的设计比较容易理解一些
客户端和服务端都各自维护着整局游戏所有的实体和数据,差别就是客户端不负责逻辑计算,逻辑计算是服务器权威的,客户端要能从服务器发来的帧数据恢复到和服务器发送数据那一帧相同的世界状态
对于客户端来说,本地有 ...
基于行为树的MOBA技能系统:状态系统
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
这一篇来说一下战斗系统中的状态系统,我们在游戏中的眩晕,移动,禁锢,灼伤,吟唱,攻击。。。几乎所有的行为和表现都可以抽象出一个状态,所以宏观来看,状态系统会和动画系统,技能系统,Buff系统产生交互,所以设计一个健壮,功能全面的状态系统是必要的。
需求分析
我们先来分析需求
动画系统
首先是最简单的,动画系统相关的状态设计,很多情况下,我们需要当前状态结束后回溯到前一个状态,例如Idel->Run->Idel,就是一个很好的例子,所以我们需要设计一个逻辑类似栈的状态容器(有学名的,叫“下推自动机”),在Remove一个状态的时候,前一个状态就会到栈顶,作为人物当前状态。
事实上这个栈式的逻辑在其他地方也适用,比如一个人物目前是冲刺状态,会一直朝着前方冲刺,但是会被禁锢技能给禁锢在原地,禁锢效果结束后继续往前冲刺。
技能系统
这里的技能系统指的是我们技能Canvas的“行为树区域”控制的那部分逻辑,也就是技能的运行逻辑,运行到某个节点, ...
基于行为树的MOBA技能系统:总目录
两年磨一剑,梦似已实现
2018年5月,我正式接触Unity游戏开发,学习了一段时间的Unity基础后,开始接触设计模式,游戏框架等知识,在此过程中,数次听到他人谈论战斗系统等相关内容,因为我自己玩Moba游戏多一点,对此也是非常感兴趣,几乎他们每次讨论我都在学(kui)习(ping)。虽然一开始从别人那里学到了很多新的概念和做法,比如Excel表可以导出数据给游戏用,但总感觉他们讨论的开发技能的方法不够灵活。直到有一次我在ET框架游戏交流群听到了群主基于行为树的技能系统的概念,虽然只有寥寥几句,但当我搜索了一下行为树后,我激动万分,没错,这正是我所追求的极致。
在网络上搜索相关关键字却一无所获,但是顺带搜索到了《守望先锋》技术团队在GDC2017分享的三部曲,其中技能系统和网络同步的相关内容让我受益匪浅,我的很多设计就是借鉴了其分享内容,知识积累已经差不多足够我去完成这个大工程了,心意已决,开干!
2019年4月,我创建了仓库,并取名为NKGMobaBasedOnET(之所以叫这个名字原因有二,其一高中开始一起玩LOL的同学们昵称前缀是NKG,其二项目是基于ET框架开发的),提交 ...
基于行为树的MOBA技能系统:技能系统与可视化节点技能编辑器
前言
基于行为树的Moba技能系统系列文章总目录:https://www.lfzxb.top/nkgmoba-totaltabs/
在开始正文之前感觉还是有必要说明为什么需要开发基于行为树的可视化节点技能编辑器(本文简称技能编辑器),并且推荐大家去看下我之前写过的一篇回答:unity怎么去实现act战斗?
试想一下,英雄的技能多种多样,很多技能释放的流程,产生的效果都不一样,可以简单纯粹到如蛮王Q技能的主动回血(泰达米尔消耗怒气,回复生命值),也可以像瑞文那样的三段Q那般复杂(锐雯向前直冲,发起突袭。这个技能可以再次施放另外的2段。 第一段和第二段:向前斩击,对接触到的所有敌人造成物理伤害。 第三段:跃向空中,随后猛击地面,造成物理伤害,并且以冲击点为中心,将周围的敌人击飞。),或者像诺克萨斯之手那让人头痛的被动(在德莱厄斯用斧刃对敌人造成伤害时,敌人会流血,在5秒里持续受到物理伤害,最多叠加5次.
只要有一名敌方英雄身上的【出血】效果叠到最大层数,或死于【诺克萨斯断头台】 ,德莱厄斯就会获得【诺克萨斯之力】,持续5秒,获得额外攻击力,并对命中的敌人施加最大层数的【出血】效果.), ...