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.CreateNpRuntime...
理解并实现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 GetValue...
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_collisionrelationvisu...
为Unity搭建完善的的Cmd工作环境
本文章已于2021.5.19更新,Monkey Commander支持指定自定义程序集,大幅优化了扫描程序集耗时。 前言 我们在使用Unity开发游戏的时候,往往会需要GM工具来测试游戏稳定性,在游戏中呼出对话框输入命令行执行对应GM代码是非常高效的(下图来自B站Up:https://www.bilibili.com/video/BV1v741187To) 此外,对于项目中不断增加的MenuItem编辑器拓展,每次使用工具都要去翻找对应的条目也是很麻烦的一件事,尤其是对于嵌套层次稍深的条目。。。 如果有个插件可以在Editor中输入Cmd执行对应MenuItem代码就好了,幸运的是上面提到的两个问题,我都找到了解决方案 正文 Runtime Cmd-UnityIngameDebugConsole 首先是我们Runtime的Cmd,推荐:https://github.com/yasirkula/UnityIngameDebugConsole 插件 下载之后我们只需要把 放到场景中即可 如果我们想要在游戏中根据命令执行某个方法(这是最简单直接的用法,同样还支持参数传递,返回值...
ET篇:云端分布式服务器部署教程
本文章已于2021.9.7更新,更正ET 6.0的地址配置以及含义,新增Linux实操步骤 前言 对于Linux部署的实操部分,参见:https://www.lfzxb.top/recastnavigation-and-et-to-linux 正文 ET6.0版本配置 现在大多人用的都是云服务器,会将外网IP映射到内网IP(网卡IP),所以一般外网地址和内网地址都是内网IP。 实际上我试过将Socket绑定到云服务器的公网IP,会直接报错 但是服务端会将外网地址传递回客户端让客户端连接Gate,但是我们外网IP只能填服务器的内网IP,也就会导致客户端无法和服务端通信,所以我们要多做一列地址专门告诉客户端服务端的外网地址 总结一下 我们约定,服务器公网IP为192.168.0.1,内网IP为44.117.7.8