Unity随手笔记(2023-03-30)
Prefab 的使用场景和优点
Prefab 又被称为预设,在进行一些功能开发的时候, 将一些能够复用的对象制作成 .prefab 的预制体,然后将预制体存放到 Resources 目录之下, 使用时再动态加载到场景中并进行实例化。适用于需要频繁创建的物体。可以节省内存,无需重复编辑相同物体,适用于频繁使用到的游戏物体。
Prefab 是一种资源类型——存储在项目视图中的一种可反复使用的游戏对象。因而当游戏中须要非常多反复使用的对象、资源等时,Prefab就有了用武之地。它拥有下面特点:
- 能够放到多个场景中。也能够在同一个场景中放置多次
- 当加入一个Prefab到场景中,就创建了它的一个实例
- 全部的Prefab实例链接到原始Prefab,本质上是原始Prefab的克隆。
- 不论项目中存在多少实例。仅仅要对Prefab进行了改动。全部Prefab实例都将随之发生变化。
Shader 如何把图片变成灰度图
1、点乘(最直接)
half gray = dot(color.rgb, fixed3(0.299, 0.587, 0.114)); //0.222, 0.707, 0.071
color.rgb = half3(gray, gray, gray);
2、亮度调节
rgb*0.4 //乘以需要调节的亮度就好了
3、扩展(画个圈,圈外置灰)
float4 _Position; half _Radius;
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
fixed val = 0.299*col.r+0.578*col.g+0.114*col.b;
fixed3 grayScale = fixed3(val, val, val);
// _Radius - distance的最小值为0
half d = saturate(_Radius - distance(_Position.xyz, i.w_p.xyz));
// 当Radius大于distance时,才处理灰度化,否则就为图片原来的颜色
col = lerp(col,fixed4(grayScale,1.0), d);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
Dictionary和List的区别
- Array:在初始化时必须指定其大小和类型,他在内存中是连续存储的,所以可以看出数组的索引速度是非常快的。在确定了数组的长度和类型后,选择数组存储数据是比较好的选择。不适合插入操作。
- ArrayList:在初始化的时候不需要指定其大小和类型。他可以存储不同的数据类型,但是在存取得过程中会引起装箱和拆箱,降低了性能。插入操作方便。
- List:在初始化的时候必须指定其类型,但是不需要指定大小,所以他不会像ArraryList那样在存取过程中引起装箱和拆箱操作。在类型相同的情况下,List和数组的性能相当。插入操作方便。
- Dictionary:在初始化的时候也必须指定其类型,而且他还需要指定一个Key,并且这个Key是唯一的。正因为这样,Dictionary的索引速度非常快。但是也因为他增加了一个Key,Dictionary占用的内存空间比其他类型要大。他是通过Key来查找元素的,元素的顺序是不定的。
LightMapping原理及优点
实时的光照计算是十分消耗性能的,对于一些静态的物体和光源,预计算光照信息存储在贴图中,游戏对象直接使用贴图来模拟灯照射的效果而不用进行实时的光照计算(提前计算)
Unity 协程和C# 线程的区别
协同程序(coroutine) 与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。
协程(协同程序) 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。
- 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component
- 线程,多线程是阻塞式的,每个IO都必须开启一个新的线程,但是对于多CPU的系统应该使用thread,尤其是有大量数据运算的时刻,但是IO密集型就不适合;而且thread中不能操作unity的很多方法和component
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
Unity Animation 和 Animator 的区别
两者都是控制动画播放的
-
Animation 控制一个动画播放的各类方法和数据(当然你可以通过修改目标动画进行动画切换)设置几个关键帧,比如1s的时候position.Y为1,10s时候为10,unity会自动将中间的部分插值,简单的可以设置物体的position,rotation,scale等,用起来很方便,其实相当于序列帧动画,只不过unity帮助我们实现了插值,如果用来做一些稍微复杂或者需要表现力的动画会不太好用,多数应用于一些ui界面的动画,简单的透明度,位置变动的动画等
-
Animator 则可以实现控制多个动画的播放,切换,叠加等一级对骨骼动画控制等更复杂的效果,是一个动画状态机。除却必要的动画文件,还会生成一个.controller结尾的文件,也因此占内存比Animation更大,也更加灵活