Unity DOTS:Systems部分
Systems
一个system,也就是ECS里的S,提供了将component的数据从其当前状态变换到其下一个状态的逻辑-例如,一个system可以通过velocity乘以Time.deltaime来更新所有可移动entities的位置。
Instantiating systems
Unity ECS自动在您的项目中发现system类型,并在运行时实例化它们。它将每个发现的system添加到默认system groups之一中。您可以使用system attributes来指定system的父组以及该system在该group中的顺序。如果未指定父项,则Unity将以确定性的,但并未指定顺序的将system添加到默认世界的Simulation system group中。您也可以使用attribute禁用自动创建。
system的更新循环由其父ComponentSystemGroup驱动。ComponentSystemGroup本身是一种特殊的system,负责更新其child systems。group可以嵌套。system从运行的world获取time数据;time由Up ...
基于Github使用Hexo建站过程记录
前言
从WordPress刚转过来,感觉很爽,本主题基于butterfly:https://github.com/jerryc127/hexo-theme-butterfly 配置,本文记录Hexo建站过程中遇到的问题和相关解决方案。
快速入门Hexo
https://www.cnblogs.com/liuxianan/p/build-blog-website-by-hexo-github.html
npm Install卡住
使用代理registry
1npm config set registry https://registry.npm.taobao.org
来自OSS的图片无法显示
因为防盗链的原因,所以需要给每个md文件加上
1<meta name="referrer" content="no-referrer" />
详见:https://segmentfault.com/a/1190000017896469
Hexo更换电脑重新部署
https://www.jianshu.com/p/906294181814 ...
2020个人年度总结
今年的时间线很简单,最主要还是因为疫情原因吧。(好吧,我本身也是个比较无聊的人,打代码,打游戏,吃饭,睡觉,但是我对这样的生活不感到枯燥,反而有种岁月静好的感觉,hh。)
简单归简单,好说歹说也发生了对我人生影响重大的一件事不是?
那么,让我带你坐上时光机器,回溯我的2020吧。
一月
这个月本来是平平无奇的,十几号放假回的家,因为疫情原因,印象中月底的时候学校就发布消息准备延迟开学了。
印象中我是1.8号开始投递的简历,第一次投简历就投的腾讯,现在想起来我是真的莽夫。
对于新冠时间线,有兴趣的可以去看网友的整理:https://zhuanlan.zhihu.com/p/107418492?from_voters_page=true。
二月
二月中再次收到推迟开学的消息,我继续到处投简历,网龙,畅游,网易雷火,网易互娱,米哈游,4399等有点名气的我都投了一遍,期间应该有一场网易雷火的面试,也是我第一次面试,但我也没有很紧张,面试官也很亲和,很愉快的一次面试经历。
然后这个月好像就没什么事情了,嗯,没错。
三月
三月的时候貌似就直接通知这学期的课程全部转线上了,有点爽,为期大半 ...
为NPBehave而生的可视化编辑器介绍
介绍
什么是NPBehave?https://www.lfzxb.top/npbehave_doc/
使用到的库
ET:一个基于C#的游戏客户端,服务端框架!
Node_Editor_Framework:一个强大的可视化工具!
Odin:Unity编辑器拓展神器!
编辑器截图
这是一个官方例子的可视化版本
支持导出配置文件,供客户端或者服务端读取
运行结果与官方示例一致
使用方法
1.在Unity编辑器的菜单栏,选择Tools/其他实用工具/多功能可视化编辑器即可进入编辑界面
2.然后这样可以创建一个Canvas
3.随便找个空地进行右击
4.鼠标左键点击某一个数据结点即可在Inspector面板显示其包含的数据
5.然后按照自己想要的结果把他们连接起来
6.鼠标左键点击一个空地,即可调出导出配置界面,然后即可进行导出工作。
7.最后在代码里创建自己想要的行为树,Start即可,其中的ID即为我们导出配置时上面显示的根节点ID!
12NP_RuntimeTree npRuntimeTree = NP_RuntimeTreeFactory.CreateNpRunti ...
理解并实现LOL中的攻速机制
前言
攻速机制是Moba游戏中非常重要的机制之一,他会和状态机制,Buff机制产生联系,但是网上却少有详细介绍攻速机制并实现的文章,故有此文。
名词定义
因为为了描述清楚攻速机制需要有一些专有名词,为了避免歧义,本文中的名词及其相关释义如下所示(下面提到的所有概念均为我们逻辑层概念,和动画没有任何关系)
基本攻速:也即基础攻击间隔(BAT)的倒数,即两次攻击之间的间隔时长,比如一个英雄BAT为0.5,即0.5s攻击一次,那么它的基本攻速就是2,大部分英雄基本攻速不一样
攻速收益:对于攻速加成的实际转换比例,比如一双攻速鞋+35%攻速,如果一个英雄攻速收益是50%,那么他真正获得的额外攻速就是17.5%,大部分攻速收益不一样
额外攻速:是指通过Buff,装备,技能,等级成长获得的攻速,计算公式为:额外攻速 = 额外攻速加成 * 攻速收益
总攻速:计算公式为:最终攻速 = 基本攻速 + 额外攻速
基础攻击前摇:攻击打出伤害之前的时间段,在此时间段中对攻击指令进行主动/被动取消都将终止此次攻击,并且没有伤害,大部分英雄基础攻击前摇不一样
攻击前摇:计算公式:基础 ...
实现行为树黑板模块0GC赋值功能
引言
因为行为树中的黑板模块可以存储任意类型的数据,并且默认是以System.Object存储的,所以我们在进行赋值的时候,难免会出现装箱的情况,偶尔的一次装箱也没什么,如果是每帧的装箱。。。不会真有人能忍吧,不会吧,不会吧,不会吧
再多说几句,目前我在使用行为树做技能编辑器,之所以可能会出现上面说的每帧的装箱的情况,是因为我打算把行为树中所有的关键数据都放到黑板中,这样有很多好处
方便状态预测/回滚
方便Debug,逐帧调试
方便满足策划的所见即所得需求
上面说的这些我会在实现之后再和大家分享,有兴趣的可以先关注我的开源Moba项目
正文
要实现黑板赋值的0GC,就是要把他的装箱那一步给去掉,所以理所当然的,我们要自己封装数据类型
基类
1234public abstract class ANP_BBValue{ public abstract Type NP_BBValueType { get; }}
12345public interface INP_BBValue<T>{ T GetValu ...
Box2D篇:进阶知识整合(刚体操作,碰撞处理)
刚体操作
DestroyFixture(b2Fixture)
删除b2Fixture组件 通过b2World.Raycast和b2World.QueryAABB来获取要删除的b2Fixture组件
ApplyForce(force,point)
添加作用力到刚体上 force:要施加的力的大小,单位是N
point:要施加力的点,这是一个全局坐标(世界坐标)
ApplyImpulse(impulse,point)
添加冲量,单位是N*m。
ApplyTorque(Torque)
Torque:扭力大小,为正表示顺时针,为负表示逆时针,单位kg*rad/s
GetLoaclXXX,GetWorldXXX
用来实现本地坐标,向量和全局坐标,向量之间的转换
GetLocalCenter
获取刚体重心的本地坐标
GerWorldCenter
获取刚体重心的全局坐标
GetLoalPoint(worldPoint)
获取全局坐标点worldpoint在刚体坐标系统中的本地坐标
GetWorldPoint(localPoint)
获取本地坐标点localPoint在舞台坐标系 ...
Box2D篇:基础知识整合
初入Box2D
创建Box2D物理世界
12// Vector2为x与y方向加速度World = new World(new Vector2(0, -9.8f));
明确换算单位
Box2D中的计量单位是米(m),而目前大部分的平台渲染都是基于像素px的,所以在进行渲染计算时,要注意对坐标或形状尺寸进行转换。通常 $$1m=30px$$
开启2D模拟
调用World.Step(float timeStep);函数进行世界的模拟与刷新。 注意Box2D中计时单位是秒,不是帧!
timeStep
每次调用刷新函数间隔,由于Box2D世界计时单位是秒,所以要进行转化。 比如你游戏想运行在60帧,即一秒刷新60次,每次耗时1/60秒,那么timeStep = 1/60;
初识刚体
什么是刚体
一个固态的物体,他至少包含看得见或者摸得着这两个特性之一。 b2Body是Box2D的核心类,是学习Box2D的基础,也是重中之重。
创建刚体
创建一个刚体,不单单是b2Body的事情,还要创建多个对象,包括b2BodyDef和b2FixtureDef对象,然后在这些对象的协同合作下,完 ...
Box2D篇:重要注意点
本博客记载使用Box2D过程中的知识点
只有两个刚体至少有一方为dynamic时才会发生碰撞
刚体旋转以重心为圆心进行,刚体旋转带动图形旋转
如果需要运动的刚体进行碰撞,AllowSleep要为false
Box2D篇:整合Box2D到项目,并支持导出数据到服务端
Box2D介绍
为游戏打造的2D物理引擎,就像Unity自带的2D物理引擎一样的功能
Box2D官网
http://box2d.org
白纸无字大佬整合的Box2D地址
https://github.com/Zonciu/Box2DSharp
绪论
因为服务端对某些技能进行击中判定,所以需要一个不依赖于Unity的物理引擎库,对于我做的Moba游戏,Box2D无疑是最佳选择。
如果是FPS游戏想在服务端做碰撞检测,需要3D的物理引擎库,因为你用2D物理引擎无法进行爆头,腰射这种判定。
具体步骤
下载白纸无字的Box2D
客户端配置
运行link.bat批处理命令
然后只需要将这几个文件放到项目的Plugins文件夹下面即可
服务端配置
同样的,我们在服务端创建Box2D项目
注意要开启允许不安全代码才不会报错
Box2D碰撞体数据可视化编辑器
https://www.lfzxb.top/box2d_unityvistualeditor/
Box2D碰撞体碰撞关系可视化编辑器
https://www.lfzxb.top/box2d_collisionrela ...