Overlays
Posisi GameObjects

Buat kustom Login

Anda dapat membuat panel kustom Overlays dan Overlays toolbarSe baris tombol dan kontrol dasar di bagian atas Editor Unity yang memungkinkan Anda untuk berinteraksi dengan Editor dengan berbagai cara (misalnya scaling, terjemahan). More info
Lihat di Glossary
untuk jendela SceneA Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary
view
Anda.

Sitemap Untuk informasi tentang membuat UIElements, lihat .Tip: For information about creating UIElements, see the .

The EditorToolbarElement

Elemen toolbar dapat berisi teks, ikon, atau kombinasi keduanya.

Gunakan [EditorToolbarElement(Identifier, EditorWindowType)] untuk mendaftarkan elemen toolbar untuk digunakan dalam implementasi ToolbarOverlay.

Anda mungkin mengherankan jenis VisualElement dan memberikan styling sendiri, tetapi elemen toolbar memerlukan styling khusus, sehingga lebih disukai untuk menginherit salah satu jenis EditorToolbar yang ditentukan:

  • EditorToolbarButton - berdasarkan UnityEditor.UIElements.ToolbarButton
  • EditorToolbarDropdown - berdasarkan EditorToolbarButton
  • EditorToolbarDropdownToggle - berdasarkan UnityEngine.UIElements.BaseField<bool>
  • EditorToolbarToggle - berdasarkan UnityEditor.UIElements.ToolbarToggle

Sitemap Jika sebuah toolbar didermaga secara horizontal atau secara vertikal teks akan dip clipped atau tidak terlihat, jadi tentukan ikon untuk masing-masing.Tip: If a toolbar is docked horizontally or vertically the text will be clipped or not visible, so specify an icon for each.

Panel Overlays

Semua Overlays harus mewarisi kelas dasar Overlay dan menerapkan metode CreatPanelContent(). Ini menciptakan panel dasar yang dapat Anda gunakan sebagai-is atau menambahkan elemen toolbar.

  1. Buat folder dan nama baru.
  2. Buka skrip baru Anda.
  3. Hapus konten boilerplate antara kurung curly utama dan menerapkan kelas Overlay di namespace UnityEditor.Overlays.
  4. Override fungsi CreatePanelContent dan tambahkan konten Anda ke elemen visual.
  5. Tambahkan Overlayattribute ke kelas dan tentukan jenis jendela Overlay ini akan tersedia. Tentukan EditorWindow sebagai jenis, akan membuat Overlay tersedia di semua jendela Editor, menentukan SceneView akan membuat Overlay tersedia dalam Scene viewTampilan interaktif ke dunia yang Anda buat. Anda menggunakan Adegan Lihat untuk memilih dan posisi pemandangan, karakter, kamera, lampu, dan semua jenis lain dari Game Object. More info
    Lihat di Glossary
    hanya.
  6. Tambahkan nama, ID, dan nama tampilan.
  7. Opsional: Tambahkan Iconattribute ke kelas Overlay untuk menentukan ikon mana yang digunakan dalam mode terkondensasi. Jika tidak ada ikon yang ditentukan, maka secara default sistem menggunakan dua huruf pertama dari nama Overlay (atau dua huruf awal pertama dari dua kata pertama).

Example

using UnityEditor;
using UnityEditor.Overlays;
using UnityEngine.UIElements;
[Overlay(typeof(SceneView), "My Custom Toolbar", true)]
public class MyToolButtonOverlay : Overlay
{
    public override VisualElement CreatePanelContent()
    {
        var root = new VisualElement() { name = "My Toolbar Root" };
        root.Add(new Label() { text = "Hello" });
        return root;

    }
}

Overlay Toolbar

Login Overlays adalah wadah yang memegang item toolbar dan terdiri dari koleksi EditorToolbarElement.

