前書き
すべてのゲームには、ゲームデザイナーが使用するデータがあります。RPGでは、これはアイテムのデータベースであり、マッチ3(ストアからのツールのクリスタルのコスト、アクションゲーム)では、ファーストエイドキットが回復するHPの量です。
このようなデータを保存する方法はたくさんあります。誰かがデータをテーブル、xml、またはjsonファイルに保存し、独自のツールで編集します。Unityは独自の方法を提供します-スクリプト可能オブジェクト(SO)は、視覚的な表現のために独自のエディターを作成する必要がなく、ゲームアセットや相互に簡単にリンクでき、Addressablesの登場により、このデータを外部に簡単かつ便利に保存できるため、気に入っています。ゲームと個別に更新します。
この記事では、SODatabaseライブラリについて説明します。このライブラリを使用すると、スクリプト可能なオブジェクトをゲームで簡単に作成、編集、および使用(編集、シリアル化)できます。
SOの作成と編集
別のウィンドウでSOを作成および編集します。これは、インスペクターを備えたプロジェクトウィンドウにいくらか似ています。左側にはフォルダーツリー(すべてのSOが配置されているフォルダー-アドレス可能なグループ)があり、右側には選択したSOのインスペクターがあります。
このようWindowEditorを描画するには、私が使用してオーディンインスペクタライブラリを。また、このライブラリのSOのシリアル化を使用します。これにより、ポリモーフィッククラス、ディープネスティング、およびクラス参照を格納できるようになり、標準のユニティウムシリアル化が大幅に拡張されます。
このウィンドウのボタンをクリックすると、新しいSOが作成されます。目的のバイポッドのタイプを選択する必要があり、フォルダーに作成されます。SOタイプをオプションとしてこのウィンドウに表示するには、SOがDataNodeから継承する必要があります。DataNodeには、ScriptableObjectへの追加フィールドが1つだけあります。
public string FullPath { get; }
SO, .
SO
- , , SO - , — , , SO.
static SODatabase , , .
public static T GetModel<T>(string path) where T : DataNode
public static List<T> GetModels<T>(string path, bool includeSubFolders = false) where T : DataNode
, SODatabase , Addressables.
ScriptableObject , . ScriptableObject . , SO .
— , , - , . , SO . , unity, xml .
, ScriptableObject JSON.
DataNode — SO, SODatabase,
[JsonObject(MemberSerialization.OptIn, IsReference = true)]
JsonProperty save.txt . SODatabase addressables JsonConvert.PopulateObject SODatabase, .
, , SO ( , JsonProperty) -, SO . — . , , , .
-
async void Awake()
{
await SODatabase.InitAsync(null, null);
await SODatabase.LoadAsync();
}
private void OnApplicationPause(bool pauseStatus)
{
if (pauseStatus)
SODatabase.Save();
}
private void OnApplicationQuit()
{
SODatabase.Save();
}
PlayerSO, — , , . - , SODatabase, .
public class PlayerSO : DataNode
{
public static string Path => "PlayerInfo/Player";
[JsonProperty]
public string Title = string.Empty;
[JsonProperty]
public int Experience;
}
PlayerInventorySO, ( SO SODatabase).
public class PlayerInventorySO : DataNode
{
public static string Path => "PlayerInfo/PlayerInventory";
[JsonProperty]
public List<ItemSO> Items = new List<ItemSO>();
}
, — , . , , QuestSO (, , ..) . - .
public class QuestNode : BaseNode
{
public static string Path = "QuestNodes";
//Editor
public virtual string Title { get; } = string.Empty;
public virtual string Description { get; } = string.Empty;
public int TargetCount;
//Runtime
[JsonProperty]
private bool finished;
public bool Finished
{
get => finished;
set => finished = value;
}
}
, JsonProperty , SO .
var playerSO = SODatabase.GetModel<PlayerSO>(PlayerSO.Path);
var playerInventorySO = SODatabase.GetModel<PlayerInventorySO>(PlayerInventorySO.Path);
var questNodes = SODatabase.GetModels<QuestNode>(QuestNode.Path, true);
— - / , , SO, json. - , ( ..) . SO , SODatabase , Addressables.
ライブラリはgithubで公開されています。したがって、c#8のNullableを使用して記述されている場合、最小バージョンとしてUnity2020.1.4が必要です。