UGUI学习 - Button
整体流程Button继承自Selectable、IPointercliClickHandler、ISubmitHandler。
外部注册IPointerClickHandlerIPointerClickHandler接口仅包含一个OnPointerClick()方法,当鼠标点击时会调用该接口的方法。而Button能触发点击事件是因为继承自IPointerClickHandler接口,并且重写了OnPointerClick方法。那IPointerClickHandler接口的方法又是被谁调用的呢?查找引用,发现是ExecuteEvents类的Execute方法,并且Execute方法赋值给s_PointerClickHandler字段。
没错,ExecuteEvents,和之前我在UGUI学习 - 事件系统、射线检测的分析一致。
AddListener那么onClick.AddListener()的本质也可以挖一下,其实就是监听了 public ButtonClickedEvent onClick。而这个追溯到最底层,就是对一个回调方法队列进行List.Add()。
Unity调用也是和 ...
AOI视野管理
什么是AOIAOIAOI(Area of Interest),一般指一个游戏对象在所处游戏场景(MMO居多)中的视野范围。
因为玩家和较远距离的角色不会产生互动,所以不需要他们的状态,只要关注、同步视野范围内的其他单位即可。
AOI主要方式
暴力计算:每隔一定帧数,就执行一次位置计算
十字链表:只关注上下左右四个方位。
九宫格:
UGUI学习 - LayoutSystem布局系统
学习博客:https://blog.csdn.net/qq_28820675/article/details/106245195
CanvasUpdateSystem中更新布局的具体实现系统。
布局 LayoutSystem也就是上一篇中说的 Canvas刷新系统 中,重建得2个数组之一Layout数组是怎么来的、又是怎么重建得。
什么时候标记也是用脏标记。时机一般为尺寸改变时(RectTransform Dimensions)。
标记后干什么UGUI组件(如Graphic、ScrollRect…)在需要布局处理时(也就是被标记或OnDisable时),会把自身的RectTransform组件用LayoutRebuilder对象包装,之后加入Layout数组。
重建布局这个的执行时机,在画布刷新系统那篇里有细写。
12345678910111213// CanvasUpdateSystem触发重建public void Rebuild(CanvasUpdate executing){ switch (executing) { cas ...
UGUI学习 - 画布刷新、重建
学习博客:
https://blog.csdn.net/qq_28820675/article/details/105746002
https://blog.csdn.net/gaojinjingg/article/details/103565840
更好的入门文章:
https://zhuanlan.zhihu.com/p/448293298
由Canvas控制,通过 ICanvasElement 接口,使用脏标记方法来统一更新CanvasElement
扫盲摘自大佬博客。
Canvas, 是Unity渲染系统给层状几何体( layered geometry )提供的可以被画入、被放在上面或者放在世界空间的底层Unity组件。Canvas负责将它包含的几何体组合成batch,生成合适的渲染命令发送给Unity图形系统。这个过程在底层的C++代码中完成,这个过程被称为一次rebatch或者一次batch build。当一个Canvas被标记为包含需要rebatch的几何体时,这个Canvas被认为是dirty的。
layered geometry , 由Canvas ...
王者荣耀复刻项目 展示
Demo简介个人Demo项目,所有代码都已在github开源。// 个人博客:CodingCodingK.top github首页:github.com/CodingCodingK
使用Unity客户端、.net core服务端实现类王者荣耀帧同步Moba手游。系统方面主要实现了背包系统;战斗方面,实现了主要游戏流程、实现了3个人物及其技能:亚瑟、后裔、金克斯(lol)。
使用UDP通信、Protobuf协议实现帧同步网络通信库
使用Odin、xNode实现自定义可视化编辑器,且保持数据一致
使用Luban实现本地Excel数据配置导表方案
使用对象池、虚拟列表等进行背包系统优化
使用定点数实现碰撞环境生成、确定性物理碰撞检测
实现基于客户端负责计算的帧同步Moba战斗系统
不同客户端独立计算的显示结果统一与运动平滑
逻辑层与显示层分离,复用技能、Buff、子弹逻辑代码的战斗系统
业务内容上,大致实现了登陆系统、大厅主城、背包系统、匹配系统、选角系统、加载系统、战斗系统。
Demo演示视频⭐1P 游戏内容展示:登录客户端1 => 大厅、背包系统展示 => 登录客户 ...
什么叫“二进制”配置方案?
前言因为本职是软开,PC以及服务器级平台根本不太在意文件的大小,更在乎可读。所以,一听有大佬和我说“商业项目本地配置读写,用二进制来做”,我真的很懵,刚好自己的demo有用,挖一下。
先说二进制式存储要理解为什么二进制更优,先明白什么是二进制式存储。
什么是二进制文件?所有对计算机有所了解的人肯定都知道计算机的存储在物理上是二进制(01)形式的。所以文本文件与二进制文件的区别并不是物理上,而是逻辑上的。其本质是两者在编码层次上的差异。简单的来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据应用的具体情况自定义自己的编码。
从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。
文本文件是怎么读取的?文本工具打开一个文件 ...
工具篇:定点数物理碰撞库
定点数基于《工具篇:定点数运算数学库》的定点数库。
处理流程1.读取配置:初始化碰撞环境
2.读取配置:初始化玩家碰撞体
3.FixedUpdate(具体看《Unity生命流程》):固定帧率检测碰撞发生
碰撞配置ColldierConfig。
长方体类型:位置、长宽高、轴向。
圆柱体类型:位置、半径。
碰撞体逻辑-视图分离只维护逻辑值,视图则根据定点数逻辑值转换成浮点数来进行更新。但是,视图层更新后并不参与任何运算,只显示。
碰撞环境环境初始化的前提是根据固定方式制作地图:只用 BoxCollider 和 CapsuleCollider 两种碰撞体,且全部放在一个EnvRoot结点下。
初始化时,遍历这个根节点,将所有的BoxCollider转化为定点数长方体形碰撞体,将所有的CapsuleCollider转化为定点数圆柱体形碰撞体。
生成下来,放到一个List中保存。
碰撞检测+矫正计算(一对一)Cylinder碰到Box
1.求出 向量OK = Cylinder.Pos - Box.Pos。
2.求出 向量OK 分别在 Box.X方向向量、Box.Z方向向量 上的投影的长度:
使用 ...
Unity协程原理
开启一个协程发生了什么分析如下代码:
12345678910111213141516public class TestScript : MonoBehaviour{ private void Start() { StartCoroutine(ShowLog()); } IEnumerator ShowLog() { for(int i = 0; i < 100; i++) { Debug.Log(i); yield return new WaitForSeconds(1f); } }}
先描述一下里面用到的方法和类:
StartCoroutineStartCoroutine是 Monobehavior类的函数,有3个重载函数
public Coroutine StartCoroutine(string methodName); public Coro ...
Unity编辑器拓展
初识编辑器拓展支持
菜单栏选项
菜单栏窗口
面板式编辑器
窗口式编辑器
unity editor是一个通用的编辑器,提供了unity内部对象的创建,预览,编辑的功能及可视化界面。 用于扩展editor的类需要放到名字为“Editor”的文件夹中,这个文件夹可以直接放到”Assets“文件夹下,也可以是项目目录任何文件夹下的子文件夹,比如”Assets/SkillSystem/Editor”。
原理重新绘制画面,主要是通过重写OnGUI、OnInspectorGUI之类的函数来实现的。
这些函数是生命周期中的一员,具体看Unity生命流程图。
简单使用对上面提出的支持进行简单实践。
菜单栏选项菜单栏里添加“Tools > 打包工具”项。点击执行方法。
1234567using UnityEditor;[MenuItem("Tools/打包工具")]public void OutputAB(){ ......}
菜单栏窗口菜单栏里添加“Example > 打包工具”项。点击跳出制作的窗口以及控件。
使用 ...
UI屏幕自适应
基础概念面板基本
当我们点击一个GUI物体是它具有的属性为:
Rect Transform:继承自Transform组件,它表示的是控件的Location位置,和一些基本的属性。这个控件的参数类型会随着锚点情况而改变,具体在下一节展示。
Pivot:设置轴心(不是蓝色的,那个叫中心锚点)的位置,中心点的位置【0,0】表示的是控件的左下角的位置,【1,1】表示的是右上角的位置,【0.5,0.5】表示的是图像中心的位置。
Anchors:它的取值和Pivot一个逻辑,也是0~1之间。Min点和Max点是2个点,2个点可以沿着x、y方向,确定出一个矩形。而这个矩形的4个点就是4个锚点。我们也可以直接拖动画面的锚点来快捷设置。
Pivot 和 CenterPivot上面说了,是轴心,可以自己在Rect Transform的面板里设置;
Center是中心,是在Unity中根据模型的mesh信息计算得到的中心位置,是所有物体共同的中心,如果同时选中了多个物体,则坐标是所有模型共同参与计算出来的坐标。
Center是由Unity计算出来的而不是设置出来的。Pivot在锚点重合情况下,代表着PosX ...