Games101 - 矩阵变换入门
向量 Vector小概念数学上叫做向量,物理上喜欢称作矢量。
向量的模 Magnitude。
向量的归一化,意味着求单位向量 unit Vector。
向量矩阵下面是在表示笛卡尔坐标系x-y下的某个向量,可以用矩阵来表示向量。
点乘 Dot满足交换律、结合律、分配律。
结果是一个数值,可以用来检测2个向量的夹角,<90度为正,90度为0,90~180度为负。
叉乘 Cross不满足交换律!向量A x 向量B = -向量B x 向量A
结果是一个向量,这个向量是与A、B向量所组成平面的垂直向量,也就是说A、B、C向量构成一个右手直角坐标系。而法线的方向,满足右手螺旋。注意a在前所以a是食指。
图形学上,用来检测某个点是否在一个多边形(比如三角形)内。
因为 向量AB x 向量AP 的结果大于0则说明P在AB左侧,小于0则说明P在AB右侧。
所以一个三角面ABC和一个点P,只要通过3次叉乘的结果(都大于0或者都小于0),就能判断出点P在三角面ABC中。这是光栅化的基础,用于着色判断。
矩阵变换:线性变换关键是,要找出变换前后每一个点之间的变化关系式。矩阵的乘法是不满足交换律的。 ...
Games101 - 导学
计算机图形学看一个游戏的图形方面做得如何,一般可以参考画面亮不亮,原因是这关系到了全局光照。
光栅化 Rasterization把三维的几何形体画在屏幕上,这个画的过程,就叫光栅化。
几何学 Curves and Meshes光线追踪 Ray Tracing从相机发射光线穿过每个像素,计算交集和阴影,并继续反射光线直到它们击中光源。
动画、仿真 Animation/Simulation其他行业应用。
总结描述整个渲染管线现代GPU常规流程。具体的可以看渲染管线篇。
0.一堆三维空间的顶点。
1.将顶点做MVP变换,拉伸转换成2维平面。这步涉及2种相机、根据相似三角形确定的拉伸矩阵、纹理映射。(如果是顶点着色模式,这在一步,还会进行Shading。
纹理映射:这一步就要做,因为需要在3维空间内和uv贴图进行一一映射。关系是 二维像素 - 三维平面 - uv贴图。
2.将二维平面的点进行连线,做出大量三角面(顺时针为正面)。
3.将三角面进行采样,投射到屏幕的像素点上,这一步叫光栅化。这步涉及:光栅化的预处理视口变换、采样阶段的优化包围盒、为了抗锯齿做的预处理(滤波、模糊)。
...
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编辑器拓展
初识编辑器拓展支持
菜单栏选项
菜单栏窗口
面板式编辑器
窗口式编辑器
unity editor是一个通用的编辑器,提供了unity内部对象的创建,预览,编辑的功能及可视化界面。 用于扩展editor的类需要放到名字为“Editor”的文件夹中,这个文件夹可以直接放到”Assets“文件夹下,也可以是项目目录任何文件夹下的子文件夹,比如”Assets/SkillSystem/Editor”。
原理重新绘制画面,主要是通过重写OnGUI、OnInspectorGUI之类的函数来实现的。
这些函数是生命周期中的一员,具体看Unity生命流程图。
简单使用对上面提出的支持进行简单实践。
菜单栏选项菜单栏里添加“Tools > 打包工具”项。点击执行方法。
1234567using UnityEditor;[MenuItem("Tools/打包工具")]public void OutputAB(){ ......}
菜单栏窗口菜单栏里添加“Example > 打包工具”项。点击跳出制作的窗口以及控件。
使用 ...