Version: 2023.2

EditorAction

class in UnityEditor.Actions

切换到手册

描述

Represents an action that spans over multiple frames.

using System;
using UnityEditor;
using UnityEditor.Actions;
using UnityEditor.Overlays;
using UnityEngine;
using UnityEngine.UIElements;

public class EditorActionSampleOverlay : Overlay
{
    Vector3Field m_Field;

    public Action<Vector3> positionChanged;

    public void SetPosition(Vector3 position)
    {
        m_Field?.SetValueWithoutNotify(position);
    }

    public override VisualElement CreatePanelContent()
    {
        m_Field = new Vector3Field();
        m_Field.RegisterValueChangedCallback((evt) => positionChanged?.Invoke(evt.newValue));
        return m_Field;
    }
}

public class EditorActionSample : EditorAction
{
    [MenuItem("Test/Start Action Sample")]
    static void StartEditorActionSample()
    {
        Start(new EditorActionSample());
    }

    public Vector3 handlePosition = Vector3.zero;

    EditorActionSampleOverlay m_Overlay;

    public EditorActionSample()
    {
        // Create the overlay when the action is created
        m_Overlay = new EditorActionSampleOverlay();
        m_Overlay.SetPosition(handlePosition);
        m_Overlay.positionChanged += (value) => handlePosition = value;
        SceneView.AddOverlayToActiveView(m_Overlay);
        m_Overlay.displayed = true;
    }

    protected override void OnFinish(EditorActionResult result)
    {
        // Remove the overlay when the action is finished
        SceneView.RemoveOverlayFromActiveView(m_Overlay);

        Debug.Log($"Action Finished [{result}] with position: {handlePosition}");
    }

    public override void OnSceneGUI(SceneView sceneView)
    {
        EditorGUI.BeginChangeCheck();
        handlePosition = Handles.PositionHandle(handlePosition, Quaternion.identity);

        if (EditorGUI.EndChangeCheck())
        {
            m_Overlay.SetPosition(handlePosition);
        }

        var evt = Event.current;
        switch (evt.type)
        {
            case EventType.KeyDown:
                if (evt.keyCode == KeyCode.Return)
                {
                    Finish(EditorActionResult.Success);
                    evt.Use();
                }
                break;
        }
    }
}
using UnityEngine;
using UnityEditor;
using UnityEditor.Actions;

public class SingleFrameActionSample : EditorAction
{
    [MenuItem("Test/Start Single Frame Action")]
    static void StartEditorActionSample()
    {
        Start(new SingleFrameActionSample(4));
    }

    int m_Value;

    public SingleFrameActionSample(int value)
    {
        m_Value = value;
        Finish(EditorActionResult.Success);
    }

    protected override void OnFinish(EditorActionResult result)
    {
        m_Value += 2;
        Debug.Log($"Action Finished [{result}] with value: {m_Value}");
    }
}

公共函数

FinishFinishes an EditorAction with a specific result.
OnSceneGUICallback raised when the Scene view calls OnGUI.

受保护的函数

OnFinishCallback raised when the EditorAction is finished.

静态函数

StartStarts an EditorAction that spans over multiple frames.