如何使用unity中Resources檔案

2021-07-10 15:54:14 字數 3004 閱讀 3103

unity有幾種特殊資料夾。其中乙個檔案是resources資料夾。儲存資源的簡單概念已經在

官方文件中被很好的解釋:

通常,我們在場景中建立資源的例項以便在遊戲設定中使用它們。不過unity還允許從指令碼即時載入資源。通過將資源放在乙個叫resources 的資料夾或它的子資料夾(實際上可以有任意數量的resources資料夾並可以放置在工程中的任意位置)中完成這步。用resources.loadfunction就可以載入這些資源。

對於為什麼使用resources檔案件的原因或許還有些不清楚。首先要明白unity構建過程是如何工作的,還有就是unity怎樣訪問遊戲資源。

unity build process

unity

構建過程

構建遊戲之前,需要宣告遊戲中包括哪些場景。這些都可以在build settings視窗來完成。

至少有兩個unity為什麼會要求這樣做原因:

它需要知道哪個場景被首先載入(最上邊的場景)

它需要知道在構建的專案中包括哪些資源(相關性)

什麼是場景相關性?他們是以任何方式連線到場景層級的資源,通常作為元件。

unity logo物件包括引用自unity logo資源的sprite renderer物件

依賴關係圖表如下:

這種情況下有兩個場景。scene 1使用asset 1 和asset 2。scene 2使用asset 2 和 asset 3。如果決定不構建scene 2會發生什麼?

由於asset 3只是被scene 2引用了,所以在構建時只包含了asset 1 和 asset 2,asset3就不再被包括到構建中了。幸虧有了這種以來跟蹤,unity會在構建中包括實際用到的資源。更不用說不需要擔心儲存暫時用不到的資源了。它不會影響構建專案的大小。

override!

重寫!有一種方法可以繞過這個過程。如果把資源放入了resources資料夾,它們就會被包括到你的構建中。不過要小心!這需要很好的理由才能做!

正如之前所說,大多數情況下當需要使用資源時,會在場景中做乙個引用。這種方法可以很容易的使用任何附加資源。所以為什麼要使用乙個沒有保持引用的資源?或許有一些原因並且每個原因都取決於特殊的需要,不過讓我們看乙個多數遊戲都常見的案例。

當資源從場景中被直接引用時,在場景啟動之前就會被載入到記憶體中。慶幸的是,玩家不會經歷由於場景載入(伴隨一些小的異常)導致的幀率下降。代價當然是需要時間來載入這些資源。有時也許是不可接受的。

example – loading screen withdifferent backgrounds

示例——載入不同背景的場景

載入場景有時候也是乙個場景。讓我們想象一種情況,真正遊戲載入的時候當你想在背景顯示隨機的時。收集了15張圖並把它們新增到了載入場景旋轉的指令碼。它們工作的很棒,不過當玩遊戲的時候會意識到載入場景需要的時間比通過實際遊戲關卡的時間要長!這是由資源預載入機制引起的,並且可以通過使用resources資料夾很容易修復這個問題。首先從場景中移除所有紋理的引用。然後把放到resources/loadingimages目錄,如下:

然後在**中可以使用如下**:

[c#] 

純文字檢視

複製**

?1

2

inttexturescount = 3;

inttextureid = random.range(1, texturescount + 1);

texture2d texture = resources.load("loadingimages/"+ textureid);

注意random.range()返回了乙個介於包含第乙個引數和不包含第二個引數之間的隨機數,這就是為什麼會有+1。

如果需要給這個紋理附加乙個image元件,你可以這樣做:

[c#] 

純文字檢視

複製**

?1

2

3

4

5

sprite sprite = sprite.create(

texture,

newrect(0, 0, texture.width, texture.height),

newvector2(0.5f, 0.5f));

image image = getcomponent();

image.sprite = sprite;

a word of caution

乙個字的警告

resources 資料夾只有在真正需要的時候才去用。即時載入資源會使fps 下降,間接依賴關係會使工作更加困難。值得再次提到的是這些資源會一直存在於構建當中,即時沒有使用它們。已經警告你啦!

Unity 中 SendMessage的使用

方法的使用 今天閱讀別的 的時候頻繁出現了使用sendmessage方法,雖然一直知道unity有這個訊息傳送的方法,但也一直沒有詳細了解用過,就看了看文件測試了一下。public void sendmessage string methodname,object value null,sendme...

Unity中OnValidate的使用

onvalidate可以用來驗證一些資料,指令碼載入或inspector中的任何值被修改時會呼叫。詳細介紹可以看下面的鏈結參考。相關鏈結 我目前使用到的用法是拖拽賦值時獲取目標值,效果如下圖。當我往games拖拽物體時,會給gamepath自動賦值。示例 const string gamefolde...

Unity中協程方法使用

開啟協程 void start 返回值是ienumerator 返回引數時使用 yield return null 協程方法的呼叫是startcoroutine changecolor ienumerator changecolor 關閉協程 關閉協程的方法需要和開啟協程的方法對應 不能使用star...