Unity编辑器拓展基础总结
前言
从事Unity编辑器拓展也有一段时间了,该记录一下常见的知识点了,也方便自己日后查阅
结构
Unity编辑器拓展主要分为3大类
UnityEngine.GUI:可用于编辑器和运行时,需要自行计算Rect
UnityEditor.EditorGUI:只可用于编辑器,需要自行计算Rect
UnityEditor.EditorGUILayout:只可用于编辑器,自动计算Rect
其中UnityEditor.EditorGUILayout基于UnityEditor.EditorGUI实现
常见类
Rect
这个类型在编辑器拓展中十分常见,官方解释为
A 2D Rectangle defined by X and Y position, width and height.
一个由X,Y坐标,width,height宽高定义的2D矩形
其以左上角为坐标原点,X往右递增,Y往下递增
更加详细介绍可参照:Unity Rect官方文档
GUIContent
GUIContent定义了一个GUI Item内容,最完整的构造函数如下
12//构建同时包含文本,图片和定义的toolt ...
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.lfzxb ...
Game Engine EntityObject Models
本文内容来自:https://www.youtube.com/watch?v=jjEsB611kxs&feature=youtu.be&ab_channel=BobbyAnguelov
视频原作者还出了一个续集,主要是针对ECS空间结构的部分重讲,有兴趣可以去看看:https://www.youtube.com/watch?v=fuiNOWEUnJ8&ab_channel=BobbyAnguelov
正文
主要分为两大部分
第一部分:讨论当前游戏业界两种主要的对象/实体(object/entity)模型
Game-Object/Entity Component模型
Entity Component System模型
第二部分:讨论Kruger Entity模型作为一种可替代的方案
Ye Olde Object Model
非常简单随性的方法
不容易拓展,也不容易复用
最后经常会有这些问题:
深层级
继承地狱
重复代码
所有标准OOP会遇到的问题
警告
Object/Entity模式不是必须践行的标准,每个引擎都有自己独特的味道(确实,味道很 ...
GameFramework篇:StarForce学习笔记
流程模块
StarForce流程讲解
环境:StarForce matser 3.1.7
之前我们就提到过流程贯穿游戏的始终,那么今天就来详细的说一下流程模块
ProcedureLauch为游戏入口流程,我们就来看他是什么,他做了什么
一眼看见他继承自ProcedureBase
我们一层层跟进,发现他和状态机有着不可分割的关系,每个流程都是一个状态
他们的关系大体上可以用这个UML图解释,当然这只是非常非常简略的版本,如果要把所有特性都列出来,那将会很庞大的。推荐大家仔细研读这部分代码,体会编程的乐趣与开发者的智慧。
我们需要知道,由基层的Fsm更新来驱动状态机状态的更新,状态机状态的切换也会传递到底层的Fsm上,即一切状态都被Fsm持有与维护
我们就以ProcedureChangeScene这个流程类来熟悉上面的流程图
进入流程时,订阅了一些事件,并且为切换场景做好了准备
流程状态更新,如果场景加载已经完成,就根据需要切换场景。其中的procedureOwner为流程持有者,为GameFramework.Fsm.IFsm<GameFramework.Procedur ...
GameFramework篇:新项目使用GameFramework框架需知
1.AB包相关配置
GF资源管理实属牛批,但要使用它,并不是全自动的,还是要配置一下
创建一个静态类,类名随意,注意里面至少要包含以下三个属性,后面的地址所指就是打AB包所必须的三个配置文件(这个地址可以自己更改,注意改变路径就行)
12345678 [AssetBundleBuilderConfigPath] public static string AssetBundleBuilderConfig = Utility.Path.GetCombinePath(Application.dataPath, "GameMain/Configs/AssetBundleBuilder.xml");[AssetBundleEditorConfigPath] public static string AssetBundleEditorConfig = Utility.Path.GetCombinePath(Application.dataPath, "GameMain/Configs/AssetBundleEditor.xml");[Asse ...
ET篇:ETBook笔记汇总
1.2 为什么使用C# .net core做服务端?
GitHub原地址:
为什么使用C# .net core做服务端?
黑体字为作者(熊猫大佬)原创,红色为个人理解
游戏服务端从早期的单服到分布式,开发越来越复杂,对稳定性,开发效率要求越来越高。开发语言的选择也逐步发生了变化,C 到 C++ 到 C++ + PYTHON 或者C++ + LUA 到现在 很多公司开始使用erlang,go,java,c#。目前是一个百花齐放的局面。
但是如果是要你重新做一个网游server,不考虑对公司或者已有的东西兼容性,你会怎么选择?我仔细想了一下这个问题,大概有这个几个方面需要考虑:
1. 语言的稳定性(致命性)
游戏服务器的特点是高负载低延时。所以一般服务端进程都是带状态的,一旦挂掉就意味着数据丢失,这点是无法容忍的。
2. 运行时热更(致命性)
游戏服务器逻辑极其复杂,很容易出现bug,但是又不能经常停服,所以热更修复bug就显得十分必要。出现错误开发人员可以立即编写代码,然后热更修复,线上用户完全感觉不到。
3. 是否有协程支持(重要性5星)
分布式服务器架构,进程与进程之间必然会有 ...
纹理映射
纹理映射
在尝试复制真实世界的外貌时,人们很快意识到几乎任何物质的表面都是有特征的。木材长有纹理。皮肤长有皱纹;布料会有编织结构;油画会有画刷或滚筒留下的痕迹,即使是光滑的塑料也会有制作他的模具的凹凸不平的痕迹,并且光滑金属显示出机器加工过程的痕迹。材料的没有特征的地方很快也会被斑点,凹痕,污点,划痕,指纹和污垢覆盖。
在图形学中,我们把这些现象统称为“空间上表面属性的变化”——表面的属性在每一处地方都在发生着变化,但并没有真正意义上改变表面的形状,考虑到这些因素,所有的建模和渲染系统都提供了一些纹理映射的涵义:使用一个被称作纹理贴图,纹理图像,或者仅仅是一个纹理,来存储这些你想要在一个表面上展示的细节,然后进行数学处理,把这个图片“映射”到表面上。
事实证明,一旦存在将图像映射到表面的机制,就会有很多奇淫技巧,这些技巧已经超过了我们介绍表面细节的基本目标。纹理可以用来制作阴影和反射,提供光照信息,甚至定义表面形状。在复杂的交互程序中,纹理经常被用于存储与其作为一张图片毫无干系的的数据(这里不知道怎么组织语言了,举个例子就是我们可以把骨骼动画烘焙到一张纹理中,从而让GPU去执行蒙皮 ...
FEAR基于GOAP的AI系统GDC分享(中英双语)
前言
经过前一篇对于GitHub开源库ReGoap的介绍,想必大家都对GOAP这一AI方案有一定的了解了,那么今天,我们就来更加深入的了解一下,FEAR这款游戏是如何运用GOAP技术的吧。
注:
正文中的规划/计划系统字样一般都可以当做GOAP系统。
正文中的动作/行为/操作字样一般都可以当做Action。
正文中的效果/影响字样一般都可以当做Effect。
正文中的目标/目的字样一般都可以当做Goal。
正文中的记忆/内存字样一般都可以当做Memory。
资源链接
ReGoap开源库:https://link.zhihu.com/?target=https%3A//github.com/luxkun/ReGoap
ReGoap开源库中文文档:https://link.zhihu.com/?target=https%3A//www.lfzxb.top/goal-oriented-action-planning-chinese-document/
PDF链接:https://link.zhihu.com/?target=http%3A//alumni.media.mit.edu ...
Unity资源批处理编辑器工具技术概要
前言
我们在项目中往往有大量的美术资源,包括但不限于,贴图,模型,动画等,而我们基本上很多资源都是应用的同一套导入配置,如果人为来进行配置的话会非常麻烦,还很容易出错,所以需要一个工具来处理他们导入时的配置,以及已经存在于项目中的资源进行批量配置。
正文
每个资源的AssetImporter面板设置下文统称为规则
技术概要
首先是应用规则匹配机制的制定,一般有文件夹,文件夹+文件部分关键字两种匹配机制。
Unity提供了一个AssetPostprocessor类支持我们进行资源导入的预处理和后处理操作。
我们的每个规则必须对应一个临时文件,用于存储规则来进行批处理。
对于导入资源的规则赋值我们采用反射的方式,但是请注意剔除引用类型和保留部分枚举类型。
对于贴图类型,比较特殊,他有对每个平台的差异化配置,而这一类型又是引用类型,所以对此只能单独处理,采用GetPlatformTextureSettings方法来对不同平台设置进行获取,通过SetPlatformTextureSettings来对不同平台进行设置。
配置好之后请务必调用assetImporter.SaveAndRe ...
Unity Shader入门精要学习笔记:透明效果
透明效果
透明是游戏中经常要用的一种效果,在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,他还有另外一个属性——透明度。当透明度为1时。表示该像素是完全不透明的,而当其为0时,则表示改像素完全不会显示。
在Unity中,我们通常使用透明度测试(这种方法其实无法得到真正的的半透明效果)和透明度混合实现透明效果。
对于不透明物体,不考虑他们渲染顺序也能得到正确的排序效果,这是由于强大深度缓冲(depth buffer也被称为z-buffer)。
在实时渲染中,深度缓冲是用于解决可见性问题的,核心思想:根据深度缓冲中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在与深度缓冲中的值进行比较(如果开启了深度测试),如果它的值距离摄像机更远,则不需要渲染到屏幕(有物体挡住了它),否则这个片元将会覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启深度写入)。
但是如果要实现透明效果,当使用透明度混合时,我们关闭了深度写入(ZW ...