实现行为树黑板模块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
ET&&FGUI接入xasset流程
本文章已于2021.7.9更新,修复FGUI释放UI包时,ab释放所有权问题。感谢网友 小太阳 的提醒。 本文章已于2021.3.29更新,FGUI编辑器升级到2021.1.0,FGUI SDK升级到4.2.0,新增FGUI资源加载全异步支持,简化大量代码。感谢网友ˇ℉un . Shīne的提醒。 前言 技能系统暂时告一段落,现在要花点时间规范一下客户端这边的资源管理以及一些流程优化,这里选择轻量高效资源管理框架xasset:https://github.com/xasset/xasset 版本为:https://github.com/xasset/xasset/commit/3d4983cd24ff92a63156c8078caf34b20d2d4c02 代码量很少,一天就能看个差不多,但是质量很高,如果只追求使用的话,是可以开箱即用的。 另外我对xasset底层源码做了一些修改,主要是为了迎合我们ET传统艺能await/async样式代码,所以推荐大家直接使用我项目(下文的Moba项目)中的xasset源码 想要入门此资源管理框架的可以查看:https://www.lfzx...
ET篇:使用FairyGUI进行开发的流程
本文章已于2021.8.31更新,新增为ET6.0而生的FGUI插件(Lua版本)安装与配置相关教程 本文章已于2021.1.29更新,新增为ET5.0而生的FGUI插件(Lua版本)安装与配置相关教程 环境准备 FairyGUI 官网:http://www.fairygui.com 编辑器下载:http://www.fairygui.com/product/ 官方教程:http://www.fairygui.com/guide/ 开发工具 Unity 2017.4 Rider 2018.3 ET5.0 感谢有招小弟的大佬吗的大力支持 Duke大佬的FairyGUI分支 链接:https://github.com/DukeChiang/DCET Unity项目结构梳理 Hotfix部分 Asset/Bundles/FUI/Common_atlas0.png:会被打成AB包的FGUI图片资源(AB标签:Common.unity3d) Asset/Bundles/FUI/Common_fui.bytes:会被打成AB包的FGUI布局数据(AB标签:Common_fui.unity3...
ET篇:那些千万不能踩的坑
本篇博客记录ET中所有的坑,希望对大家有帮助 前方高能预警 1.不要在热更层的async语句中使用try Catch finally语法,因为finally语句不会执行(在Try或Catch中执行Return)!** 2.报错信息:BsonSerializationException: When using DictionaryRepresentation.Document key values must serialize as strings. 原因:Bson默认序列化需要string的key 解决方案:https://stackoverflow.com/questions/28111846/bsonserializationexception-when-serializing-a-dictionarydatetime-t-to-bson** 3.报错信息:Element 'Id' does not match any field or property of class 原因:使用Bson反序列化之前没有对牵扯到的继承关系进行注册 解...