Login Overlays memiliki tata letak horisontal, vertikal, dan panel built-in. ToolbarOverlay menerapkan konstruktor tanpa parameter, melewati ID EditorToolbarElementAttribute. Tidak seperti panel Overlays, konten didefinisikan sebagai potongan mandiri yang dikumpulkan untuk membentuk garis elemen.

  1. Seperti dengan panel Overlays, mulailah dengan membuat skrip C# dan menyimpannya di folder Editor Anda, lalu buka dan edit skrip Anda.
  2. Tambahkan elemen toolbar.
  3. Tambahkan elemen toolbar ke konstruktor Overlay.
  4. Tambahkan panel Overlay dan menerapkan dengan elemen toolbar.

Saat membuat toolbar Sitemap

  • Gunakan elemen toolbar [EditorToolbarElement(Identifier, EditorWindowType)] untuk digunakan dalam implementasi ToolbarOverlay.
  • Semua Overlays harus ditandai dengan OverlayAttribute
  • Overlay Toolbar harus mewarisi ToolbarOverlay dan menerapkan konstruktor tanpa parameter.
  • Isi bilah alat diisi dengan ID string, yang dilewatkan ke konstruk dasar.
  • ID didefinisikan oleh EditorToolbarElementAttribute.
  • atribut Icon mendefinisikan ikon yang terlihat ketika Overlay runtuh. Jika tidak disediakan, dua huruf pertama dari nama Overlay (atau dua huruf awal pertama dari dua kata pertama) digunakan.

Ketika menerapkan elemen ToolbarOverlay-specific dalam Overlay:

  • Antarmuka IAccessContainerWindow adalah untuk toolbar hanya, oleh karena itu, elemen tidak akan menyadari konteksnya. Dalam DropdownToggleExample, memperbesar elemen tidak akan melakukan apa pun.
  • Elemen toolbar tidak akan membawa styling di Overlay. Gunakan styling UIElement untuk visual.

Example

Contoh ini menunjukkan Overlay bernama Elemen Toolbar Contoh yang menunjukkan elemen toolbar:

  • EditorToolbarButton
  • EditorToolbarToggle
  • EditorToolbarDropdown
  • Login Login

