Unityで値を触りやすいデータを作ろう -拡張編3-
こんにちは。インターン生の東谷太喜です。
今日の記事が最後となります。Scriptは前回の記事のものになっております。
今回は値の入力ミスを回避するために入力の制限をしていこうと思います。
遷移シーンの入力を「String」から「SceneAsset」に変更話していきます。
1.特定のオブジェクトタイプのみの入力場所を作成
まずはシーンの選択ができるようにします。
Editor内「保持させる変数」を一つ追加します。
private Object 保持させる変数名;
保持させる変数名 = EditorGUILayout.ObjectField(“表示名”, 保持させる変数名, typeof(SceneAsset), true);
を新しく書きます。
「保持させる変数名」と「表示名」は自由に名前を付けてください。
私は「sceneObj」と「遷移シーン」にしておきます。
Editorに戻り確認をしてみると、シーンのみを選択できるようになっています。
2.シーン名をScriptableObjectに文字列で保存
ScriptableObjectに保存をしていないため、インスペクターを変えると値がリセットされてしまいます。
そこで次に、Stringで値を保存させます。
EditorGUI.BeginChangeCheck();
//変更検知範囲
if(EditorGUI.EndChangeCheck())
{
var serialized = serializedObject.FindProperty(“保存先の変数名”);
serialized.stringValue = 保持させる変数名.name;
}
これで「String」型の保存ができます。
他の型の保存方法については、今回は紹介しません。
変更をし続けるため検知をした時のみ、値を保存するようにする
EditorGUI.BeginChangeCheck();
EditorGUI.EndChangeCheck();
を使用しています。
「保存先の変数名」と「保持させる変数名」を私は「levelName」と「sceneObj」にしています。
あとは、値がNullになった際に文字列を空白にする処理を書き足せば保存処理の完成です。
試しに保存されている値も一緒に表示させてみましょう。
シーンの選択を変更した際に、文字列が変化していれば正常に動作しています。
3.文字列から「SceneAsset」を読み込む
この状態では、ScriptableObjectをインスペクターから閉じてしまうと再度開いた際に値が「None」になってしまいます。
そこで次にScriptableObjectの文字列でシーンを探し、Editorの保持先の変数に保存する処理を書きます。
開いた際の処理の呼び出しは、Unity内の関数に存在している
public void OnEnable() {}
を使用します。
では、ScriptableObjectの保存している値を取得する処理を書きます。
var serialized = serializedObject.FindProperty(“取得する変数名”);
string 変数名 = serialized.stringValue;
取得する変数名と変数名は自由な名前で大丈夫です。
foreach (var guid in AssetDatabase.FindAssets(“t:Scene”))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadMainAssetAtPath(path);
if (asset.name == sceneName)
{
sceneObj = asset;
break;
}
}
最初に「SceneAsset」に絞って検索をするために
AssetDatabase.FindAssets(“t:Scene”)
を使い、文字列のパスを取得します。
このままでは、ロードできないためアセットパスを
AssetDatabase.GUIDToAssetPath(string guid);
で変換します。
最後に見つけたオブジェクトをロードする
AssetDatabase.LoadMainAssetAtPath(string assetPath);
で取得します。
取得したオブジェクトの名前が一致したとき保存させれば、開いたときに取得が完了しているということです。
シーンの名前を変更した場合取得できなくなるので「LogError」を書き足して完成です。
終わりに
ここまで記事を見てくださった方、ありがとうございました。
他にも工夫できる点がたくさんありますので、是非とも研究してみてください。
以上で全5回の記事は終了となります。ありがとうございました。
インターンシップへの申し込み・お問い合わせ先
