スクリプタブルオブジェクトで作った整数を外部アセットにして、ロードできるようにする(ScriptableObjectとAddressable)

データ部分をアプリのコードから分離して、ロードしたりリリースしたりできるようにする基本的なサンプルになります

簡単なクラスを作成し、整数のデータを扱います

サンプル

プレイヤーのステータス情報をアセットにして他の媒体(ネットワーク上も含む)から取得、更新できるようにするサンプルになります

Addressablesパッケージのインポート

Windowメニュー、Package ManagerからAddressablesをインポートしておきます

ScriptableObjectスクリプト

すくりプタブルオブジェクトを作成のためのクラスを作成します

using UnityEngine;

[CreateAssetMenu(menuName = "CharacterStatus")]
public class CharacterStatus : ScriptableObject
{
    public int hp;
}

[CreateAssetMenu(menuName = "CharacterStatus")]は、このスクリプトがUnityエディタ上でアセットを作成するためのメニューオプションを提供するための属性です。具体的には、このスクリプトを右クリックしてコンテキストメニューを開いたときに、"CharacterStatus"というオプションが表示され、それを選択することでこのスクリプトのインスタンスを作成することができます。

public class CharacterStatus : ScriptableObject

CharacterStatusという名前のクラスを宣言しています。このクラスはScriptableObjectを継承しています。ScriptableObjectはUnityで使用されるスクリプトのアセットを作成するための基本クラスであり、プロジェクト内で独自のデータを保持するために使用されます。

public int hp;

CharacterStatusクラスのパブリックな整数型のメンバ変数であり、キャラクターの体力ポイント(HP)を表します。この変数はUnityエディタ上で編集可能であり、ゲーム内でキャラクターのHPを設定するために使用されます。

このコードの目的は、キャラクターのステータス(HPなど)を管理するためのスクリプトアセットを作成することです。これにより、異なるキャラクターごとに異なるステータスを簡単に作成できます。

ファイル名の設定画面になります

作成されたすくりプタブルオブジェクトのAddressableにチェックを入れます
Addressable名をWarriorに変更しておきましょう(この名前でのアクセスができるようになります)
Hpの値もわかりやすく251にしています

キャラクターステータスの取得コード

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class CharacterStatusLoader : MonoBehaviour
{
    public string CharacterStatusAddress; // アドレス参照を保持する変数

    private async void Start()
    {
        var handle = Addressables.LoadAssetAsync<CharacterStatus>(CharacterStatusAddress);

        await handle.Task;

        Debug.Log(handle.Result.hp);

        Addressables.Release(handle); // リソースの解放
    }
}

Addressable Assetsシステムを使用してアセットをロードするためのコードです。

using UnityEngine;using UnityEngine.AddressableAssets;

Unityのクラスや関数を使用するための名前空間のインポート文です。

using UnityEngine.ResourceManagement.AsyncOperations;

非同期操作を管理するためのクラスや関数を使用するための名前空間のインポート文です。

public string CharacterStatusAddress;

アドレス参照を保持するためのパブリックな文字列型の変数です。この変数はInspectorビューで設定され、ロードするキャラクターステータスのアドレスを指定します。

private async void Start()

Start関数を非同期に実行するための修飾子です。この関数はオブジェクトが有効になった直後に実行されます。

var handle = Addressables.LoadAssetAsync<CharacterStatus>(CharacterStatusAddress);

Addressablesシステムを使用してキャラクターステータスのアセットを非同期でロードするための操作を開始します。CharacterStatusはロードするアセットの型であり、CharacterStatusAddressはロードするアセットのアドレスを指定します。

await handle.Task;

ロード操作が完了するまで待機します。handle.Taskは非同期操作の完了を表すタスクオブジェクトを返します。

Debug.Log(handle.Result.hp);

ロードしたアセットのhpメンバ変数の値をデバッグログに出力します。

Addressables.Release(handle);

ロードしたアセットに関連するリソースを解放します。これにより、メモリリークやリソースの浪費を防ぐことができます。

このコードの目的は、指定されたアドレスからキャラクターステータスのアセットを非同期でロードし、そのhp値をデバッグログに出力することです。また、リソースの解放も行っています。

エラー処理を考慮した場合

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class CharacterStatusLoader : MonoBehaviour
{
    public string CharacterStatusAddress; // アドレス参照を保持する変数

    private async void Start()
    {
        var handle = Addressables.LoadAssetAsync<CharacterStatus>(CharacterStatusAddress);

        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            CharacterStatus characterStatus = handle.Result;
            Debug.Log(characterStatus.hp);
        }
        else
        {
            Debug.LogError("キャラクターステータスの読み込みに失敗しました: " + handle.OperationException);
        }

        Addressables.Release(handle); // リソースの解放
    }
}

このコードは、Addressable Assets System(アドレサブルアセットシステム)という機能を使用してアセットを非同期でロードするために、UnityEngine.AddressableAssets名前空間を使用しています。

public class CharacterStatusLoader : MonoBehaviour

CharacterStatusLoaderという名前のクラスを宣言しています。このクラスはMonoBehaviourを継承しており、Unityのゲームオブジェクト上でスクリプトを動作させるための基本クラスです。

public string CharacterStatusAddress;

アドレス参照を保持するためのパブリックな文字列型の変数です。この変数は、キャラクターステータスのアセットのアドレスを指定します。

var handle = Addressables.LoadAssetAsync<CharacterStatus>(CharacterStatusAddress);

アドレサブルアセットシステムを使用してキャラクターステータスのアセットを非同期でロードするための操作を開始します。LoadAssetAsyncメソッドは、指定されたアドレスからアセットをロードするための非同期操作を返します。ここでは、CharacterStatusのアセットをロードする操作を開始しています。

await handle.Task;

は、ロード操作が完了するまで待機するためのキーワードです。handle.Taskは、非同期操作の完了を表すタスクを取得します。この行の実行が完了するまで、次の行には進みません。

if (handle.Status == AsyncOperationStatus.Succeeded)

アセットのロードが成功したかどうかをチェックする条件文です。handle.Statusは、非同期操作のステータスを取得します。AsyncOperationStatus.Succeededは、操作が成功したことを表す定数です。

CharacterStatus characterStatus = handle.Result;

ロードされたキャラクターステータスのアセットを取得します。handle.Resultは、非同期操作の結果を取得します。

Debug.LogError("キャラクターステータスの読み込みに失敗しました: " + handle.OperationException);

キャラクターステータスのロードに失敗した場合にエラーメッセージをデバッグに出力します。Debug.LogErrorは、エラーメッセージをUnityのコンソールに出力するためのメソッドです。handle.OperationExceptionは、非同期操作中に発生した例外を取得します。

Addressables.Release(handle);

使用が完了したアドレサブルアセットのリソースを解放するためのメソッドです。これにより、メモリリークを防ぐことができます。

このコードの目的は、CharacterStatusLoaderクラスが開始されたときにキャラクターステータスのアセットを非同期でロードし、ロードが成功した場合にその内容を表示することです。アドレス参照を使用してアセットを特定し、非同期操作を行うことで、ゲームプレイ中に必要なアセットを効率的にロードできます。

実行結果

251

Addressable,Unity

Posted by hidepon