Setiap elemen toolbar dibuat sebagai kelas mandiri dan kemudian ditambahkan ke panel Overlay.

  • Dapat diatur sebagai panel, horisontal, dan vertikal.
  • Tombol termasuk teks dan tooltips.
  • Toolbar memiliki ikon yang ditentukan oleh Iconattribute yang akan terlihat ketika toolbar runtuh.
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using UnityEngine;
    using UnityEditor.EditorTools;
    using UnityEditor.Toolbars;
    using UnityEditor.Overlays;
    using UnityEngine.UIElements;
    using UnityEditor;

    // Use [EditorToolbarElement(Identifier, EditorWindowType)] to register toolbar elements for use in ToolbarOverlay implementation.

    [EditorToolbarElement(id, typeof(SceneView))]
    class DropdownExample : EditorToolbarDropdown
    {
        public const string id = "ExampleToolbar/Dropdown";

        static string dropChoice = null;

        public DropdownExample()
        {
            text = "Axis";
            clicked += ShowDropdown;
        }

        void ShowDropdown()
        {
            var menu = new GenericMenu();
            menu.AddItem(new GUIContent("X"), dropChoice == "X", () => { text = "X"; dropChoice = "X"; });
            menu.AddItem(new GUIContent("Y"), dropChoice == "Y", () => { text = "Y"; dropChoice = "Y"; });
            menu.AddItem(new GUIContent("Z"), dropChoice == "Z", () => { text = "Z"; dropChoice = "Z"; });
            menu.ShowAsContext();
        }
    }
    [EditorToolbarElement(id, typeof(SceneView))]
    class ToggleExample : EditorToolbarToggle
    {
        public const string id = "ExampleToolbar/Toggle";
        public ToggleExample()
        {
            text = "Toggle OFF";
            this.RegisterValueChangedCallback(Test);
        }

        void Test(ChangeEvent<bool> evt)
        {
            if (evt.newValue)
            {
                Debug.Log("ON");
                text = "Toggle ON";
            }
            else
            {
                Debug.Log("OFF");
                text = "Toggle OFF";
            }
        }
    }

    [EditorToolbarElement(id, typeof(SceneView))]
    class DropdownToggleExample : EditorToolbarDropdownToggle, IAccessContainerWindow
    {
        public const string id = "ExampleToolbar/DropdownToggle";

        // This property is specified by IAccessContainerWindow and is used to access the Overlay's EditorWindow.

        public EditorWindow containerWindow { get; set; }
        static int colorIndex = 0;
        static readonly Color[] colors = new Color[] { Color.red, Color.green, Color.cyan };
        public DropdownToggleExample()
        {
            text = "Color Bar";
            tooltip = "Display a color rectangle in the top left of the Scene view. Toggle on or off, and open the dropdown" +
                      "to change the color.";

        // When the dropdown is opened, ShowColorMenu is invoked and we can create a popup menu.

            dropdownClicked += ShowColorMenu;

        // Subscribe to the Scene view OnGUI callback so that we can draw our color swatch.

            SceneView.duringSceneGui += DrawColorSwatch;
        }

        void DrawColorSwatch(SceneView view)
        {

         // Test that this callback is for the Scene View that we're interested in, and also check if the toggle is on
        // or off (value).

            if (view != containerWindow || !value)
            {
                return;
            }

            Handles.BeginGUI();
            GUI.color = colors[colorIndex];
            GUI.DrawTexture(new Rect(8, 8, 120, 24), Texture2D.whiteTexture);
            GUI.color = Color.white;
            Handles.EndGUI();
        }

        // When the dropdown button is clicked, this method will create a popup menu at the mouse cursor position.

        void ShowColorMenu()
        {
            var menu = new GenericMenu();
            menu.AddItem(new GUIContent("Red"), colorIndex == 0, () => colorIndex = 0);
            menu.AddItem(new GUIContent("Green"), colorIndex == 1, () => colorIndex = 1);
            menu.AddItem(new GUIContent("Blue"), colorIndex == 2, () => colorIndex = 2);
            menu.ShowAsContext();
        }
    }

    [EditorToolbarElement(id, typeof(SceneView))]
    class CreateCube : EditorToolbarButton//, IAccessContainerWindow
    {
        // This ID is used to populate toolbar elements.

        public const string id = "ExampleToolbar/Button";

        // IAccessContainerWindow provides a way for toolbar elements to access the `EditorWindow` in which they exist.
        // Here we use `containerWindow` to focus the camera on our newly instantiated objects after creation.
        //public EditorWindow containerWindow { get; set; }

        // Because this is a VisualElement, it is appropriate to place initialization logic in the constructor.
        // In this method you can also register to any additional events as required. In this example there is a tooltip, an icon, and an action.

        public CreateCube()
        {

    // A toolbar element can be either text, icon, or a combination of the two. Keep in mind that if a toolbar is
        // docked horizontally the text will be clipped, so usually it's a good idea to specify an icon.

            text = "Create Cube";
            icon = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/CreateCubeIcon.png");
            tooltip = "Instantiate a cube in the scene.";
            clicked += OnClick;
        }

        // This method will be invoked when the `Create Cube` button is clicked.

        void OnClick()
        {
            var newObj = GameObject.CreatePrimitive(PrimitiveType.Cube).transform;

        // When writing editor tools don't forget to be a good citizen and implement Undo!

            Undo.RegisterCreatedObjectUndo(newObj.gameObject, "Create Cube");

        //if (containerWindow is SceneView view)
        //    view.FrameSelected();

        }

    }

    // All Overlays must be tagged with the OverlayAttribute

    [Overlay(typeof(SceneView), "ElementToolbars Example")]

        // IconAttribute provides a way to define an icon for when an Overlay is in collapsed form. If not provided, the name initials are used.

    [Icon("Assets/unity.png")]

    // Toolbar Overlays must inherit `ToolbarOverlay` and implement a parameter-less constructor. The contents of a toolbar are populated with string IDs, which are passed to the base constructor. IDs are defined by EditorToolbarElementAttribute.

    public class EditorToolbarExample : ToolbarOverlay
    {

     // ToolbarOverlay implements a parameterless constructor, passing the EditorToolbarElementAttribute ID.
    // This is the only code required to implement a toolbar Overlay. Unlike panel Overlays, the contents are defined
    // as standalone pieces that will be collected to form a strip of elements.

        EditorToolbarExample() : base(
            CreateCube.id,
            ToggleExample.id,
            DropdownExample.id,
            DropdownToggleExample.id
            )
        { }
    }


