Unity3D
Unity

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

More than 3 years have passed since last update.

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