1. 程式人生 > >Unity3D 資源管理 -- 基本概念

Unity3D 資源管理 -- 基本概念

轉載出處:http://blog.csdn.net/myarrow/article/details/42420329

1. 在Unity內部可建立的資源

    1)Shader(著色器)資源:定義物體的表面,與財質配合使用。
    2)Compute Shader(可計算著色器)資源:充分利用了DX11的一些特性,可建立非常炫麗的視覺效果。
    3)Prefab(預設、預製)資源:使用者可使用它來建立一些重複性的物體,比如樹木等重複性的物體,但預製更為強大的功能是執行例項化,即可以在程式執行時產生大量重複性的 物體,而且這種物體是非常節省資源的,並且可以通過指令碼隨時進行銷燬掉。

    4)Material(材質)資源:物體可以通過材質定義外表,材質需要與Shader搭配使用,在材質的屬性編輯中,可選擇各種需要的Shader(著色器)
    4)Cubemap(立方體貼圖)資源:它相當於一種紋理,可以立方體的6個面上來定義紋理,來產生需要的環境效果。

    5)Lens Flare(透鏡耀斑)資源:當攝像機鏡頭面向強光(如太陽) 時,用它來產生炫麗效果,因此此項資源一般會與攝像機配合使用。

    6)Render Texture(渲染紋理)資源:也是一種材質資源,在渲染紋理中,可以把某個場景進行單獨的渲染,然後通過渲染紋理將其轉換成一副獨立的紋理,並覆蓋或包裹在需要的物體上,即在一個物體的表面上產生電影紋理的效果。

    7)Physic Material(物理材質)資源:主要用在剛體碰撞中,它可以定義剛體表面的各種物理特性,如摩擦力、彈力等等。

    8)GUI Skin(GUI面板)資源:可以通過定義新的GUI面板來產生需要的圖形介面效果。

2. 外部資源建立及匯入

    外部資源包括:模型和角色動作

2.1 外部模型匯入方式

        1)輸出外掛(FBX或OBJ):僅輸出需要的資料

        2)輸出相應的3D應用檔案(如Max或Blend,由Unity進行轉換):可能輸出多餘的資料

2.2 角色動畫匯入方式

        1)匯出一個模型檔案:此模型檔案中包含一個動畫檔案,此動畫檔案中包含多個動畫片斷

        2)每個動畫片斷匯出一個模型檔案:每個模型的和名稱需要符合規範

2.3 材質、紋理、著色器

        1)紋理:紋理就是圖片,可使用外部圖形處理軟體處理(通過材質的方式在檢視中進行顯示

        2)材質和著色器:材質相當於一個框架,而Shader(著色器)是框架中的內容,在材質框架中可以選擇不同的Shader模型,來定義材質的外表。

        3)Bumped Diffuse Shader<Normalmap(法線貼圖)>:在一個簡單的模型上使用法線貼圖,可以在一個簡單的模型上產生非常真實複雜的效果,這樣節省了模型量,可以極大地提高遊戲執行速度。使用方法:Material的Shader 選擇為Bumped Diffuse,然後增加一個Normalmap, Normalmap的Texture Type應該為:Normalmap。

        4)Bumped Specular Shader:與Bumped Diffuse Shader類似,並在其基礎上新增一些高光的效果,這樣就能使整個表面顯得有光澤,且可產生平滑效果。

