Version: 2021.1
言語: 日本語
バッチモードとビルトインコルーチンの互換性
テキストシーン形式

カスタムメニュー項目とエディター機能のサポート

エディタースクリプトで、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

バッチモードとビルトインコルーチンの互換性
テキストシーン形式