Unity使用腳本進行批量動態加載貼圖
先描述一下我正在做的這個項目,是跑酷類音遊。
那麽跑酷類音遊在繪制跑道上的時候,就要考慮不同的磚塊顯示問題。假設我有了一個節奏列表,那麽我們怎麽將不同的貼圖貼到不同的磚塊上去呢?
我花了好幾個小時才搞清楚裏面的門路,且聽我慢慢道來。
首先我們建立一個地圖,在上面新建一個Empty Object,將所有的Road磚塊全部劃分到這個分組裏。
效果圖如下:
我們得到了一些預制塊,接下來我們要將其染上色。
首先的問題是,我們怎麽遍歷這些磚塊呢?很簡單,用Tag。我們將所有的磚塊打上一個特別的tag,“road”。
接下來我們尋找一個GameObject,在它的Start函數裏添加我們需要的東西。滿足需求的Object可以是環境光,也可以是任意一個空項目。
我新建了一個Texture Render的C#腳本,接下來我們使用這個函數,獲取所有的磚塊:
var roads = GameObject.FindGameObjectsWithTag("road");
接下來這個roads變量就是一個list,其成員便是所有的Tag為road的GameObject。而且更巧的是,它是按照順序尋找的,這樣我們就可以方便地從頭到尾按順序遍歷所有磚塊。
有關Find各種變種函數的問題,可以移步Document進行查看。
下一步是找出Texture到底是在哪個屬性裏。我一開始也不明白到底貼圖應該是賦什麽值好,最後得出結論,應該是賦給這個屬性:
roads[i].GetComponent<Renderer>().material.mainTexture
老版本的Unity,可能直接使用
renderer.material.mainTexture
但是這個用法已經過時了。
第三步,我們怎麽正確將貼圖加載進來。
我翻閱了很多資料,最後發現Resource.Load函數可以勝任這個工作。
首先我們將需要的資源文件放到根目錄的Assets/Resources文件夾裏。如果沒有的話需要創建新文件夾。為什麽呢?因為Load()函數的Path是相對地址,而它是從Resource目錄找起的。請務必記住這個坑。
現在我在裏面放了一些素材,之後我們這麽調用。
Resources.Load("rockA") as Texture2D;
as起到了類型轉換的作用。我們也可以這麽寫。
(Texture2D)Resources.Load("rockA");
接下來將加載的資源賦給Object的屬性。
roads[i].GetComponent<Renderer>().material.mainTexture = Resources.Load("rockA") as Texture2D;
接下來,我們寫一個遍歷就可以了。
var roads = GameObject.FindGameObjectsWithTag("road"); for (int i = 0; i < roads.Length; i++) { roads[i].GetComponent<Renderer>().material.mainTexture = Resources.Load("grassB") as Texture2D; }
這裏只使用了一個素材,最後渲染出來的效果是這樣的:
這樣我們就做到了動態加載貼圖。
我之前提到過,這是一個音樂遊戲。我通過自己的節奏算法,將節奏以list形式存儲。
那麽我只需要再寫一個轉換算法,將對應的磚塊換成特別的磚塊,這樣就可以很方便地加載各種各樣的音樂。
P.S. Debug.Log()真的很好用,在Unity中,這個功能基本替代了斷點功能和變量監視。
Unity使用腳本進行批量動態加載貼圖