2.4 2D紋理

       通過GUI的方式來顯示2D紋理:需要使用指定的Resources資料夾來儲存資源,及相關函式的呼叫。相關程式碼如下所示:

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. // Resources.Load 和 Resources.LoaddAll的資源必須放在根目錄下的Resources目錄下
  2. // save the required texture
  3. privatevar oneTexture:Texture2D;  
  4. privatevar allTexture:Object[];  
  5. function OnGUI()  
  6. {  
  7.     print("***Enter OnGUI****");  
  8.     if(GUI.Button(Rect(0,20,100,60),"loadOneTexture"))  
  9.     {  
  10.         //print("***11****");
  11.         if(oneTexture == null)  
  12.         {  
  13.             oneTexture = Resources.Load("oneTexture/Grass");  
  14.         }  
  15.     }  
  16.     //print("***22****");
  17.     if(GUI.Button(Rect(0,140,100,60),"loadAllTexture"))  
  18.     {  
  19.         //print("***33****");
  20.         if(allTexture == null)  
  21.         {  
  22.             allTexture = Resources.LoadAll("allTexture");  
  23.         }  
  24.     }  
  25.     //print("***44****");
  26.     if(oneTexture != null)  
  27.     {  
  28.         //print("***55****");
  29.         GUI.DrawTexture(Rect(110,20,120,120),oneTexture, ScaleMode.StretchToFill,true,0);  
  30.     }  
  31.     //print("***66****");
  32.     if(allTexture != null)  
  33.     {  
  34.         //print("***77****");
  35.         for(var i =0; i< allTexture.Length; i++)  
  36.         {  
  37.             GUI.DrawTexture(Rect(110+i*200,140,120,120),allTexture[i],ScaleMode.StretchToFill,true,0);  
  38.         }  
  39.     }  
  40. }  

2.5 聲音檔案

      在場景中播放聲音,需要兩個元件:

       1)音源元件(Audio Source):把它新增到發出聲音的物體上

       2)監聽元件(Audio Listener):把它新增到遊戲的主角物體上,如Main Camera

       3)一個物體只有一個聲音片斷(AudioClip,它附在AudioSource上)

       可在遊戲一開始時就播放聲音,也可通過程式來控制聲音的Play、Pause、Stop(播放附在AudioSource上的AudioClip),其參考程式碼如下:

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. #pragma strict
  2. @script RequireComponent(AudioSource)  
  3. function Start () {  
  4.     audio.loop = true;  
  5. }  
  6. function OnGUI () {  
  7.     if(GUILayout.Button("Play/Resume"))  
  8.     {  
  9.         if(!audio.isPlaying)  
  10.         {  
  11.             audio.Play();  
  12.         }  
  13.     }  
  14.     if(GUILayout.Button("Pause"))  
  15.     {  
  16.         audio.Pause();  
  17.     }  
  18.     if(GUILayout.Button("Stop"))  
  19.     {  
  20.         audio.Stop();  
  21.     }  
  22. }  

      把此指令碼新增到具有Audio Source的物體(即發聲明物體)上,audio即為此Audio Source。

      4)一個物體有多個聲音片斷(AudioClip)

           使用PlayOneShot(function PlayOneShot (clip :AudioClip,volumeScale : float = 1.0F) : void )來播放指定的片斷(AudioClip,播放在指令碼中定義的AudioClip),其參考程式碼如下:

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. #pragma strict
  2. @script RequireComponent(AudioSource)  
  3. var bgAudio:AudioClip;   
  4. function Start () {  
  5.     audio.loop = true;  
  6. }  
  7. function OnGUI () {  
  8.     if(GUILayout.Button("Play/Resume"))  
  9.     {  
  10.         if(!audio.isPlaying)  
  11.         {  
  12.             audio.Play();  
  13.         }  
  14.     }  
  15.     if(GUILayout.Button("Pause"))  
  16.     {  
  17.         audio.Pause();  
  18.     }  
  19.     if(GUILayout.Button("Stop"))  
  20.     {  
  21.         audio.Stop();  
  22.     }  
  23.     if(GUILayout.Button("PlayOneShot"))  
  24.     {  
  25.         audio.PlayOneShot(bgAudio,1.0);  
  26.     }     
  27. }  

注:audio.Play():播放AudioSource中的AudioClip

             audio.Pause():只能暫停AudioSource中的AudioClip播放

             aduio.Stop():停止所有的聲音播放

             audio.PlayOneShot(...):播放一個指令碼中定義的AudioClip,可與audio.Play()同時播放

2.6 Prefab(預設/預製)

      預設也是一種資源,它具有重用和執行例項化兩個重要特性。

      1)繼承性:所有的例項物體都連結到原始的預設物體中,當對預設物體進行修改時,其相關的例項物體立即跟隨變化,這就是例項的繼承性

      2)過載:可以對單獨的例項物體進行修改,這就是例項的過載