42
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

ゲームバランスを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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
42
Help us understand the problem. What are the problem?