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 => 大厅、背包系统展示 => 登录客户 ...
UGUI学习 - 事件系统、射线检测
图片转自大佬博客,非常好的入门:https://zhuanlan.zhihu.com/p/437704772。
事件系统总的来说事件系统分为3个大组件:
EventSystem组件 负责管理 所有的输入检测模块(InputModule)并在Update中每帧调用Module的执行(Process)。
InputModule组件 负责输入(点击、拖拽、选中等),调用Raycaster获得返回值PointerEventData,最后通过ExecuteEvents触发事件(IPointerClickHandler 等)。
Raycaster组件 负责确定目标对象,返回结果PointerEventData给InputModule组件。
相互之间的协作⭐EventSystem会在Update中调用输入模块的Process方法来处理输入消息;
PointerInputModule的Process方法会调用EventSystem中的RaycastAll方法进行射线检测;
RaycastAll又会调用所有BastRaycaster的Raycast方法执行具体的射线检测操作,用以获取屏 ...
什么叫“二进制”配置方案?
前言因为本职是软开,PC以及服务器级平台根本不太在意文件的大小,更在乎可读。所以,一听有大佬和我说“商业项目本地配置读写,用二进制来做”,我真的很懵,刚好自己的demo有用,挖一下。
先说二进制式存储要理解为什么二进制更优,先明白什么是二进制式存储。
什么是二进制文件?所有对计算机有所了解的人肯定都知道计算机的存储在物理上是二进制(01)形式的。所以文本文件与二进制文件的区别并不是物理上,而是逻辑上的。其本质是两者在编码层次上的差异。简单的来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据应用的具体情况自定义自己的编码。
从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8)。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。
文本文件是怎么读取的?文本工具打开一个文件 ...
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 > 打包工具”项。点击跳出制作的窗口以及控件。
使用 ...
Unity生命流程
生命流程图
FixedUpdate1、和Update主帧循环不同,Unity的刚体系统通过固定的时间来驱动也就是FixedUpdate。在刚体系统运算开始前,Unity会根据上一次刚体运算完成的时间再加上Fixed Timestep的所设置的值来作为这一次刚体运算时间的限定范围。然后刚体系统会开始计算,直到达到这个时间限制临界点。
2、FixedUpdate与Update的不同在于,Update在每帧被调用,但是调用时间不确定,所以我们要实现一个物体匀速运动是,是无法通过Update准确实现的,但是我们可以在FixedUpdate中实现,因为它在确定的时间间隔中被调用。FixedUpdate有可能在Update之前调用多次。FixedUpdate除了用来处理物理逻辑之外并不适合处理其他模块的逻辑。
3、FixedUpdate的频率可以自己设置,如果频率过高,导致一次Update的时间片内执行了多次FixedUpdate进行物理运算,那对CPU就是一种浪费(因为根本不显示出来);而适当的低频率FixedUpdate,虽然偶尔会造成人物有顿感,但是往往是可以接受的。
4、FixedUpda ...
UI常见优化
收集一些常见的UI优化手段和思路。当然,大部分是抄的,希望以后自己有能力总结。
Unity性能优化优化关键先找到性能瓶颈。影响图形性能的关键因素主要有一下几个方面。
GPU填充率和存储器带宽。
CPU经常是渲染物体的数量(也就是常常大家说的Draw Calls)。
系统内存容量也是优化的一个关键指标。
GPU优化GPU优化主要有下面几点:
减少三角形的使用数量(去掉不必要的三角形面)。
尽量避免使用实时光照,能使用Static Lighting就使用烘焙光照,只计算一次。
压缩纹理和多重纹理-mipmap(这样可以提高加载速度和降低内存占用),也极大提高渲染的性能。
LOD(多细节层次),不同距离使用不同精度的模型。
编写高性能着色器,将能能处理的逻辑放在定点着色器里面处理,减少片段着色器的计算量。
CPU优化CPU主要开销在,显卡在渲染一个对象之前,CPU需要计算一些着色器和灯光影响,然后想显卡驱动发送绘制指令,单物体来说,不会太影响性能,累计就会产生性能问题。这里优化点主要从以下几个方面讨论,这里只是说出优化常用的方案,后面如果在下在项目里面遇到更 ...
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 ...
UGUI学习 - Base篇
序言源码地址
学习博客
GF源码看了,UGUI自适应用了,自定义编辑器写了,但是对于UGUI却一直是纯黑盒使用。想体系化学习一遍UGUI。
学习目的:按照博客阅读源码,理解后整理成自己的笔记,方便回忆。
目录总览图好图,转自大佬博客!
UIBehaviour
namespace UnityEngine.EventSystems :
public abstract class UIBehaviour : MonoBehaviour
是一个抽象类,里面提供了一系列虚方法:
生命周期(Awake,OnEnable,Start,OnDisable,OnDestroy)
UnityEditor 辅助方法
UGUI 通用方法(IsActive,OnValidate,OnRectTransformDimensionsChange等锚点相关)
和一个非虚方法 IsDestroyed:
1234public bool IsDestroyed(){ return this == null;}


