1. 程式人生 > >Unity使用腳本進行批量動態加載貼圖

Unity使用腳本進行批量動態加載貼圖

它的 有關 技術 post 應該 而且 下一步 AI 屬性。

先描述一下我正在做的這個項目,是跑酷類音遊。

那麽跑酷類音遊在繪制跑道上的時候,就要考慮不同的磚塊顯示問題。假設我有了一個節奏列表,那麽我們怎麽將不同的貼圖貼到不同的磚塊上去呢?

我花了好幾個小時才搞清楚裏面的門路,且聽我慢慢道來。

首先我們建立一個地圖,在上面新建一個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使用腳本進行批量動態加載貼圖