版本:Unity 6 (6000.0)
语言:英语
预设
通过文件夹将默认预设应用于资源

支持预设

在您的编辑器脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间修改组件属性并以您喜欢的任何方式响应用户输入。更多信息
查看 词汇表
中,使用ObjectFactory 类来创建新的游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、摄像机、路标等等。游戏对象的的功能由附加到它的组件定义。更多信息
查看 词汇表
、组件和资源。当创建这些项目时,ObjectFactory 类会自动使用默认预设。您的脚本不必搜索和应用默认预设,因为 ObjectFactory 会为您处理。

支持新类型

为了默认支持和启用预设,您的类必须继承自以下之一

预设检查器一个 Unity 窗口,显示当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑这些值。更多信息
查看 词汇表
会创建您类的一个临时实例,以便用户可以修改它的值,因此请确保您的类不会影响或依赖于其他对象,例如静态值、项目资源或场景一个场景包含游戏环境和菜单。可以将每个独特的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰物,本质上是设计和构建游戏的各个部分。更多信息
查看 词汇表
实例。

提示:使用 CustomEditor 属性是可选的。

用例示例:自定义编辑器窗口中的预设设置

当设置一个带有可以使用预设的设置的自定义 EditorWindow 类时

  • 使用 ScriptableObject 来存储您的设置副本。它也可以有一个 CustomEditor 属性。预设系统会处理这个对象。

  • 始终使用这个临时的 ScriptableObject 检查器来显示您UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。更多信息
    查看 词汇表
    中的预设设置。这使您的用户能够在 EditorWindow 中以及编辑保存的预设时具有相同的 UI。

  • 公开一个预设按钮,并使用您自己的 PresetSelectorReceiver 实现来在选择预设窗口中选择预设时保持 EditorWindow 设置最新。

以下脚本示例演示如何将预设设置添加到一个简单的 EditorWindow

此脚本示例演示一个 ScriptableObject,它在一个自定义窗口中保留和显示设置(保存在名为 Editor/MyWindowSettings.cs 的文件中)

using UnityEngine;

// Temporary ScriptableObject used by the Preset system

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();
    }
}

PresetSelectorReceiver 的脚本示例,它更新自定义窗口中使用的 ScriptableObject(保存在名为 Editor/MySettingsReceiver.cs 的文件中)

using UnityEditor.Presets;

// PresetSelector receiver to update the EditorWindow with the selected values.

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)
        {
            // Apply the selection to the temporary settings
            selection.ApplyTo(currentSettings);
        }
        else
        {
            // None have been selected. Apply the Initial values back to the temporary selection.
            initialValues.ApplyTo(currentSettings);
        }
        
        // Apply the new temporary settings to our manager instance
        currentSettings.ApplySettings(currentWindow);
    }
    
    public override void OnSelectionClosed(Preset selection)
    {
        // Call selection change one last time to make sure you have the last selection values.
        OnSelectionChanged(selection);
        // Destroy the receiver here, so you don't need to keep a reference to it.
        DestroyImmediate(this);
    }
}

一个 EditorWindow 的脚本示例,它使用一个临时 ScriptableObject 检查器及其预设按钮来显示自定义设置(保存在名为 Editor/MyEditorWindow.cs 的文件中)

using UnityEngine;
using UnityEditor;
using UnityEditor.Presets;

public class MyEditorWindow : EditorWindow

{
    // get the Preset icon and a style to display it
    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); }
    }
   
    // Method to open the window
    [MenuItem("Window/MyEditorWindow")]
    static void OpenWindow()
    {
        GetWindow<MyEditorWindow>();
    }

    void OnEnable()
    {
        // Create your settings now and its associated Inspector
        // that allows to create only one custom Inspector for the settings in the window and the Preset.
        m_SerializedSettings = ScriptableObject.CreateInstance<MyWindowSettings>();
        m_SerializedSettings.Init(this);
        m_SerializedSettings.hideFlags = HideFlags.DontSave;
        m_SettingsEditor = Editor.CreateEditor(m_SerializedSettings);
        m_SettingsEditor.hideFlags = HideFlags.DontSave;
    }

    void OnDisable()
    {
        Object.DestroyImmediate(m_SerializedSettings);
        Object.DestroyImmediate(m_SettingsEditor);
    }

    void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("My custom settings", EditorStyles.boldLabel);
        GUILayout.FlexibleSpace();
        // create the Preset button at the end of the "MyManager Settings" line.
        var buttonPosition = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight, Styles.iconButton);

        if (EditorGUI.DropdownButton(buttonPosition, Styles.presetIcon, FocusType.Passive, Styles.iconButton))
        {
            // Create a receiver instance. This destroys itself when the window appears, so you don't need to keep a reference to it.
            var presetReceiver = ScriptableObject.CreateInstance<MySettingsReceiver>();
            presetReceiver.Init(m_SerializedSettings, this);
            // Show the PresetSelector modal window. The presetReceiver updates your data.
            PresetSelector.ShowSelector(m_SerializedSettings, null, true, presetReceiver);
        }
        EditorGUILayout.EndHorizontal();
        
        // Draw the settings default Inspector and catch any change made to it.
        EditorGUI.BeginChangeCheck();
        m_SettingsEditor.OnInspectorGUI();

        if (EditorGUI.EndChangeCheck())
        {
            // Apply changes made in the settings editor to our instance.
            m_SerializedSettings.ApplySettings(this);
        }
    }
}

2017-03-27 页面发布 2018.1 中的新功能 NewIn20181

预设
通过文件夹将默认预设应用于资源