Unity渲染顺序
在开始学习Unity渲染顺序之前, 我们最好对Unity事件执行顺序有一定的了解, 也就是下面这张图
Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗?
如何理解UI的渲染如何理解Mesh的渲染无论UI还是模型, 都是要先更新顶点的位置等信息, 然后再渲染出来, 实际渲染都是在RenderObject的时候, UI的顶点信息更新也是知道的, 模型顶点等数据的更新在什么时候呢?除了UI以外, 普通的模型, 每一帧里面模型的顶点也都会发生变化, 那模型的
Unity中一个场景下的所有物体,不论是UI、2D物体还是3D物体,都是在一个三维空间中进行渲染的,然后我们透过场景中的一个或多个摄像机观察场景中物体渲染后的遮挡关系。当我们看到物体之间存在某种遮挡关系时,我们一般会直观地认为这是由于不同物体与摄像机之间的距离不同导致的。Unity确实会根据物体距离摄像机的距离来决定渲染结果,除此之外Unity中还提供了其他方式来影响渲染结果,进而改变物体之间的遮挡关系,比如对于两个Canvas物体,我们可以设置离摄像机远的Canvas的SortingOrder大于离摄 ...
排序算法
Github仓库
冒泡排序(Bubble)思想代码实现快速排序(Quick)思想快速排序引入的pivot的概念,每次遍历序列时,从这个序列中选一个数(一般可以选择序列中的第一个数),遍历完一遍序列之后能够找到被选中数在这个序列中的位置,将该位置标记为pivot,交换pivot左侧大于pivotValue的数和右侧小于pivotValue的数,最终交换index为pivot和被选中数所在index位置,接着以该pivot为界将序列拆分成两个子序列,重复上面的操作,直到序列的长度为1.
时间复杂度快速排序不是一个稳定的算法,原因是pivot的取值会导致pivot两侧序列长度不是相等的,最坏的情况是,pivot每次取值取得都是数组中最大的那个值,这样他的分治递归层数就是n,在每一层中都需要遍历完所数组中所有的元素,因此每一层中的时间复杂度是n,所以最坏情况下快速排序的时间复杂度是O(n^2).
平均情况下,快速排序的分治递归层数为logn,时间复杂度是O(nlogn).
注意分区结束时:left 指向第一个大于或等于 pivotValue 的元素。right 指向最后一个小于 pivotVa ...
数据结构——树
二叉树的各种遍历方式的完整C++代码在github仓库上
二叉树遍历
按照遍历方式可以分为递归遍历和迭代遍历
按照遍历结果可以分成深度遍历和广度遍历
广度优先遍历层序遍历深度优先遍历深度优先遍历按照遍历方式可以分为递归遍历和迭代遍历, 按照遍历结果可以分为前序遍历、中序遍历和后续遍历, 前、中、后序指的是父节点的遍历顺序.
递归方式递归方式调用栈这种方式与二叉树的三种深度优先遍历方式天然契合 节点的遍历顺序和节点的处理顺序完全一致使用迭代方式是需要我们额外模拟调用栈的作用机制 让他表现为节点的便利顺序 和处理顺序一致
前序遍历
配套练习 144.二叉树的前序遍历
遍历顺序 中->左->右
12345678910111213141516171819202122232425template <typename T>void BinaryTree<T>::InnerPreorderTraversalRecursion(BinaryTreeNode<T> *cur, Queue<BinaryTreeNode<T>> ...
Unity中的动态链接库
啥是动态链接库如果你在搜索引擎上直接搜索动态链接库的定义, 搜索结果大部分都会与Microsoft以及Windows平台有关: 动态链接库(Dynamic Link Library,DLL)是微软公司在Windows操作系统中实现共享函数库的一种机制,旨在解决静态库代码冗余问题。其核心原理是程序编译时仅标记所需库文件,运行时由系统加载器动态载入内存,实现多程序共享同一份库代码,减少资源占用。在非Windows平台上也存在和动态链接库一样共享代码的机制, 只是不叫动态链接库罢了. 笔者在这里想讨论是DLL这种代码共享的思想机制, 不局限在Windowsw平台上, 因此下文中任何平台的代码共享库笔者全部称之为DLL或动态库.
动态链接库分为两种: 由原生语言(Native Languagege)*编写并编译的原生DLL和由托管类语言(Managed Language)编写并编译的托管DLL**.原生DLL是传统意义上的DLL, 这类DLL在不同的平台有各自动态链接库的文件格式. 在Windows上是.dll, 在Mac上是.dylib, 在Linux上是.so. 原生语言编写出来的程序,经 ...
UML图学习笔记
背景https://cloud.tencent.com/developer/article/1684161
UML图有很多中,但是并非必须掌握所有的UML图,才能完成系统分析和设计工作。一般来说,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就可以做80%的事情。对于程序员来说,最频繁使用的莫过于类图。因此我们先主要探讨类图,其他的图我们在之后会不断补充进来。
类图类图是面向对象系统建模中最常用和最重要的图,是定义其他图的基础。类图主要是用来显示系统中的类、接口以及它们之前静态结构和关系的一种静态模型。类图中最基本的元素是类、接口。我们设计出类图后,就可以用代码实现类图中包含的内容。
类图中具体类、抽象、接口和包的表示方法UML类图中具体类、抽象类、接口和包有不同的表示方法。
在UML中表示具体类具体类在类图中用矩形框表示,矩形框分为三层:第一层是类名;第二层是类的成员变量;第三层是类的方法。成员变量以及方法前的访问修饰符用符号来表示:
+表示public
-表示private
#表示protected
不带符号表示defaul ...
关于协程Coroutine
Unity中的协程和真正的协程并不是一回事Unity的协程这个概念还真有可能会让只接触过Unity的C#开发者产生误解, 比如在实际开发中, 一个资源同步加载的时间太久, 就会阻塞游戏进程, 于是我们希望异步加载这个资源, 我们的做法可能是将调用Resources.Load接口改为Resources.LoadAsync接口. 然后将资源加载的方法返回类型改为IEnumerator, 调用StartCoroutine启动这个协程, 一气呵成. 如果你从未想过上述这一切Unity和C#编译器在背后为我们做了什么, 那么你肯呢个会产生下面三个误解: 一是误以为Unity中所说的协程和操作系统级别的协程是一个概念; 二是把异步和协程甚至线程概念挂钩, 认为要实现异步必须依赖协程或者线程. 三是yield return关键字的误解, 认为后面只能跟协程、WaitForSeconds.
拨乱反正Unity中的协程(Coroutines)并不是严格意义上的“真协程”,而是基于C#迭代器(IEnumerator)和Unity引擎的帧调度机制实现的一种协程模拟. 在游戏开发的客户端领域, 我们在日常开发 ...
ET中反射与特性的使用
ET中用到的其他Attribute[BsonIgnore][UnityEngine.HideInInspector][MemoryPackIgnore]
2025.3.20更新
笔者最近在看ET框架的Demo,里面有一个名为CodeLoader的脚本,里面用到了反射的东西
反射可以直接与程序集交互,越过常规的类构造函数,直接由程序集中实例化出对象来.通过反射执行方法/实例化对象的方式也有缺点,在Editor中无法直观定位到调用
Assembly程序集提供给了一个GetTypes()接口,允许你访问该程序集中包含的所有TypeType中存储了FullName、以及这个Type所处的程序集
在CodeTypes脚本的Awake方法中123456789101112131415161718192021public void Awake(Assembly[] assemblies){ Dictionary<string, Type> addTypes = AssemblyHelper.GetAssemblyTypes(assemblies); foreach ...
关于命名空间
命名空间的设计目的是提供一种让一组名称于其他名称分割开来的方式,在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
我们举一个计算机系统中的例子,一个文件夹中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。
自定义命名空间命名空间的定义是以关键字namespace开始,后面跟命名空间的名称,如下所示:
1234namespace namespace_name{ // 代码声明}
下面演示了命名空间的用法:
1234567891011121314151617181920212223242526272829303132using System;namespace first_space{ class namespace_cl { public void func() { Console.WriteLine("Inside first_space"); } }}names ...
IEnumerator与IEnumerable理解与辨析
IEnumerator更广阔的天地编写的几乎所有程序都需要循环访问集合,因此需要编写代码来检查集合中的每一项。
迭代器可以读取集合中的数据,但是不能从底层修改集合,因为迭代器的实现方法中只实现了Get方法,所以不能对集合中的数据进行修改
语法糖:计算机中添加某种语法,这种语法对语言功能没有影响,但是更方便程序员使用,语法糖让代码更加简洁,有更高的可读性
基本概念协程(Coroutine):协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行。Unity的协程系统是基于C#的一个简单而强大的接口——迭代器(IEnumerator),协程并不是多线程的,只是运行的结果很像多线程而已。它们最大的区别就是多线程可以多核并发,但是协程只能是单核按帧顺序轮转,线程可以使用多个CPU,协程不能,所以线程是真的并行。协程是在Unity主线程中运行的,每一帧中处理一次,而并不与主线程并行。这就意味着在协程之间不存在着所谓的线程间的同步和互斥问题,访问同一个值也都是安全的,不会出现死锁。
协程的用法:开启协程:开启协程的两种方式:
StartCoroutine(string meth ...
在Mac和Windows上配置dotNet开发环境
背景本文主要记录如何配置.NET环境,以及如何创建最简单的C# application。
在Mac上配置dotNet开发环境这里是.Net7的下载地址,打开下载的pkg,按照指引完成安装。在终端中输入dotnet,如果安装成功,会弹出如下内容:
使用Terminal创建一个最简单的C#命令在终端中输入:
12dotnet new console -o MyApp -f net7.0cd MyApp
上述各命令的解释:
dotnet new conslole 命令用来创建新的console APP
-o参数会创建名为MyApp的目录,用于存储应用并使用所需文件进行填充
-f参数指示console我们创建的是.NET7的应用程序
创建的MyApp文件夹中的主文件称为Program..cs,默认情况下,它包含的内容如下:
1Console.WriteLine("Hello World!");
然后在终端中运行dotnet run来运行.NET应用,终端中会输出如下结果:
使用Rider打开并运行C#项目使用Rider打开并运行C#项目不像使用IDEA打开并运行j ...