エディタースクリプトで、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 公開ページ 2018.1 の新機能NewIn20181
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.