Implementasi elemen Toolbar

Setelah menambahkan elemen toolbar, menerapkan panel Overlay.

Kontrolnya sama dengan setaranya di UIToolkit tetapi mengherankan beberapa fungsi toolbar (seperti keadaan runtuh, orientasi, dan panel) dan styling khusus.

EditorToolbarButton

Kelas mandiri yang akan berisi semua logika elemen. Berikut adalah contoh tombol yang membuat kubus saat diklik.

[EditorToolbarElement(id, typeof(SceneView))]
class CreateCube : EditorToolbarButton
{
// This ID is used to populate toolbar elements.

public const string id = "ExampleToolbar/Button";   

// Because this is a VisualElement, it is appropriate to place initialization logic in the constructor.

// In this method you can also register to any additional events as required. In this example there is a tooltip, an icon, and an action.

    public CreateCube()
       {

// A toolbar element can be either text, icon, or a combination of the two. Keep in mind that if a toolbar is docked horizontally the text will be clipped, so it's a good idea to specify an icon.

            text = "Create Cube";
            icon = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/CreateCubeIcon.png");
            tooltip = "Instantiate a cube in the scene.";
            clicked += OnClick;
}

void OnClick()
{
    var newObj = GameObject.CreatePrimitive(PrimitiveType.Cube).transform;

    // When writing editor tools, don't forget to be a good citizen and implement Undo.

    Undo.RegisterCreatedObjectUndo(newObj.gameObject, "Create Cube");

// Note: Using ObjectFactory class instead of GameObject(like in this example) will register the undo entry automatically removing the need to register manually.

}
}

Tambahkan ID elemen ke konstruktor Overlay:

[Overlay(typeof(SceneView), "ElementToolbar Example")]
[Icon("Assets/unity.png")]
public class EditorToolbarExample : ToolbarOverlay
{
    EditorToolbarExample() : base(CreateCube.id) { }

}

EditorToolbarToggle

Buat kelas mandiri yang berisi semua logika elemen. Berikut adalah contoh sederhana dari toggle yang mencetak keadaan di konsol dan memperbarui teksnya dalam elemen.

[EditorToolbarElement(id, typeof(SceneView))]
class ToggleExample : EditorToolbarToggle
{
    public const string id = "ExampleToolbar/Toggle";
    public ToggleExample()
    {
        text = "Toggle OFF";

    // Register the class to a callback for when the toggle’s state changes

        this.RegisterValueChangedCallback(OnStateChange);
    }

    void OnStateChange(ChangeEvent<bool> evt)
    {
        if (evt.newValue)
        {

    // Put logic for when the state is ON here

                Debug.Log("Toggle State -> ON");
        text = "Toggle ON";
        }
        else
        {

    // Put logic for when the state is OFF here

                Debug.Log("Toggle State -> OFF");
        text = "Toggle OFF";
        }
    }
}

Tambahkan ID elemen ke konstruktor Overlay:

