ScriptableObject
ScriptableObject 是一個(gè)可獨(dú)立于類實(shí)例來保存大量數(shù)據(jù)的數(shù)據(jù)容器。ScriptableObject 的一個(gè)主要用例是通過避免重復(fù)值來減少項(xiàng)目的內(nèi)存使用量。如果項(xiàng)目有一個(gè)預(yù)制件在附加的 MonoBehaviour 腳本中存儲不變的數(shù)據(jù),這將非常有用。
每次實(shí)例化預(yù)制件時(shí),都會產(chǎn)生單獨(dú)的數(shù)據(jù)副本。這種情況下可以不使用該方法并且不存儲重復(fù)數(shù)據(jù),而是使用 ScriptableObject 來存儲數(shù)據(jù),然后通過所有預(yù)制件的引用訪問數(shù)據(jù)。這意味著內(nèi)存中只有一個(gè)數(shù)據(jù)副本。
就像 MonoBehaviour 一樣,ScriptableObject 派生自基本 Unity 對象,但與 MonoBehaviour 不同,不能將 ScriptableObject 附加到游戲?qū)ο?。正確的做法是需要將它們保存為項(xiàng)目中的資源。
如果使用 Editor,可以在編輯時(shí)和運(yùn)行時(shí)將數(shù)據(jù)保存到 ScriptableObject,因?yàn)?ScriptableObject 使用 Editor 命名空間和 Editor 腳本。但是,在已部署的構(gòu)建中,不能使用 ScriptableObject 來保存數(shù)據(jù),但可以使用在開發(fā)期間設(shè)置的 ScriptableObject 資源中保存的數(shù)據(jù)。
從 Editor 工具作為資源保存到 ScriptableObject 的數(shù)據(jù)將寫入磁盤,因此將在會話之間一直保留。
使用 ScriptableObject
ScriptableObjects 的主要用例為:
在 Editor 會話期間保存和存儲數(shù)據(jù)
將數(shù)據(jù)保存為項(xiàng)目中的資源,以便在運(yùn)行時(shí)使用
要使用 ScriptableObject,必須在應(yīng)用程序的?Assets?文件夾中創(chuàng)建一個(gè)腳本,并使其繼承自?ScriptableObject
?類。您可以使用?CreateAssetMenu?屬性,從而使用您的類輕松創(chuàng)建自定義資源。例如:
使用上述在?Assets?文件夾中創(chuàng)建的腳本,您可以通過導(dǎo)航到?Assets > Create > ScriptableObjects > SpawnManagerScriptableObject?來創(chuàng)建 ScriptableObject 的實(shí)例。為新的 ScriptableObject 實(shí)例提供有意義的名稱并更改值。要使用這些值,必須創(chuàng)建一個(gè)引用 ScriptableObject(在本例中為?SpawnManagerScriptableObject
)的新腳本。例如:
Not:提示這個(gè)腳本的名字必須和類的名字一致
將上述腳本附加到場景中的游戲?qū)ο?。然后,?Inspector 中,將?Spawn Manager Values?字段設(shè)置為新設(shè)置的?SpawnManagerScriptableObject
。
將?Entity To Spawn?字段設(shè)置為 Assets 文件夾中的任何預(yù)制件,然后在 Editor 中單擊?Play。在?Spawner
?中引用的預(yù)制件會使用在?SpawnManagerScriptableObject
?實(shí)例中設(shè)置的值來實(shí)例化。
如果在 Inspector 中使用 ScriptableObject 引用,可以雙擊引用字段來打開 ScriptableObject 的 Inspector。還可以創(chuàng)建自定義編輯器來定義該類型的 Inspector 外觀,從而幫助管理它所代表的數(shù)據(jù)。