[Unity] ScriptableObjectでEnemyStatusを管理しよう!!


[Unity] ScriptableObjectでEnemyStatusを管理しよう!!

行いたいこと

・RPGのEnemyのStatus初期値を管理したい。
・無駄にメモリ消費をしたくない。
・Inspector上でEnemyのStatusを追加したい。
・ExcelのシートからScriptableObjectに値を自動入力したい。(今後記載予定)

事前準備

1) Assetのimport

importするAssetはお好みのもので問題ないですが、私は以下のAssetをimportしました。

・Enemy

https://assetstore.unity.com/packages/3d/characters/creatures/rpg-monster-duo-pbr-polyart-157762

<確認事項>
・Project/Assets配下に「RPG Monster Duo PBR Polyart」が配置されたことを確認する。

2) Prefabの配置

・Playerの配置
Project/Assets/RPG Monster Duo PBR Polyart/Prefabs/Slime.prefabをHierarchyに配置する。

ソースコード


ScriptableObjectを作成するためのソースファイルです。

EnemyStatusScriptableObject.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "MyScriptable/Create EnemyData")]
public class EnemyStatusScriptableObject : ScriptableObject
{
	public List<EnemyParam> list = new List<EnemyParam>();

	[System.Serializable]
	public class EnemyParam
	{
		public string name;
		public int num;
		public int maxHp;
		public int att;
	}
}

作成が終了したら、Assets > Create > MyScriptable > Create EnemyDataをクリック
Assets配下に「New Enemy Status Scriptable Object.asset」が作成されたかと思います。
「New Enemy Status Scriptable Object.asset」をクリックして以下のように、Inspectorに値を追加してください。


Enemyにアタッチするソースファイルです。

EnemyManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class EnemyManager : MonoBehaviour
{
    int hp0;
    int att0;
    int hp1;
    int att1;
    int hp2;
    int att2;

    // ScriptableObjectを直接アタッチしたい場合は以下のコメントアウトを外してください。
    //public EnemyStatusScriptableObject enemyStatusScriptableObject;

    // ScriptableObjectのパスを指定(ScriptableObjectを右クリック>copy path取得できます。)
    string filePath = "Assets/New Enemy Status Scriptable Object.asset";

    private void Start()
    {
        // ScriptableObjectのパスを指定して、EnemyStatusScriptableObjectを取得する。
	// 上のコメントアウトを外した場合は、こちらをコメントアウトしてください
        EnemyStatusScriptableObject enemyStatusScriptableObject = AssetDatabase.LoadAssetAtPath<EnemyStatusScriptableObject>(filePath);

        hp0 = enemyStatusScriptableObject.list[0].maxHp;
        att0 = enemyStatusScriptableObject.list[0].att;
	hp1 = enemyStatusScriptableObject.list[1].maxHp;
        att1 = enemyStatusScriptableObject.list[1].att;
	hp2 = enemyStatusScriptableObject.list[2].maxHp;
        att2 = enemyStatusScriptableObject.list[2].att;

        Debug.Log("HP:" + hp0);
        Debug.Log("ATT:" + att0);
	Debug.Log("HP:" + hp1);
        Debug.Log("ATT:" + att1);
	Debug.Log("HP:" + hp2);
        Debug.Log("ATT:" + att2);
    }
}

ではplayボタンを押下して、Consoleに以下の文字列が出力されるか確認してみましょう。
確認出来たら、成功です。