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中,這個功能基本替代了斷點功能和變量監視。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM