コンテンツにスキップ

カスタム SOAR アセットの作成

SOAR には、プリミティブ型(IntVariableStringList など)に対応した豊富な「基本」アセットが付属していますが、フレームワークの真のポテンシャルは、プロジェクト固有のデータ構造に合わせたアセットを作成することで引き出されます。このガイドでは、一般的なユースケースであるプレイヤーデータの管理のために、カスタム SOAR アセットの完全なセットを作成するプロセスを示します。

このプロセスはシンプルで一貫性があり、定型コードはほとんど必要ありません。作成されると、カスタムアセットは、組み込み型と同様に、Unity の Assets > Create メニューにシームレスに統合されます。

例:PlayerData

このガイドでは、次の PlayerData 構造体で動作する一連の SOAR アセットを作成します。この構造体は、プレイヤーに関するすべての重要な情報を保持します。

ステップ1:データ構造の定義

まず、データ用の新しい C# スクリプトを作成する必要があります。最も重要なステップは、struct または class[System.Serializable] 属性をマークすることです。これにより、Unity はそれをシリアル化し、インスペクターに表示できます。

// File: PlayerData.cs
using System;

[Serializable]
public struct PlayerData
{
    public string playerName;
    public int level;
    public float health;
}

この PlayerData 構造体を使用して、VariableGameEventCollection、および Transaction を作成できるようになりました。

ステップ2:カスタム Variable の作成

Variable は、単一のデータの状態を保持します。PlayerDataVariable を作成して、現在のプレイヤーの情報を保存できます。

PlayerDataVariable.cs という名前の新しいスクリプトを作成する必要があります:

// File: PlayerDataVariable.cs
using Soar;
using Soar.Variables;
using UnityEngine;

[CreateAssetMenu(fileName = "NewPlayerDataVariable", menuName = MenuHelper.DefaultVariableMenu + "Player Data")]
public class PlayerDataVariable : Variable<PlayerData> { }

[CreateAssetMenu] 属性により、エディターで利用可能になります。MenuHelper.DefaultVariableMenu は、他のすべての変数と同じサブメニュー(SOAR > Variables)に表示されるようにするために使用されます。

結果: Assets > Create > SOAR > Variables > Player Data から新しい PlayerDataVariable アセットを作成できるようになりました。

ステップ3:カスタム GameEvent の作成

GameEvent は、何かが起こったことをブロードキャストするために使用されます。PlayerDataGameEvent を使用して、プレイヤーが接続したとき、またはデータが更新されたときに通知できます。

PlayerDataGameEvent.cs という名前の新しいスクリプトを作成する必要があります:

// File: PlayerDataGameEvent.cs
using Soar;
using Soar.Events;
using UnityEngine;

[CreateAssetMenu(fileName = "NewPlayerDataEvent", menuName = MenuHelper.DefaultGameEventMenu + "Player Data")]
public class PlayerDataGameEvent : GameEvent<PlayerData> { }

結果: このイベントは Assets > Create > SOAR > Game Events > Player Data から作成できるようになりました。

ステップ4:カスタム Collection (List) の作成

Collection は、アイテムのリストまたは辞書を管理します。PlayerDataList を作成して、マルチプレイヤーロビーのすべてのプレイヤーのリストを保存できます。

PlayerDataList.cs という名前の新しいスクリプトを作成する必要があります:

// File: PlayerDataList.cs
using Soar;
using Soar.Collections;
using UnityEngine;

[CreateAssetMenu(fileName = "NewPlayerDataList", menuName = MenuHelper.DefaultListMenu + "Player Data")]
public class PlayerDataList : SoarList<PlayerData> { }

結果: このリストは Assets > Create > SOAR > Lists > Player Data から作成できるようになりました。

ステップ5:カスタム Transaction の作成

Transaction は、リクエスト/レスポンスサイクルを処理します。FetchPlayerDataTransaction を作成して、リクエストとして string(プレイヤーの ID)を受け取り、レスポンスとして対応する PlayerData を返すことができます。

FetchPlayerDataTransaction.cs という名前の新しいスクリプトを作成する必要があります:

// File: FetchPlayerDataTransaction.cs
using Soar;
using Soar.Transactions;
using UnityEngine;

[CreateAssetMenu(fileName = "NewFetchPlayerDataTransaction", menuName = MenuHelper.DefaultTransactionMenu + "Fetch Player Data")]
public class FetchPlayerDataTransaction : Transaction<string, PlayerData> { }

結果: このトランザクションは Assets > Create > SOAR > Transactions > Fetch Player Data から作成できるようになりました。

ステップ6:カスタム UnityEventBinder の作成

新しい PlayerDataGameEvent をエディターで簡単に接続するために、カスタム UnityEventBinder を作成できます。

PlayerDataUnityEventBinder.cs という名前の新しいスクリプトを作成する必要があります:

// File: PlayerDataUnityEventBinder.cs
using Soar.Events;

public class PlayerDataUnityEventBinder : UnityEventBinder<PlayerData> { }

結果: PlayerDataUnityEventBinder コンポーネントを任意の GameObject に追加できるようになりました。これにより、PlayerDataGameEvent をリッスンし、UnityEvent<PlayerData> を呼び出して、イベントデータをインスペクターの他のコンポーネントに直接渡すことができます。

結論

このシンプルで一貫性のあるパターンに従うことで、プロジェクト内のあらゆるデータ型に対して、堅牢でタイプセーフ、かつエディターフレンドリーなアーキテクチャを作成できます。これにより、コードベースがよりモジュール化され、テストが容易になり、チーム全体が追加のコードを記述することなく、Unity エディターで直接複雑なロジックを接続できるようになります。