Unity存档

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存档_第1张图片

参考 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 predicate);
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

Unity存档_第2张图片  Unity存档_第3张图片  Unity存档_第4张图片

二、遮挡剔除:

Static Occluder : 遮挡物, 一般是中等或大的物体,如墙或建筑;必备条件:

  1. 有Terrain或MeshRenderer组件
  2. 不透明
  3. 运行是不移动

    所以,透明或体积很小的物体不用勾选Occluder Static

Static Occudee : 被遮挡物,运行时很可能被遮挡的物体,包括小的或透明的物体,必备条件:

  1. 有任何类型的Renderer组件
  2. 运行是不移动

具体的操作步骤 :

  1. 场景中分别勾选Static Occluder和Static Occludee
  2. 渲染相机Camera下勾选Occlusion Culling
  3. 打开Occlusion Culling窗囗,设置参数, Baking

  Smallest Occluder : 最小的遮挡距离

  Smallest Hole : 最小的遮挡空隙

  Backface Threshold : 背面的阈值

遮挡与被遮挡事件的回调方法(遮挡剔除时会响应这两个方法): OnBecameVisible() 和 OnBecameInvisible()

想主动判断某个物体是否在某个相机显示区域内可以用,Renderer.isVisible。

Occluder Static 和 Occludee Static 物体无法更改Transform信息

可以勾选Renderer组件下的Dynamic Occluded, 表示它将被动态剔除掉。

Mesh Render物体不在相机显示区域,就会被剔除掉。

注意,它只会剔除渲染,Update 还是会更新。所以建议勾选

遮挡剔除虽然很方便,未必是好事。如果参与烘培的元素多了,每次移动摄像机时,遮挡剔除会产生大量的计算。

可自己实现遮挡剔除,将场景上的元素按位置来划分成若干个格子……

渲染管线:

Unity存档_第5张图片

 SetPass calls :渲染 pass 的数量;每个 pass 都需要 Unity 运行时绑定一个新的着色器。

URP 和 内置渲染管线 性能对比
  主要提速的有两个方面
   1. 光照处理(包括阴影)
   2. SRP Bacher (SRP 批处理)

Unity存档_第6张图片

在轻量级渲染管线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

你可能感兴趣的:(C#,Unity,unity,lua,ios)