Unity游戏开发
腳本編譯
在編輯器下,每次修改完代碼就會自動編譯,最終所有代碼將編譯成DLL文件。DLL最終編譯在Project/Library/ScriptAssemblies目錄下。
腳本分為運行時腳本和編譯時腳本,運行時腳本會被編譯到游戲包中,編輯時腳本僅用于編輯器模式下。腳本的存放的目錄決定了他講編譯在哪個DLL文件中Plugins目錄下的腳本最先被編譯,編譯成Assembly-CSharp-firstpass.dll,Plugins下的Editor編譯在Assembly-CSharp-Editor-firstpass.dll下,其他運行時腳本編譯在Assembly-CSharp.dll下,Editor的編譯在Assembly-CSharp-Editor.dll下,先編譯的腳本無法訪問后編譯的腳本
基本改動不大的代碼塊放到Plugin下,改動大的放在其他位置,這樣改動其他塊的代碼就不會編譯Plugin的代碼
關閉日志輸出
Debug.unityLogger.logEnable = false
監聽日志
Application.logMessageReceived
Font.textureRebuilt字體重建
text.FontTextureChange 刷新Text文本
更換烘焙貼圖(例如更換夜晚白天)
先創建LightmapData對象,最終將需要更換烘焙貼圖放入LightmapSetting.lightmaps中即可
LightmapData data = new LightmapData();
data.lightmapColor = lightmap;
LightmapSetting.lightmaps = new LightmapData[1]{data};
合批
在PlayerSetting中勾選Static Batching和Dynamic Batching
自動靜態合批次:在需要合批的物體上Static勾上Static Batching
運行游戲后,MeshFilter會自動生成一個新的Mesh,如果有相同材質,Shader并且參數一樣,就會合并DrawCall
缺點:
(1) 運行游戲,如果只有一小部分出現在攝像機里,那個整個Mesh都需要參與渲染
(2) 靜態合批最大頂點數是65535,如果頂點數超過了它,Unity就會自動合并出多個Mesh
腳本靜態合批:利用代碼來動態設置需要合批在一起的游戲對象。如果使用代碼合批,不需要勾選Static Batching,只需要調用StaticBatchingUtility.Combine()方法即可,
第一個參數,數組:所需要合批的對象
第二參數,gameobject:合并后放在那個節點下面
該方法必須在Awake周期調用
合并后的Mesh無法單獨位移,只能移動指定的Root節點
動態合批:動態合批是全自動的,我們不需要做任何事情,但它是有要求的,Mesh頂點需要小于300,如果Shader使用了頂點位置、法線、UV0、UV1和切線,Mesh的頂點數必須小于180,一般用于粒子特效中
錄音
Microphone類
編輯器下保留引用實例化預制體
PrefabUtility.InstantiatePrefab();
獲取文件MD5
MD5 md5 = new MD5CryptoServiceProvider():
BitConverter.ToString(md5.ComputeHash(File.ReadAllBytes(“路徑”))).Replace("-","").ToLower()
監聽導入事件
繼承AssetPostprocessor類
代碼調用實現未保存狀態*
通過代碼修改物體上序列化的物體,不會出現未保存的狀態*,通過調用EditorSceneManager.MarkSceneDirty()強制設置場景為未保存狀態,
EditorUtility.SetDirt()設置某個資源變成dirty狀態
打包事件監聽
用來實現打包時版本號(PlayerSettings.bundleVersion)自動增加之類的
,
繼承接口IPreprocessBuild,IPostProcessBuild
多相機共存,
可以實現
人物的裝備永遠都在相機視線內,就算是故意把槍伸進模型里面也不會發生穿模現象
通過Depth來決定誰在前誰在后
主相機可以指定某個層級剔除
另外新建一個相機只選擇這個層級的物體渲染,并將Clear Flags設置為DepthOnly
如果要讓UI顯示在模型后面,將Canvas的RenderModel設為Screen Space—Camera
多場景編輯
可以實現將多個小場景拼接成一個大場景
編輯器下只需將場景文件拖動Hierarchy視圖中即可,
加載場景,調用SceneManager.LoadSceneAsync(“場景名字”,LoadSceneMode.Additive);
卸載場景:SceneManager.UnloadSceneAsync(名字);
將對象移動到指定場景中:SceneManager.MoveGameObjectToScene();
在多場景中,需要指定一個為激活場景。如果添加游戲物體時不指定場景,都將默認放在激活場景中。
場景激活:SceneManager.SetActiveScene(SceneManager.GetSceneByName(“場景名字”));
場景激活回調:SceneManager.activeSceneChanged
場景加載回調:SceneManager.sceneLoaded
場景卸載回調:SceneManager.sceneUnloaded
多場景烘焙:Lightmapping.BakeMultipleScene()
總結
- 上一篇: 中国计算机技术职业资格网(软考)考试用书
- 下一篇: Unity游戏开发:场景切换的实现