エディタースクリプトで、ObjectFactory クラスを使用して、新しいゲームオブジェクト、コンポーネント、アセットを作成します。これらのアイテムを作成するとき、ObjectFactory
クラスは自動的にデフォルトのプリセットを使用します。スクリプトはデフォルトの プリセット を検索して適用する必要はありません。なぜなら、ObjectFactory
がこれを処理するからです。
デフォルトでプリセットをサポートし使用可能にするには、以下のいずれかからクラスを継承する必要があります。
プリセットのインスペクターはクラスの一時的なインスタンスを作成します。そのため、ユーザーはその値を変更できます。ですから、クラスが静的な値、プロジェクトアセット、シーンインスタンスなどの他のオブジェクトに影響を与えたり、依存しないようにしてください。
ヒント CustomEditor 属性の使用は必須ではありません。
プリセットを使用できる設定でカスタムのEditorWindow クラスを設定する場合、以下を行なってください。
設定のコピーを保存するには、ScriptableObject を使用します。ScriptableObject は CustomEditor 属性も持つことができます。プリセットシステムがこのオブジェクトを処理します。
UI のプリセット設定を表示するには、常にこの一時的 ScriptableObject
インスペクターを使用します。これにより、ユーザーは EditorWindow
で同じUIを持つことができ、保存したプリセットを編集することができます。
プリセットが Select Preset ウィンドウで選択されているとき、プリセットボタンを表示し、独自の PresetSelectorReceiver 実装を使用して EditorWindow
設定を最新の状態に保ってください。
以下のスクリプトサンプルは、簡易な EditorWindow
にプリセット設定を加える方法を示しています。
このスクリプトサンプルは、カスタムウィンドウの設定 (Editor/MyWindowSettings.cs という名前のファイルに保存されます) を保持し、表示する ScriptableObject を示しています。
using UnityEngine;
// プリセットシステムに使われる一時的 ScriptableObject
public class MyWindowSettings : ScriptableObject
{
[SerializeField]
string m_SomeSettings;
public void Init(MyEditorWindow window)
{
m_SomeSettings = window.someSettings;
}
public void ApplySettings(MyEditorWindow window)
{
window.someSettings = m_SomeSettings;
window.Repaint();
}
}
カスタムウィンドウで使用される ScriptableObject
を更新する PresetSelectorReceiver
のスクリプトサンプル (Editor/MySettingsReceiver.cs という名前のファイルに保存されます)。
using UnityEditor.Presets;
// 選択した値で EditorWindow を更新する PresetSelector レシーバー
public class MySettingsReceiver : PresetSelectorReceiver
{
Preset initialValues;
MyWindowSettings currentSettings;
MyEditorWindow currentWindow;
public void Init(MyWindowSettings settings, MyEditorWindow window)
{
currentWindow = window;
currentSettings = settings;
initialValues = new Preset(currentSettings);
}
public override void OnSelectionChanged(Preset selection)
{
if (selection != null)
{
// 選択したものを一時設定に適用
selection.ApplyTo(currentSettings);
}
else
{
// 何も選択されていない場合。初期値を一時的な選択に適用します
initialValues.ApplyTo(currentSettings);
}
// 新しい一時設定を管理インスタンスに適用
currentSettings.ApplySettings(currentWindow);
}
public override void OnSelectionClosed(Preset selection)
{
// SelectionChange を最後にもう一度呼び出し、確実に、最後に選択した値にします
OnSelectionChanged(selection);
// ここで、レシーバーを破棄します。そのため、レシーバーへの参照を保持する必要はありません。
DestroyImmediate(this);
}
}
EditorWindow のスクリプトサンプル。EditorWindow は一時的な ScriptableObject インスペクターとプリセットボタン(Editor/MyEditorWindow.cs という名前のファイルに保存) を使用してカスタム設定を表示します。
using UnityEngine;
using UnityEditor;
using UnityEditor.Presets;
public class MyEditorWindow : EditorWindow
{
// プリセットアイコンとスタイルを取得し、表示します
private static class Styles
{
public static GUIContent presetIcon = EditorGUIUtility.IconContent("Preset.Context");
public static GUIStyle iconButton = new GUIStyle("IconButton");
}
Editor m_SettingsEditor;
MyWindowSettings m_SerializedSettings;
public string someSettings
{
get { return EditorPrefs.GetString("MyEditorWindow_SomeSettings"); }
set { EditorPrefs.SetString("MyEditorWindow_SomeSettings", value); }
}
// ウィンドウを開くメソッド
[MenuItem("Window/MyEditorWindow")]
static void OpenWindow()
{
GetWindow<MyEditorWindow>();
}
void OnEnable()
{
// 設定とそのインスペクターを作成します
//ウィンドウの設定とプリセットに関するカスタムインスペクターを 1 つだけ作成できます
m_SerializedSettings = ScriptableObject.CreateInstance<MyWindowSettings>();
m_SerializedSettings.Init(this);
m_SettingsEditor = Editor.CreateEditor(m_SerializedSettings);
}
void OnDisable()
{
Object.DestroyImmediate(m_SerializedSettings);
Object.DestroyImmediate(m_SettingsEditor);
}
void OnGUI()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("My custom settings", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
// "MyManager Settings" 行の最後にプリセットボタンを作成します
var buttonPosition = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight, Styles.iconButton);
if (EditorGUI.DropdownButton(buttonPosition, Styles.presetIcon, FocusType.Passive, Styles.iconButton))
{
// receiver インスタンスを作成。これは、ウィンドウが表示されると破棄されます。そのため、それに対する参照を保持する必要はありません。
var presetReceiver = ScriptableObject.CreateInstance<MySettingsReceiver>();
presetReceiver.Init(m_SerializedSettings, this);
// PresetSelector モデルウィンドウを表示。presetReceiver はデータを更新します。
PresetSelector.ShowSelector(m_SerializedSettings, null, true, presetReceiver);
}
EditorGUILayout.EndHorizontal();
// デフォルトインスペクターの設定を表示し、それに加えられた変更を取得します
EditorGUI.BeginChangeCheck();
m_SettingsEditor.OnInspectorGUI();
if (EditorGUI.EndChangeCheck())
{
// 設定エディターの変更をインスタンスに適用します
m_SerializedSettings.ApplySettings(this);
}
}
}
2017–03–27 Page published 2018.1 の新機能NewIn20181