ゲームバランスをUnityのEditor上で設定できるScriptableObjectを試す

  • 43
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

ゲームバランスをUnity Editor上で設定したい時に手軽な方法として、ScriptableObjectを使う方法があります。
ScriptableObjectを使うと、GameObjectにアタッチしない状態で独立したAssetとして持つことができます。

今回は以下のように、白文字と黒文字を切り替えれる、2つの設定を作ります。

main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone.png
main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone 2.png

手順

まずScriptableObjectのコードを[Scripts/ScriptableObjectSample.cs]に作成します。

public class ScriptableObjectSample : ScriptableObject {
    public Color textColor;
    public int textSize;
    public string text;
}

ScriptableObjectはそのままではAssetに追加されないので、メニューからAssetに追加できるようにするコードを[Scripts/Editor/CreateScriptableObjectSample.cs]に作成します。

using UnityEngine;
using UnityEditor;
using System.Collections;

public class CreateScriptableObjectSample : MonoBehaviour {
    [MenuItem("Assets/Create/ScriptableObjectSample")]
    public static void CreateAsset()
    {
        CreateAsset<ScriptableObjectSample>();
    }

    public static void CreateAsset<Type>() where Type : ScriptableObject{
        Type item = ScriptableObject.CreateInstance<Type>();

        string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/" + typeof(Type) + ".asset");

        AssetDatabase.CreateAsset(item, path);
        AssetDatabase.SaveAssets();

        EditorUtility.FocusProjectWindow();
        Selection.activeObject = item;
    }
}

Project->Createを押すと一番したにScriptableObjectSampleができています。[Data]フォルダをAssets直下に作った後に、これをクリックするとScriptableObjectがAssets直下に作られます。

スクリーンショット_2014-10-07_17_47_16.png

適当に設定します。

main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone_と_新規作成_-_Qiita.png

次にシーンに先ほど作成したScriptObjectの設定をGUI表示できるようにGameObjectを作り、以下のスクリプトをアタッチします。

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {
    [SerializeField]
    private ScriptableObjectSample setting;

    void OnGUI() {
        string   str    = setting.text;
        GUIStyle style  = new GUIStyle();
        style.fontSize  = setting.textSize;
        style.normal.textColor = setting.textColor;
        Vector2  size   = style.CalcSize(new GUIContent(str));
        GUI.Label(new Rect(Screen.width / 2 - size.x / 2, 
                           Screen.height / 2 - size.y / 2,
                           100, 
                           200
                           ), 
                  str, 
                  style);
    }
}

設定を反映するために、アタッチしたGameManagerのプロパティにScriptableObjectをセットします。

main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone 3.png

実行すると設定が反映されていることがわかります。黒色も作る場合には同じ手順を繰り返し、GameManagerに設定するとできます。

main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone 4.png

おまけ

以前作ったScriptableObjectのアセットをコピーして使いたいときがあるかもしれません。しかし、アセットを右クリックしてもコピーできる方法がないので、これもAssetのMenuに追加してみました。どのファイルでもいいのですが、今回はついでなので、[Scripts/Editor/CreateScriptableObjectSample.cs]に以下のコードを追記しました。

public class DuplicateAsset : MonoBehaviour {

    [MenuItem("Assets/Duplicate")]
    public static void Duplicate()
    {
        var item = Selection.activeObject;
        string path = AssetDatabase.GetAssetPath(item);
        string newPath = AssetDatabase.GenerateUniqueAssetPath(path);
        AssetDatabase.CopyAsset(path, newPath);

        AssetDatabase.Refresh();

        EditorUtility.FocusProjectWindow();
        Selection.activeObject = Resources.LoadAssetAtPath(newPath, typeof(object));
    }
}

これでアセットを
右クリックしてDuplicateをクリックするとコピーできます。

スクリーンショット_2014-10-07_17_57_15.png

赤色を作っていれてみました。目が痛いですねorz...

main_unity_-_ScriptableObjectSample_-_PC__Mac___Linux_Standalone 6.png