ScriptableObject 是一個可獨立于類實體來保存大量資料的資料容器,ScriptableObject 的一個主要用例是通過避免重復值來減少專案的記憶體使用量,如果專案有一個預制件在附加的 MonoBehaviour 腳本中存盤不變的資料,這將非常有用,
ScriptableObject 這種資源只需設定一次就可以在專案中一直使用,它不能直接附加到游戲物件,
在 ScriptableObject 中創建欄位來存盤值或設定,然后在 Monobehaviour 中參考該 ScriptableObject,
每次實體化預制件時,都會產生單獨的資料副本,使用 ScriptableObject 的這些欄位可以防止每次使用該 Monobehaviour 實體化物件時出現不必要的資料重復,這意味著記憶體中只有一個資料副本,

要使用 ScriptableObject,必須在應用程式的 Assets 檔案夾中創建一個腳本,并使其繼承自 ScriptableObject 類,您可以使用 CreateAssetMenu 屬性,從而使用您的類輕松創建自定義資源,
例如:
using UnityEngine;
[CreateAssetMenu(menuName = "ScriptableObjects/EnemyDataScriptableObject")]
public class EnemyDataScriptableObject : ScriptableObject
{
public string EnemyName;
public EnemyType EnemyType;
public float blood;
public float defense;
public float attack;
}
public enum EnemyType
{
/// <summary>
/// 戰士
/// </summary>
warrior,
/// <summary>
/// 牧師
/// </summary>
pastor,
/// <summary>
/// 射手
/// </summary>
shooter
}
使用上述在 Assets 檔案夾中創建的腳本,您可以通過導航到 Assets > Create > ScriptableObjects > EnemyDataScriptableObject 來創建 ScriptableObject 的實體,

實體完成后生成EnemyData.asset檔案,編輯檔案中的資料,

要使用這些值,必須創建一個參考 ScriptableObject的新腳本,
using UnityEngine;
public class EnemyController : MonoBehaviour
{
// 要實體化的游戲物件,
public GameObject enemyObj;
//實體化個數
public int enemyCount;
//上面定義的 ScriptableObject 的一個實體,
public EnemyDataScriptableObject enemyDataScriptableObject;
EnemyData enemyDatas ;
void Start()
{
LoadEnemy();
}
void LoadEnemy()
{
for (int i = 0; i < enemyCount; i++)
{
GameObject enemys = Instantiate(enemyObj);
enemyDatas = enemys.GetComponent<EnemyData>();
enemyDatas.EnemyName = enemyDataScriptableObject.EnemyName;
enemyDatas.EnemyType = enemyDataScriptableObject.EnemyType;
enemyDatas.blood = enemyDataScriptableObject.blood;
enemyDatas.defense = enemyDataScriptableObject.defense;
enemyDatas.attack = enemyDataScriptableObject.attack;
}
}
}
using UnityEngine;
public class EnemyData : MonoBehaviour
{
public string EnemyName;
public EnemyType EnemyType;
public float blood;
public float defense;
public float attack;
public EnemyData()
{
}
public EnemyData(string EnemyName, EnemyType EnemyType, float blood, float defense, float attack)
{
this.EnemyName = EnemyName;
this.EnemyType = EnemyType;
this.blood = blood;
this.defense = defense;
this.attack = attack;
}
}
運行后完成ScriptableObject讀取;

ScriptableObject可以直接進行修改寫入,并且永久修改資料,unity運行結束后依然保留修改的資料;
public EnemyDataScriptableObject enemyDataScriptableObject;
void Start()
{
enemyDataScriptableObject.EnemyName = "戰士";
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295028.html
標籤:其他
上一篇:累加校驗和C語言實作
下一篇:2021-08-18