[[Overlay(typeof(SceneView), "ElementToolbar Example")]
[Icon("Assets/unity.png")]
public class EditorToolbarExample : ToolbarOverlay
{
    EditorToolbarExample() : base(
ToggleExample.id
) { }

}

EditorToolbarDropdown

Buat kelas mandiri yang berisi semua logika elemen. Berikut adalah contoh sederhana dari drop-down yang menyesuaikan teks dengan pilihan drop-down.

[EditorToolbarElement(id, typeof(SceneView))]
class DropdownExample : EditorToolbarDropdown
{
    public const string id = "ExampleToolbar/Dropdown";

    static string dropChoice = null;

    public DropdownExample()
    {
        text = "Axis";
        clicked += ShowDropdown;
    }

    void ShowDropdown()
    {

// A simple GenericMenu to populate the dropdown content

        var menu = new GenericMenu();
        menu.AddItem(new GUIContent("X"), dropChoice == "X", () => { text = "X"; dropChoice = "X"; });
        menu.AddItem(new GUIContent("Y"), dropChoice == "Y", () => { text = "Y"; dropChoice = "Y"; });
        menu.AddItem(new GUIContent("Z"), dropChoice == "Z", () => { text = "Z"; dropChoice = "Z"; });
        menu.ShowAsContext();
    }
}

Tambahkan ID elemen ke konstruktor Overlay:

[Overlay(typeof(SceneView), "ElementToolbar Example")]
[Icon("Assets/unity.png")]
public class EditorToolbarExample : ToolbarOverlay
{
    EditorToolbarExample() : base(
DropdownExample.id
) { }

}

Login Login

Buat kelas mandiri yang berisi semua logika elemen. Sebuah toggle drop-down adalah dropdown yang juga dapat ditoggled (Seperti menu Gizmo dalam pandangan Adegan). Contoh ini menciptakan persegi panjang berwarna di sudut pandang Adegan ketika beralih dengan warna yang dipilih dari dropdown.

[EditorToolbarElement(id, typeof(SceneView))]
class DropdownToggleExample : EditorToolbarDropdownToggle, IAccessContainerWindow
{
    public const string id = "ExampleToolbar/DropdownToggle";


    // This property is specified by IAccessContainerWindow and is used to access the Overlay's EditorWindow.

    public EditorWindow containerWindow { get; set; }
    static int colorIndex = 0;
    static readonly Color[] colors = new Color[] { Color.red, Color.green, Color.cyan };
    public DropdownToggleExample()
    {
        text = "Color Bar";
        tooltip = "Display a color rectangle in the top left of the Scene view. Toggle on or off, and open the dropdown" +
                "to change the color.";


   // When the dropdown is opened, ShowColorMenu is invoked and you can create a pop-up menu.

        dropdownClicked += ShowColorMenu;


    // Subscribe to the Scene view OnGUI callback to draw a color swatch.

        SceneView.duringSceneGui += DrawColorSwatch;
    }


    void DrawColorSwatch(SceneView view)
    {

        // Test that this callback is for the correct Scene view, and check if the toggle is on
     // or off (value).

        if (view != containerWindow || !value)
        {
            return;
        }


        Handles.BeginGUI();
            GUI.color = colors[colorIndex];
        GUI.DrawTexture(new Rect(8, 8, 120, 24), Texture2D.whiteTexture);
        GUI.color = Color.white;
        Handles.EndGUI();
    }


    // When the drop-down button is clicked, this method creates a pop-up menu at the mouse cursor position.

    void ShowColorMenu()
    {
        var menu = new GenericMenu();
        menu.AddItem(new GUIContent("Red"), colorIndex == 0, () => colorIndex = 0);
        menu.AddItem(new GUIContent("Green"), colorIndex == 1, () => colorIndex = 1);
        menu.AddItem(new GUIContent("Blue"), colorIndex == 2, () => colorIndex = 2);
        menu.ShowAsContext();
    }
}

Tambahkan ID elemen ke konstruktor Overlay:

[Overlay(typeof(SceneView), "ElementToolbar Example")]
[Icon("Assets/unity.png")]
public class EditorToolbarExample : ToolbarOverlay
{
    EditorToolbarExample() : base(
DropdownToggleExample.id
) { }


}

Panel Overlay

Menerapkan Overlay Panel dan tambahkan elemen toolbar kelas mandiri. Dalam contoh di bawah ini, semua elemen toolbar disertakan untuk menunjukkan cara menambahkan beberapa elemen ke toolbar. Elemen Toolbar harus disertakan dalam Overlay Panel untuk terlihat.

[Overlay(typeof(SceneView), "ElementToolbar Example")]
[Icon("Assets/unity.png")]
public class EditorToolbarExample : Overlay
{
    public override VisualElement CreatePanelContent()
    {
        var root = new VisualElement() { name = "My Tool Root" };
        root.Add(new CreateCube());
        root.Add(new ToggleExample());
        root.Add(new DropdownExample());
        root.Add(new DropdownToggleExample());
        return root;
    }
}
Overlays
Posisi GameObjects