current position:Home>Extended editor of unity practical function - window drawing (2)

Extended editor of unity practical function - window drawing (2)

2021-08-27 08:53:40 Mr_ Wen

This is my participation 8 The fourth of the yuegengwen challenge 23 God , Check out the activity details :8 Yuegengwen challenge

summary

In the last article, we talked about , stay unity Expand through the editor , Beautified Inspector panel , Actually unity The editor extension also has a lot of functions , In addition to being able to Unity Editor for control drawing , You can also create a new window for the editor , And set his window layout . Next, let's learn together , stay Unity How to create a custom layout window in the editor .

Function realization

Want to create a window , Then the script must inherit EditorWindow, Script inheritance EditorWindow At the same time , The script must reference using UnityEditor; Namespace , Otherwise, inheritance is wrong .
First, we create an inheritance EditorWindow Script , Also put it in Editor Under the folder

using UnityEditor;

public class EditorWindowTest : EditorWindow
{ 
}
 Copy code 

We create a static method to open the window , At the same time, in this method , We can customize the design of the window .

static void OpenWindow()
{
}
 Copy code 

Want to display this method to Unity Editor , Inherit only Editorwindow Not yet , We also need to use unity Another feature of [MenuItem]

Let's take a look at MenuItem
MenuItem yes UnityEditor Properties under , It is an extension to the editor , There are two main functions :

  1. Add menu items to the main menu , That is to add... In the following Editor section , This is a very important use , It is often used when developing plug-ins .
  2. Add a menu item in the context of the component in the property panel , Extensions to existing components in the editor

Be careful : Functions are generally private , And it must be a static function to use MenuItem attribute . Why must it be static Function? , Because this class can be used without instantiation , Don't inherit from MonoBehavior, For example, add a reset attribute function to the rigid body , There is no need to add script components , therefore , We can set many similar menu items in an extension script . So what we use in the above code is static. What is commonly used is

    public MenuItem(string itemName);
 Copy code 

itemName Is the menu path name , Menu shortcuts can be added :( Add the following symbol after the space to set ), as follows :

_w  A single shortcut  W 
#w shift+w 
%w ctrl+w 
&w Alt+w
 Copy code 

MenuItem Let's introduce it here for the time being , Let's get back to the point , Set a path for our method , Such as : In the menu bar Tools Under the OpenWindow

[MenuItem("Tools/OpenWindow")]
static void OpenWindow()
{
}
 Copy code 

In this way, the method we just wrote appears in the menu bar image.png Next we create a window , First, specify the size of the window

Rect rect = new Rect(0, 0, 500, 500);
 Copy code 

After setting the size , All that's left is to create a form

EditorWindowTest window = (EditorWindowTest)EditorWindow.GetWindowWithRect(typeof(EditorWindowTest), rect, true, " Custom create window ");
window.Show();
 Copy code 

After you've written , Click the menu bar and the following effect will appear

 Exhibition 7.gif Here we will create the window successfully , Of course, this is just a window into the book , Nothing , Let's enrich this window , Add an input box to the window 、 Add a text box to show the mouse position 、 Add a selection map function , Open and close the notification bar , Close the window and other functions . These functions are written in OnGUI Methods

Add an input box control

 text = EditorGUILayout.TextField(" Please enter the content :", text);
 Copy code 

image.png Open the notice

First create a button to open the notification

GUILayout.Button(" Open the notice ", GUILayout.Width(200))
 Copy code 

Then write the method to open the notification bar

 this.ShowNotification(new GUIContent(" This is a notification message "));
 Copy code 

The effect is as follows  Exhibition 8.gif Closing notice

Closing notification is basically the same as the above method , First create the button before writing the method

if (GUILayout.Button(" Closing notice ", GUILayout.Width(200)))
{
    // Close the notification bar 
    this.RemoveNotification();
}
 Copy code 

Add a text box to display the mouse position

Method of obtaining mouse position ( Have shortcomings , Not all places can get )

Event.current.mousePosition
 Copy code 

Add a text box and display the mouse position

EditorGUILayout.LabelField(" Mouse position :", Event.current.mousePosition.ToString());
 Copy code 

 Exhibition 9.gif Select Map

The map selection function is basically the same as that written in the previous article

texture = EditorGUILayout.ObjectField(" Select Map ", texture, typeof(Texture), true) as Texture;
 Copy code 

The overall effect of the above functions is as follows image.png

Knowledge point expansion

Here are some life cycles that may be used by the extension editor
When the window gets the focus

private void OnFocus()
{
    Debug.Log(" Called once when the window gains focus ");
}
 Copy code 

When the window loses focus

private void OnLostFocus()
{
    Debug.Log(" Called once when the window loses focus ");
}
 Copy code 

When Hierarchy When any object in the view changes

private void OnHierarchyChange()
{
    Debug.Log(" When Hierarchy Called once when any object in the view changes ");
}
 Copy code 

When Project When any object in the view changes

private void OnProjectChange()
{
    Debug.Log(" When Project Called once when any object in the view changes ");
}
 Copy code 

Hot update of window panel

private void OnInspectorUpdate()
{
    Debug.Log(" Hot update of window panel ");
    // Open window redraw , Otherwise, the information will not be refreshed 
    this.Repaint();
}
 Copy code 

When the window is open , And in Hierarchy When a game object is selected in the view

private void OnSelectionChange()
{
    // When the window is open , And in Hierarchy Called when a game object is selected in the view 
    foreach (var item in Selection.transforms)
    {
        // It is possible to choose more , Here starts a cycle 
        Debug.Log("OnSelectionChange:" + item.name);
    }
}
 Copy code 

When the window closes

private void OnDestroy()
{
    Debug.Log(" Called when the window is closed ");
}
 Copy code 

Let's take a look at the final effect

 Exhibition 10.gif

Source code address

GitHub Download address : Click here to jump to download

At the end

This article mainly introduces ,Unity How the editor expands the window , In order to be more convenient in the development process , The next article will continue to introduce in Unity How to extend the editor in , The function is also very practical , Welcome to learn and exchange .

copyright notice
author[Mr_ Wen],Please bring the original link to reprint, thank you.
https://en.qdmana.com/2021/08/20210827085334606I.html

Random recommended