45
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-07

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

45
42
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?