代码改变世界

unity3d拓展编辑器Editor的使用

  糯米粥  阅读(1054)  评论(0编辑  收藏  举报

Editor可以拓展Inspector窗口

可以通过代码自己绘制监测面板

先来看一个效果:

复制代码
 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEditor;
 4 
 5 //Editor:使用这个为你的对象来创建自己的自定义检视面板和编辑器。
 6 public class myScript : MonoBehaviour
 7 {
 8     /*
 9        [HideInInspector]
10      * [SerializeField]
11      * 意思是:隐藏数据在面板,并且序列化。它可以帮我们永久保存数据,
12      * 如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。
13      * 
14      * 比如一个属性希望被外部访问(必须是public)。但不希望显示在检视面板中
15      * 
16      * 那么就:
17      * [HideInInspector]
18      * public int s;
19      * 
20      */
21 
22     [HideInInspector]
23     [SerializeField]
24     Rect pRectValue;
25 
26     public Rect PRectValue
27     {
28         get { return pRectValue; }
29         set { pRectValue = value; }
30     }
31 
32     [HideInInspector]
33     [SerializeField]
34     Texture pTexture;
35 
36     public Texture PTexture
37     {
38         get { return pTexture; }
39         set { pTexture = value; }
40     }
41 
42     [HideInInspector]
43     [SerializeField]
44     private int a;
45 
46     public int A
47     {
48         get { return a; }
49         set { a = value; }
50     }
51 }
52 
53 [CustomEditor(typeof(myScript))]
54 class show : Editor
55 {
56     //在这里方法中就可以绘制面板。
57     public override void OnInspectorGUI()
58     {
59         //得到myScript对象
60         myScript test = (myScript)target;
61         //绘制一个窗口
62         test.PRectValue = EditorGUILayout.RectField("窗口坐标", test.PRectValue);
63         //绘制一个贴图槽
64         test.PTexture = EditorGUILayout.ObjectField("增加一个贴图", test.PTexture, typeof(Texture), true) as Texture;
65 
66         test.A = EditorGUILayout.IntField("最大值", test.A);
67     }
68 }
复制代码

这个类并没有放进Editor文件夹中。

其实我们完全可以把需要序列化的类和编辑类分开;

把myScript类修改:

复制代码
using UnityEngine;
using System.Collections;
using UnityEditor;

//Editor:使用这个为你的对象来创建自己的自定义检视面板和编辑器。
public class myScript : MonoBehaviour
{
    /*
       [HideInInspector]
     * [SerializeField]
     * 意思是:隐藏数据在面板,并且序列化。它可以帮我们永久保存数据,
     * 如果不加的话数值就会重置。就好比我先添加了一个贴图,一运行游戏刚刚添加的贴图就变成null了。
     * 
     * 比如一个属性希望被外部访问(必须是public)。但不希望显示在检视面板中
     * 
     * 那么就:
     * [HideInInspector]
     * public int s;
     * 
     */

    [HideInInspector]
    [SerializeField]
    Rect pRectValue;

    public Rect PRectValue
    {
        get { return pRectValue; }
        set { pRectValue = value; }
    }

    [HideInInspector]
    [SerializeField]
    Texture pTexture;

    public Texture PTexture
    {
        get { return pTexture; }
        set { pTexture = value; }
    }

    [HideInInspector]
    [SerializeField]
    private int a;

    public int A
    {
        get { return a; }
        set { a = value; }
    }
}
复制代码



创建一个类:editors.cs,放进Editor文件夹中。

复制代码
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(myScript))]
public class editors : Editor
{
    //在这里方法中就可以绘制面板。
    public override void OnInspectorGUI()
    {
        //得到myScript对象
        myScript test = (myScript)target;
        //绘制一个窗口
        test.PRectValue = EditorGUILayout.RectField("窗口坐标1", test.PRectValue);
        //绘制一个贴图槽
        test.PTexture = EditorGUILayout.ObjectField("增加一个贴图1", test.PTexture, typeof(Texture), true) as Texture;

        test.A = EditorGUILayout.IntField("最大值1", test.A);
    }
}
复制代码

看效果:

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
'
点击右上角即可分享
微信分享提示