http://blog.csdn.net/akof1314/article/details/38715809
文转载自:http://ndark.wordpress.com/2013/05/12/20130511-臺北unity開發者研討會-筆記/
說明
本文單純只是筆記,若有筆誤敬請見諒。
相關參考連結
- Unity Asia Bootcamp 台北場 – 線上觀看
- Unity Shader System Introduction (Slide)
- Unity 開發者論壇-台北場 (Unity ASIA BOOTCAMP TOUR TAIPEI )研討會
- 獨家專訪:Unity 教育認證與台灣高等教育的深度對談 | Unity IN | 社群✕媒體✕平臺
- Unity – Mecanim Performance and Optimization
總論
- 開發者成長速度與上手速度是Unity在台灣的優勢。
- 在Facebook與360劉灠器中預設安裝Unity Plugin。
- 大陸有超過400個Android商城。
- 認證培訓(新竹教育大學,高應科大等學校)。
- 鬼武者魂由Unity開發,Server端使用PHP。
- 開發者必須要注意的三階段:開發-平台-廣告金流。
你不可不知的Unity開發技巧
- Unity三種網頁發佈的方式:WebPlayer,Flash(效能低下),Chrome NaCl(Native C++,不需要Plugin)。
- Plugin的版本分別:Stable,Release,Beta,Alpha。可以修改網頁碼來指定plugin的下載版本與來源。
- Web Caching License(收 費):"We offer a special extension of the Unity webplayer which can cache asset bundles locally. This is licensed under an agreement made by our business development team. Generally it is licensed to developers with a large anticipated revenue and not on a smaller scale basis."
- 如何動態更新Unity產品的Source Code:透過將程式碼輸出為二維的TextAsset,然後在包裝到AssetBundle中。
- Unity4已支援動態字型,nGUI2.6才支援動態字型(東亞字體)。(EZGUI目前就已支援-感謝永康ㄉㄉ堤供情報)
- GameObject.Destroy不會移除該物件的資源(Mesh,Texture,Material等)。
- ScaleForm僅支援Unity3.5.x
- 網路Server的清單:Photon,Electron,SmartFox,uLink,SlimNet,SlimIOCP。
- NavMesh.Triangle() 函式
- 王者之劍<蓝港在线>使用Unity開發的2D遊戲。
- 開發2D遊戲的插件:Sprite Manager,Ex2D。
- Unity Cache Server是開發團隊用來在不同平台(資源)發布時的加速方式。
- Asset Server已不建議使用。
- 疾風,91都會自己開發對Unity的金流SDK。
- 透過設定優化發佈的產品檔案大小。
行動平台優化要點
- 每個動態物件(角色)的三角形面數在300到2000之間。
- 每個動態物件(角色)的Skinned Mesh Renderer僅用一個。
- 每個動態物件(角色)的材質數只用一個。
- 每個動態物件(角色)的骨架限制在30根以下。
- 使用Dynamic Batching合併那些雜類的動態物件。
- 靜態物件設定為Static,方可進行Static Batching。
- 在3.5使用靜態物件時移除Animation的組件。
- 地形(Terrain)的初始解析度設定為257以下。
- 地形(Terrain)筆刷貼圖數目控制在4以下。
- 貼圖解析度大小控制在1024以下。
- 3D遊戲開啟Mipmap會增加記憶體但是可加速效能。
- 貼圖uv控制在0~1。
- 音樂檔案使用ogg/mp3,短音效使用wav。
- 光源使用Light Map/Light Probe來取代動態光源。
- 使用方向光。
- Pixel Light控制在1~2。
- 控制攝影機的z-near與z-far平面。
- 設定物件的Culling Distance。
- 小物件又很遠得時候就不要畫。
- 粒子系統將粒子總數控制在200以下。
- 粒子系統每個發射器發射粒子控制在50以下。
- 粒子的大小越小越好。
- 非常小的粒子去掉alpha channel。
- 不要開啟粒子的碰撞。
- 碰撞類型不要使用Mesh Collider。
- 減少使用Animation組件。
- 不縮放的動畫,去除Scale Curves的參數。
- 若只使用一個AnimationClip,就使用Unity 3.5的動畫系統。
- 使用Macanim(Unity 4的動畫系統),要搭配使用Body Mask。
- IK選用Generic Mode。Humanoid Mode在Android上會耗費嚴重的效能。
- Render時減少使用Alpha Test與Alpha Blend。
- Draw Call Batching分為Static與Dynamic。後者點數控制在900下,若包含Position,Normal,UV,則是300。
- 使用Texture Packing將不同物件的材質變為相同,但必須手動修改UV。
- 使用Occlusion Culling時謹慎設定謹慎設定Occluder(牆)與Occludee的角色。設定PVS only,PVS and dynamic objects,Automatic Portal Generation(會改變的門)。
- 程式碼,使用類別變數來暫存指標。
- 設定Fixed Delta Time在0.04到0.067之間。
- IOS發布時使用Fast and Exceptions Unsupported的發布形式。
- Shader減少使用數學函式,減少使用Discard。Vertex使用Float,TextureUV使用Half,顏色與光使用Fixed。
- 在PowerVR的硬體下有時候使用兩個Vec2反而會比較快。
- 使用Profiler。
- 使用Manager的架構來控制物件會比把每個物件都掛上腳本效率高。
Asset Bundle
- Resource這種讀取資源的形態(有2G限制)會慢慢移除,統一改用Asset Bundle(可離線創造)
- Web Caching只能放Asset Bundle。
- Asset Bundle建出之後是有相容性的,ios與android的Asset Bundle與其他平台互不相容。
- BuildPipeline.BuildAssetBundle()是用來建立多個Asset的Asset Bundle。
- BuildPipeline.BuildStreamedSceneAssetBundle()則是用來建立多個場景的Asset Bundle。
- 用BuildAssetBundleOptions.DeterministicAssetBundle來建立對Asset的Hash ID做增量發布。
- Asset Bundle的流程:
WWW.LoadFromCacheOrDownload()取得AssetBundle->解壓縮->原來的Asset。
var assetBundleObj = WWW.AssetBundle->使用中的Asset Bundle。
new WWW是沒有Cache的,使用LoadFromCacheOrDownload()取得.unity3D才能有Cache。
透過AssetBundle.CreateFromMemory()取得Asset Bundle可再進行加密動作。
AssetBundle.Load()->載入Asset。 - 卸載流程:
GameObject.Destroy()
AssetBundle.Unload(false)只會卸載WWW.AssetBundle,AssetBundle.Unload(true)則會卸載WWW.AssetBundle以及相關資源。true的作用相較於使用false再使用Resources.UnloadUnusedAssets()作用並不相同。
把相同的資源基底打包為Asset Bundle
使用BuildPipeline.PushAssetDependencies()來建立Asset Bundle之間的關連性。 - 範例1:把共通資源打包。
Push
Build 共通資源包
Push
Build 物件包1
Pop
Push
Build 物件包2
Pop
Pop - 範例2:把Level所使用的資源也做成依賴形式。
Push
Build Level1
Push
Build Level2 (依賴於Level1)
Push
Build Level3 (依賴於Level2與Level2) - 範例3:把場景包依賴於共通資源包
- 將設定各資源包依賴關係的XML設定為ScriptableObject並打包到Asset Bundle內
- 將場景切割為Asset Bundle的方式,等分,如切成九宮格。
- 將場景切割為Asset Bundle的方式,分大物件,中物件,小物件。讓大物件先讀入先顯示。
- WWW.LoadFromCacheOrDownload()可設定版號。
- WWW.LoadFromCacheOrDownload的crc產生方式可透過錯誤使用同一個函式來產生真確值。
- 程式碼的加密過程:Assembly->Byte->TextAsset->加密->Asset Bundle->加密->TextAsset->Asset Bundle。
- 使用native dll來保護重要程式碼,但Web應用不能使用dll。
Unity Shader System
- 透過Shader Name就會自動產生選擇Shader的架構。
- SubShader可視為真正的Shader,由上而下執行。
- SubShader的Tag表示如何執行:可指定執行的順序。
- SubShader的Tag表示如何表現。
- 著色方式Vertex Lit:快,限制多。
- 著色方式Forward:將燈光分為最重要+不重要以及其他重要。區分方式可手動,也可以依照強度與方向來自動決定。
- 著色方式Deferred:手機不能使用,也不支援透明。
- CG/HSSL會被轉譯為GLSL。
- 使用基本Shader會需要寫132行的程式,使用Surface Shader來做隱藏簡化:標明surfae code與light code。
- #pragma debug可以將隱藏的程式碼顯示在程式碼中。
- 透過user define keyword將參數傳入shader中。