ゲームバランスをUnity Editor上で設定したい時に手軽な方法として、ScriptableObjectを使う方法があります。
ScriptableObjectを使うと、GameObjectにアタッチしない状態で独立したAssetとして持つことができます。
今回は以下のように、白文字と黒文字を切り替えれる、2つの設定を作ります。
手順
まず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
直下に作られます。
適当に設定します。
次にシーンに先ほど作成した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をセットします。
実行すると設定が反映されていることがわかります。黒色も作る場合には同じ手順を繰り返し、GameManagerに設定するとできます。
おまけ
以前作った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をクリックするとコピーできます。
赤色を作っていれてみました。目が痛いですねorz...