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- // Resources.Load 和 Resources.LoaddAll的資源必須放在根目錄下的Resources目錄下
- // save the required texture
- privatevar oneTexture:Texture2D;
- privatevar allTexture:Object[];
- function OnGUI()
- {
- print("***Enter OnGUI****");
- if(GUI.Button(Rect(0,20,100,60),"loadOneTexture"))
- {
- //print("***11****");
- if(oneTexture == null)
- {
- oneTexture = Resources.Load("oneTexture/Grass");
- }
- }
- //print("***22****");
- if(GUI.Button(Rect(0,140,100,60),"loadAllTexture"))
- {
- //print("***33****");
- if(allTexture == null)
- {
- allTexture = Resources.LoadAll("allTexture");
- }
- }
- //print("***44****");
- if(oneTexture != null)
- {
- //print("***55****");
- GUI.DrawTexture(Rect(110,20,120,120),oneTexture, ScaleMode.StretchToFill,true,0);
- }
- //print("***66****");
- if(allTexture != null)
- {
- //print("***77****");
- for(var i =0; i< allTexture.Length; i++)
- {
- GUI.DrawTexture(Rect(110+i*200,140,120,120),allTexture[i],ScaleMode.StretchToFill,true,0);
- }
- }
- }
2.5 聲音檔案
在場景中播放聲音,需要兩個元件:
1)音源元件(Audio Source):把它新增到發出聲音的物體上
2)監聽元件(Audio Listener):把它新增到遊戲的主角物體上,如Main Camera
3)一個物體只有一個聲音片斷(AudioClip,它附在AudioSource上)
可在遊戲一開始時就播放聲音,也可通過程式來控制聲音的Play、Pause、Stop(播放附在AudioSource上的AudioClip),其參考程式碼如下:
[javascript] view plain copy- #pragma strict
- @script RequireComponent(AudioSource)
- function Start () {
- audio.loop = true;
- }
- function OnGUI () {
- if(GUILayout.Button("Play/Resume"))
- {
- if(!audio.isPlaying)
- {
- audio.Play();
- }
- }
- if(GUILayout.Button("Pause"))
- {
- audio.Pause();
- }
- if(GUILayout.Button("Stop"))
- {
- audio.Stop();
- }
- }
把此指令碼新增到具有Audio Source的物體(即發聲明物體)上,audio即為此Audio Source。
4)一個物體有多個聲音片斷(AudioClip)
使用PlayOneShot(function PlayOneShot (clip :AudioClip,volumeScale : float = 1.0F) : void )來播放指定的片斷(AudioClip,播放在指令碼中定義的AudioClip),其參考程式碼如下:
[javascript] view plain copy- #pragma strict
- @script RequireComponent(AudioSource)
- var bgAudio:AudioClip;
- function Start () {
- audio.loop = true;
- }
- function OnGUI () {
- if(GUILayout.Button("Play/Resume"))
- {
- if(!audio.isPlaying)
- {
- audio.Play();
- }
- }
- if(GUILayout.Button("Pause"))
- {
- audio.Pause();
- }
- if(GUILayout.Button("Stop"))
- {
- audio.Stop();
- }
- if(GUILayout.Button("PlayOneShot"))
- {
- audio.PlayOneShot(bgAudio,1.0);
- }
- }
注:audio.Play():播放AudioSource中的AudioClip
audio.Pause():只能暫停AudioSource中的AudioClip播放
aduio.Stop():停止所有的聲音播放
audio.PlayOneShot(...):播放一個指令碼中定義的AudioClip,可與audio.Play()同時播放
2.6 Prefab(預設/預製)
預設也是一種資源,它具有重用和執行例項化兩個重要特性。
1)繼承性:所有的例項物體都連結到原始的預設物體中,當對預設物體進行修改時,其相關的例項物體立即跟隨變化,這就是例項的繼承性
2)過載:可以對單獨的例項物體進行修改,這就是例項的過載