Unity3D输出Android透明背景的实现:
1.Player Settings -> Resolution and Presentation -> Render Over Native UI //可不用设置此选项
2.相机的camera flag设为Solid color
3.相机的background RGBA values to (0,0,0,0)
4.Unity对应的activity标签添加 android:theme="@style/UnityThemeSelector.Translucent"
也可通过代码在OnCreate里设置:getTheme().applyStyle(R.style.UnityThemeSelector_Translucent, true);
StreamingAssets在不同平台的路径写法:
// 通过UnityWebRequest获取本地StreamingAssets文件夹中的Json文件
public string UnityWebRequestJsonString(string fileName)
{
string url;
#region 分平台判断 StreamingAssets 路径//如果在编译器 或者 单机中
#if UNITY_EDITOR || UNITY_STANDALONE
url = "file://" + Application.dataPath + "/StreamingAssets/" + fileName;
//否则如果在Iphone下
#elif UNITY_IPHONE
url = "file://" + Application.dataPath + "/Raw/"+ fileName;//否则如果在android下
#elif UNITY_ANDROID
url = "jar:file://" + Application.dataPath + "!/assets/"+ fileName;
#endif
#endregion
UnityWebRequest request = UnityWebRequest.Get(url);
request.SendWebRequest();
//读取数据
while (true)
{
if (request.downloadHandler.isDone)
//是否读取完数据
{
return request.downloadHandler.text;
}
}
}
Profiler保存成文件:
//Profiler.logFile = "profileLog"; //Also supports passing "myLog.raw"
//Profiler.enableBinaryLog = true;
//Profiler.enabled = true;
…………test code .............
//Profiler.enabled = false;
//Profiler.logFile = "";
Editor目录下有Resources目录,Resources目录下的东西不会打包到默认Resources资源束的
Preferences -> External Tools -> Built-in packages勾选上,就可调试Unity自带的包
Unity中的抗锯齿实现方式:
1.用显卡的硬件抗锯齿功能(有些集成显卡不支持)
edit->project settings->quality
2.用Unity5.3.5及以上系统自带的算法组件(需要添加抗锯齿的相机勾选上)
相机组件下的 "Allow MSAA" 选项
3.用Legacy Cinematic Image Effects插件,新版的是在后处理软件包里
有SMAA,FXAA,TAA
更详细的各种抗风锯齿的比较:https://blog.csdn.net/eevee_1/article/details/118632398
MSAA : 光栅化时操作(MSAA提边缘是在图形管线的前段(跟深度有关)),硬件抗风锯齿。
FXAA : 屏幕后处理的边缘模糊技术,色彩差异太大时,不是边缘也被认为成边缘,精度有问题
作为性能最好的抗锯齿效果,最高1个DrawCalls
SMAA :类似FXAA的滤镜类抗锯齿,性能消耗约为FXAA的2倍左右
TAA :目前业内游戏大厂使用最多,最广泛的抗锯齿。使用运动矢量组合两帧,以确定在何处对前一帧进行采样
uGUI优化:
消除不必要的射线检测(raycast):默认情况下,canvas自带Graphic Raycaster组件,这对于交互型的UI是必须的,但如果你的UI元素并不需要交互,那么每次点击都会触发判断,这种情况下,你就可以删除Graphic Raycaster组件以减少不必要的计算处理。同样的,各种其他UI元素,如图片、文本等也有Raycast Target属性,如果不需要射线检测(触屏、点击),也可以一并关掉,减少计算量。
Unity/Windows应用的注册表位置:
regedit, 计算机\HKEY_CURRENT_USER\Software\zhuiyi\viBot_Cloud
Editor:
Application.persistentDataPath:C:/Users/lzy/AppData/LocalLow/zhuiyi/viBot
Application.dataPath:D:/GMF/Projects/Unity/Test/vibot-u3d-PC-eBusiness/Assets
Application.streamingAssetsPath:D:/GMF/Projects/Unity/vibot-u3d-PC-eBusiness/Assets/StreamingAssets
Player:
Application.persistentDataPath:C:/Users/lzy/AppData/LocalLow/zhuiyi/viBot
Application.dataPath:D:/GMF/Projects/VS/WinformUnityPipe-sonic/WinformPipeServer/bin/Debug/viBot_Data
Application.streamingAssetsPath:D:/GMF/Projects/VS/WinformUnityPipe-sonic/WinformPipeServer/bin/Debug/viBot_Data/StreamingAssets
HDRP:
1.自动能升级的shader只有官方自带的shader;自己写的传统管线的shader只能手动重新写(目前支持shader graph)。
2.同理粒子特效也需要修改,用 visual effect graph
3.天空盒的设置不在以前的project setting中,由volume setting设置
4.volume setting 和 Post process Volume很重要,具体可以参考模板工程多试试
静态mesh与SkinMesh(绑定蒙皮的mesh)
unity中主要是通过SkinnedMeshRenderer组件来实现蒙皮动画的计算
inverse matrix : 逆矩阵
蒙皮: 计算Mesh的顶点受bone影响而产生的变化的过程称之为蒙皮
CPU蒙皮和GPU蒙皮
Mesh: 在Unity中就是一个网格的数据结构,里面记录了顶点、顶点索引等信息
Mesh mesh = new Mesh();
mesh.vertices = ...
mesh.triangles = ...
mesh.uv = ...//都可以对其赋值
Sub-Mesh: each sub-mesh corresponds to a Material in a Renderer, such as MeshRenderer or SkinnedMeshRenderer. A sub-mesh
consists of a list of triangles, which refer to a set of vertices. Vertices can be shared between multiple sub-meshes
一个材质对应一个sub-mesh,一个顶点可以被多个sub-meshes共享。
即一个MeshRenderer下可以有多个材质。
lineMesh.subMeshCount = 2;
lineMesh.vertices = lineVertices.ToArray();
lineMesh.SetNormals(normals);
//绘制0号submesh
lineMesh.SetIndices(lineIndices[0].ToArray(), MeshTopology.Lines, 0);
Gizmos.DrawMesh(lineMesh, 0, gameObject.transform.position);
//绘制1号submesh
lineMesh.SetIndices(lineIndices[1].ToArray(), MeshTopology.Lines, 1);
Gizmos.DrawMesh(lineMesh, 1, gameObject.transform.position)
UnityHub 2.5.5版本Bug:
UnityHub点击添加没有反应:这是一个已知的bug,可以尝试删除 %UserProfile%/AppData/Roaming/UnityHub 文件夹来修复,官方会在3.0.0正式版修复该bug
[Unity3d杂记]骨骼蒙皮动画 - 知乎
Unity英文下载,要: https://unity3d.com/get-unity/download/archive
Unity 2019相比于Unity2018的变化:
1.自带的扩展插件,不再以库的形式放在Data\UnityExtensions目录下,
而是以包的形式把源码放在Data\Resources\PackageManager\BuiltInPackages目录下
Unity的C#版本只有4.0,不支持诞生于4.5的async/await异步机制, 2019版的是4.x
Unity ParticleSystem的使用注意点:ParticleSystem的每个property是一个module struct,所以在赋值时使用局部变量缓存,再通过局部变量设置每个模块的值
the key difference is that it is not necessary to assign the struct back to the Particle System component. When you set any property on a module struct, Unity immediately assigns that value to the Particle System.
Also, because each module is a struct, you must cache it in a local variable before you can assign any new values to the module. For example, instead of:
ParticleSystem.emission.enabled = true; // Doesn't compile
write:
var emission = ParticleSystem.emission; // Stores the module in a local variable
emission.enabled = true; // Applies the new value directly to the Particle System
Unity AnimationClip和AnimationState:
1.AnimationClip是Unity3D中播放动画的最基本对象,通过FBX导入的各个动画对象其实就是一个AnimationClip。这个类已关键帧的形式记录了骨骼关节在各个时间节点上的位置、旋转信息,根据帧频率frameRate结合播放模式wrapMode通过插值计算即可播放出连续的骨骼动画。
2.AnimationState
每个AnimationState包含了一个AnimationClip,并记录这个动画片段的一些播放控制属性,实际上是一个AnimationClip的包装器。
其中比较重要的参数有layer,weight, enabled, speed, blendMode这几项。这些参数的具体含义将在自定义混合动画控制中详细解释,在简单的动画控制时并不需要对AnimationState进行直接操作。
AnimationEvent的传参规定:
注意: 并不是所有的函数都可以被当做动画事件函数的,可以被调用的动画事件函数必须满足以下规则:
1. 最多只能接受一个参数
2. 参数的类型必须是Int, Float,String, Object中的一种
####Unity静默编译######
C# script in the project(Editor文件夹):
using UnityEditor;
class MyEditorScript
{
static void PerformBuild ()
{
string[] scenes = { "Assets/MyScene.unity" };
BuildPipeline.BuildPlayer(scenes, ...);
}
}
"C:\Program Files\Unity\Editor\Unity.exe" -quit -batchmode -projectPath "C:\Users\UserName\Documents\MyProject" -executeMethod MyEditorScript.PerformBuild
####Unity静默编译######
Unity3D 热更新方案总结
五种方案:
1.LUA(需要LUA与C#绑定,性能低,需要掌握两门语言)
2.ILRT(总体最佳方案)
3.JSB(类似LUA)
4.直接更dll(最好方案,但IOS不能用)
5.将CS当成脚本(类似直接更dll,只不过是动态编译cs脚本,同样IOS不能用)
Unity中的对象拷贝:
使用 InstantiatePrefab 可以保持 GameObject 的名称,
// 而如果使用 Object.Instantiate 会带有 Clone
Event和Input.GetMousexxx事件会被任何gameobject监控到,而OnMousexxx事件只会被该脚本附加上的gameobject监控到
uGUI源码调试 : UI(Unity里右键UI)是作为一个插件放在Unity系统里的,插件意味着是可有可没有的。
1.下载uGui源码工程,注意选择对应的Unity版本分支,https://github.com/Unity-Technologies/uGUI/tree/2018.4
2.VS(2017)中打开工程,生成解决方案
3.使用unity自带工具pdb2mdb.exe,生成mdb调用文件(3个): //因为Unity是基于mono的
"C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\lib\mono\4.5\pdb2mdb.exe" "D:\Study\Unity\OpenSources\uGUI-2018.4\Output\UnityEngine.UI.dll"
"C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\lib\mono\4.5\pdb2mdb.exe" "D:\Study\Unity\OpenSources\uGUI-2018.4\Output\Standalone\UnityEngine.UI.dll"
"C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity2018.4.30\Editor\Data\MonoBleedingEdge\lib\mono\4.5\pdb2mdb.exe" "D:\Study\Unity\OpenSources\uGUI-2018.4\Output\Editor\UnityEditor.UI.dll"
当然,每次修改都要转换出3mdp文件和替换输出文件,比较麻烦,就可省去上面的3个转换命令操作,
直接把源码放在Unity项目目录下,进行调试,再稍作一点修改:
1.UnityEditor.UI目录修改为Editor (Unity项目对Editor的硬性要求);
2.去掉两个根目录下的bin,obj,Properties文件夹和UnityEidtor.UI.csproj文件
UnityEngine.UI-Eidtor目录是空的,直接删掉即可
3.重新打开Unity工具,看一下右键是否有UI选项;控制台报错,直接把项目Library/PackageCache清空一下即可
这样就可进行uGui的源码调试了
Unity断言(Assertions)的使用;
1.断言的所有方法调用,默认只有在development build中包含进来,除非明确的指定:BuildOptions.ForceEnableAssertions指定,或由UNITY_ASSERTIONS 宏定义来控制
2.断言失败不会中断执行过程,只会在控制台下log一个消息. 当把Assert.raiseExceptions设为=true时, 异常AssertionException将会被抛出,而不是在控制台log a message.
代码样例:
Assert.IsNull(std, "检测结果值不为null");
Assert.IsTrue(1 > 2);
Assert.IsTrue(1 > 2,"自定义输出(指的是断言失败的输出信息)");
Assert.IsTrue(1 < 2, "自定义输出2"); //断言成功,就不会输出任何信息
3.当debugger(如VS中的) Attached到项目时(即System.Diagnostics.Debugger.IsAttached的值=true), AssertionException will be thrown in order to pause the excecution and invoke the debugger.
uGUI:
中心点Pivot
按下T键选中某一个UI控件即可看到UI控件的中心点,中心点也叫中心轴,当鼠标拖动UI控件进行旋转的时候会围绕中心点旋转。
--中心点是矩形的一部分。
--0对应左下角,1对应右上角。
锚点Anchor:
如图所示,箭头所指即为锚点,锚点表示的是相对于父级矩形的子矩形区域。
如图所示,锚点为四边形,锚点有多种摆放方式,可以为矩形,点状或是为线状。
锚点移动范围仅限于父级视图当中.
锚点的四种摆放方式:
--锚点呈点状
--锚点与组件本身重合
--锚点跟父物体重合
--锚点呈线状
Panel :面板,功能相当于控制的容器,里面可以存放其他控件。
--作用: 使用Panel控件可以整体移动和处理一组控件。
--设计规范: 一个功能完备的UI界面往往会使用多个Panel控件。
示例: 将资源商店当中的所有分类放在单独一块Panel当中。
InputField创建出来如下图,InputField层级视图当中包含Placeholder与Text,
--Placeholder 用于显示占位符,即输入框没有输入文本时显示的文本,例如下图的“Enter text”;
--Text 用于显示输入的内容。
输入框Inputield的具体属性:
--Text :初始文本显示的内容
--Character Limit :字符数量限制。
--Content Type :文本类型。
--Line Type :文本单行显示还是多行。
--Caret Blink Rate :光标闪动频率。
--Caret Width :光标的宽度。
--Custom Caret Color :自定义光标的颜色。
--Selection Color :选中文本时的颜色。
--On Value Changed(String) :文本编辑时触发的事件。
--On End Edit(string) :结束编辑的时候触发的事件。
图集: 放入多个图,手动制作成图集,然后进行切割,降低游戏DrawCall
切割后一个图片,变为多个精灵.
Image: 需要的是Sprite(Sprite也是Texture的一种类型);
RawImage: 需要的是Texture,可用于显示任何图片
支持UV Rect(用来设置只显示图片的某一部分);
不支持交互
用途: 小地图、帧动画(改uv)
OnPostRender() : 写了这个函数后,这个脚本要必须要挂在Camera上才执行
OnRenderObject(): 功能和上面的函数类似,但它可以不挂在摄像机上也能用.
//GL里的坐标转换成了Normalize(0~1)范围的
Unity中的事件顺序:
参考 Unity - Manual: Order of execution for event functions
yield return的使用: yield null 是在update 后运行的
1.yield return null
yield return +任意的数字
以上的这两种形式都是一个作用,就是暂缓一帧,在下一帧接着往下处理
IEnumerator Test()
{
while(true)
{
print("AAAAAAAAA");
//yield return null; //暂缓一帧,在下一帧接着往下处理
//yield return 1; //暂缓一帧,在下一帧接着往下处理
yield return 2; //暂缓一帧,在下一帧接着往下处理
print("BBBBBBBBB");
}
} //结果AAAAA打印多一次
2.WaitUntil(Func
WaitUntil(): 中断当前的执行,直到提供的代理(函数)返回true; 只能结合yield语句一起使用
抗锯齿(Anti-aliasing) : 分硬件抗锯齿(MSAA,2/4/8倍) 和 软件抗锯齿(post-process effect)
延迟渲染不支持MSAA, 只能通过后期效果来实现抗锯齿.
Rendering path : 渲染路径
可以在Graphics窗囗中选择,也可在每个相机中覆盖设置
灯光保真度(fidelity)从大到小 : per-pixel > per-vertex > per-object
//SH (Spherical Harmonics) : 球函数,计算更快,但只是个近似值
前向渲染: 是Unity内置渲染管线的默认渲染路径,在前向渲染中实时灯光是非常昂贵的,要控制实时灯光数量 。
它渲染一个物体可能使用1个或多个pass(由影响此物体的灯光数量决定); 灯光本身也根据灯光的设置和强度会不一样的; 一些最亮的灯光以full per-pixel光照模式影响每一个物体,
且可多达4个点光源通过per-vertex计算, 其它的灯光通过更快的SH球函数来计算近似值. 判断一个灯光是否是一个per-pixel灯光:
灯光的Render Mode设为Not Important时就总是per-vertex或SH;
最亮的平行光总是per-pixel;
灯光的Render Mode设为Import时总是per-pixel;
在上面的判断后灯光数量少于当前的Pixel Light Cout(在Quality Setting),更多的灯光可进行per-pixel渲染,目的是降低亮度
渲染详情:
Base Pass applies one per-pixel directional light and all per-vertex/SH lights
Other per-pixel lights are rendered in additional passes, one pass for each light
//注意: light groups overlap; for example last per-pixel light blends into per-vertex lit mode so there are less “light popping(间歇的,凸出的)” as objects and lights move around
延迟渲染:内置渲染管道中光线和阴影保真度最高的渲染路径; 需要GPU硬件支持;
延迟渲染的一些限制:
不支持半透明物体(Unity使用前向渲染这些物体),
不支持正交投影(Unity使用前向渲染相机),
不支持硬件抗锯齿(MASS),
对Culling masks有限制的支持,
对待Renderer.receiveShadows总是返回true.
//Unity - Manual: Forward rendering path
2.延迟渲染:内置渲染管道中光线和阴影保真度最高的渲染路径; 需要GPU硬件支持;
延迟渲染的一些限制:
不支持半透明物体(Unity使用前向渲染这些物体),
不支持正交投影(Unity使用前向渲染相机),
不支持硬件抗锯齿(MASS),
对Culling masks有限制的支持,
对待Renderer.receiveShadows总是返回true.
3.旧的延迟渲染: Legacy Deferred(light prepass),与延迟渲染类似,但使用不同的技术的取舍(折中)方案.
延迟渲染的限制: 不支持Unity5的基于物理的着色器(standard shader).
4.旧的顶点光照(渲染) : Legacy Vertex Lit, 是最低光照保真度,不支持实时阴影,是前向渲染的一个子集.
四类渲染路径的比较: Rendering Path comparison
Deferred | Forward | Legacy Deferred | Vertex Lit | |
---|---|---|---|---|
Features | ||||
Per-pixel lighting (normal maps, light cookies) | Yes | Yes | Yes | - |
Real-time shadows | Yes | With caveats | Yes | - |
Reflection Probes | Yes | Yes | - | - |
Depth & Normal Buffers | Yes | Additional render passes | Yes | - |
Soft Particles | Yes | - | Yes | - |
Semi-transparent objects | - | Yes | - | Yes |
Anti-Aliasing | - | Yes | - | Yes |
Light Culling Masks | Limited | Yes | Limited | Yes |
Lighting Fidelity | All per-pixel | Some per-pixel | All per-pixel | All per-vertex |
Performance | ||||
Cost of a per-pixel Light | Number of pixels it illuminates |
Number of pixels * Number of objects it illuminates | Number of pixels it illuminates | - |
Number of times objects are normally rendered | 1 | Number of per-pixel lights | 2 | 1 |
Overhead for simple Scenes | High | None | Medium | None |
Platform Support | ||||
PC (Windows/Mac) | Shader Model 3.0+ & MRT |
All | Shader Model 3.0+ | All |
Mobile (iOS/Android) | OpenGL ES 3.0 & MRT, Metal (on devices with A8 or later SoC) | All | OpenGL ES 2.0 | All |
Consoles | XB1, PS4 | All | XB1, PS4, 360 | - |
光照 :
只有静态对象会被纳入GI预计算,要让预计算启动首先必须最少要有一个静态对象
Unity 全局光照的局限性:
游戏运行时,非静态物体无法直接受到烘培光源和静态反射光线的影响。比如游戏运行时敌人的外表无法被照亮,显得昏暗
Lighting面板:
Realtime Lighting -> Realtime Global Illumination(Deprecated) : 间接光照使用实时灯光
Mixed Lighting -> Baked Global Illumination
Lighting Mode -> Baked Indirect : mixed lights provide realtime direct lighting while indirect light is baked into lightmap and light probes
Lighting Mode -> subtractive : mixed lights provide baked direct and indirect lighting for static objects.动态物体接收实时光和使用主的平行光投射阴影到静态物体上
一、LightProbe :光照探头,用于解决全局光照模式下,非静态物体与静态场景之间光照不协调问题。利用光照探头,可以在游戏运行阶段实时获得非静态物体的近似全局光照效果。
LightProbe主要解决了如何在动态对象和角色上使用烘焙的照明信息;给动态物体提供间接光。
给动态物体提供间接光
技术原理:LightProbe的核心就是球面亮度信号编码和重建;
在Unity中,烘焙GI的LightProbe采用了3阶球谐函数(9个参数),实时GI中的LightProbe采用了2阶球谐函数(4个参数);
//bakedProbes内保存的是一堆“SphericalHarmonicsL2”对象,只要修改SphericalHarmonicsL2的缩放比例就可以修改LightProbe所提供的亮度了。
在Unity中,我们可以使用脚本将场景内的LightProbe保存为一个Asset,并且只要保证使用文本格式进行序列化,我们就可以直接查看其数据内容了:
AssetDatabase.CreateAsset(Instantiate(LightmapSettings.lightProbes), "Assets/lightProbe.asset");
Unity提供接囗访问烘焙后的LightProb数据:
var probes = LightmapSettings.lightProbes.bakedProbes;
probe.AddAmbientLight(color); //除了修改亮度外, AddAmbientLight()让角色有不同的环境光效果,突出角色
详见:聊聊LightProbe原理实现以及对LightProbe数据的修改 - 慕容小匹夫 - 博客园
操作步骤:(Light probe提供模拟光照):
1、场景灯光和模型布局完成后,确定动态物体可移动范围。
2、打开所有需要投射到动态物体上的灯光并确定光影范围。
3、创建Light probe组并根据1、2两条来设置位置。
设置Light probe位置准则:
1、设置在灯光或阴影转换处,可有效降低运算消耗。
2、不可移动到的范围不设置Light probe,光影无明显变化范围不设置Light probe可有效降低运算消耗。
3、设置细分网格覆盖全场景,可有效提升效果但会加大系统消耗。
Unity 2017 Tutorial - Light Probes And Reflection Probe_哔哩哔哩_bilibili
二、Reflection Probe ,反射探针,提供模拟反射。
原理:它很像一个相机,捕获了周围所有方向的球形视图。然后将捕获的图像存储为Cubemap,可由具有反射材料的对象使用。在给定场景中可以使用多个反射探测器,可以将对象设置为使用最近的探针生成的立方体贴图。结果是,物体上的反射会根据其环境令人信服地发生变化。
操作步骤:
1.将需要施加反射的对象钩上Reflection Probe Static(如样例中两边的墙)
//为了让效果明显可以将小圆球的Metallic拉满
2.创建Reflection probe 到当前场景中心区域,调整大小覆盖当前场景,并减少被遮挡的可能,如有不可避免的遮挡关系则可另外新建一个Reflection probe
3.如果Reflection probe用于环境反射则需在inspector中勾选Box Projection
4.根据需求设置分辨率、阴影距离、环境、背景色等参数
5.在 ReflectionProbe底下点击Bake(最终生成在场景同级子目录里)
6.场景中的 Lighting 设置:
6.1.检查静态物体和bake灯光无误,关闭Skybox和环境光
6.2.关闭Precomputed Realtime GI选项打开Bake GI选项
6.3.点击Build
一、批处理:batching
二、遮挡剔除:
Static Occluder : 遮挡物, 一般是中等或大的物体,如墙或建筑;必备条件:
所以,透明或体积很小的物体不用勾选Occluder Static
Static Occudee : 被遮挡物,运行时很可能被遮挡的物体,包括小的或透明的物体,必备条件:
具体的操作步骤 :
Smallest Occluder : 最小的遮挡距离
Smallest Hole : 最小的遮挡空隙
Backface Threshold : 背面的阈值
遮挡与被遮挡事件的回调方法(遮挡剔除时会响应这两个方法): OnBecameVisible() 和 OnBecameInvisible()
想主动判断某个物体是否在某个相机显示区域内可以用,Renderer.isVisible。
Occluder Static 和 Occludee Static 物体无法更改Transform信息。
可以勾选Renderer组件下的Dynamic Occluded, 表示它将被动态剔除掉。
Mesh Render物体不在相机显示区域,就会被剔除掉。
注意,它只会剔除渲染,Update 还是会更新。所以建议勾选。
遮挡剔除虽然很方便,但未必是好事。如果参与烘培的元素多了,每次移动摄像机时,遮挡剔除会产生大量的计算。
也可自己实现遮挡剔除,将场景上的元素按位置来划分成若干个格子……
渲染管线:
SetPass calls :渲染 pass 的数量;每个 pass 都需要 Unity 运行时绑定一个新的着色器。
URP 和 内置渲染管线 性能对比
主要提速的有两个方面
1. 光照处理(包括阴影)
2. SRP Bacher (SRP 批处理)
在轻量级渲染管线LWRP里,目前是支持1盏平行光,每个对象可能只能接受4个动态光。每个摄像机也有一些限制,这是为了我们可以把所有的计算放在一个Pass里面。
普通渲染管线 转为 URP //在最新的2019LTS版中将LWRP替换成了URP
1.导包: Scriptable Build Pipeline 和 Shadergraph
2.新建LightweightRenderPipelineAsset,并且将其放到project settings中的Graphs的主Asset文件里也就是scriptablePipeline Asset里
3.标准Shader渲染的材质可能在升级后失效(变为粉红色),这时需要手动升级材质的shader,如下:
Edit -> Render Pipeline :.... //其中很多自定义shader目前没法自动升级,不过可以凭借shaderGraph进行简单的复原
ScriptableObject : 创建不需要attach GameObject的对象,常用于存储数据
有几个回调事件:Awake->OnEnable->OnDisable->OnDestroy