编辑器检视器面板简单扩展2+编辑器检视器面板深度扩展1

发布于:2025-03-28 ⋅ 阅读:(32) ⋅ 点赞:(0)
枚举检视器面板显示

代码:

public enum Profession
{
    Warrior=0,
    Wizard
}
public Profession Pro;   //在类中声明
小齿轮增加回调函数 

点击控制台输出:

代码:

 [ContextMenu("输出攻防比")]
 public void PrintADProportion()
 {
    Debug.Log("当前角色的攻防比:"+(Num.Atk / Num.Def));
 } //Num的声明参考前文代码,其中Atk及Def类型更改为float
为某个成员变量添加右键菜单 

点击控制台输出:

代码:

    //给一个成员变量添加右键菜单
    //第一个参数是菜单的名称
    //第二个参数是右键点击的回调函数
    [ContextMenuItem("输出国家", "OutCountry")]
    [Tooltip("右键看看")]
    public string Country;
    public void OutCountry()
    {
        Debug.Log(Country);
    }
[RequireComponent(typeof(BoxCollider))]
//关于类型和类名
//BoxCollider:是类名,适用于函数提供泛型方法 
//typeof(BoxCollider):System.Type,C#的类型,适用于函数需要System.Type参数

//当前组件依赖于盒子碰撞体
//当前组件挂载在对象上时,盒子碰撞体会一起被添加上去
//当Player(当前脚本的名字)组件没有被移除时,盒子碰撞体不能被删除
[RequireComponent(typeof(BoxCollider))]
[ExecuteInEditMode]
//使生命周期函数,在编辑器状态下可以执行,游戏中也可以正常使用
[ExecuteInEditMode]
public class Player : MonoBehaviour
{
    void Update()
    {
        Debug.Log("Update");
    }
}
 [AddComponentMenu("paramsName",intNum)]

代码:

//将Player(指定脚本的名字)组件添加到AddComponent上
//第一个参数:分类名/组件名
//第二个参数:列表中显示的顺序
[AddComponentMenu("自定义控制器/玩家控制器",1)]

        检视器高级修改(外挂式编程) 

                项目中建立Editor目录

                Editor目录下建立外挂式开发脚本

                将编辑器脚本与原始脚本关联

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//步骤1:引入编辑器的命名空间,检视器属于编辑器开发
using UnityEditor;

[CustomEditor(typeof(Player))]//步骤3:将编辑器开发脚本与需要编辑的组件脚本建立外挂关联关系
//外挂脚本因为存储在Editor目录下,所以不会被打入最终的游戏包
//不继承自Mono,而是继承自Editor
public class PlayerEditor : Editor  //步骤2:继承Editor类,使用编辑器相关的成员变量和生命周期函数
{
    
}

创建菜单

        参考TestMenu脚本

创建窗口

        TestWindow脚本

编辑器工具实现分析

        场景布置,Tool场景

        点击点预制体制作

        脚本挂载Plane,存储点击点,Update绘制点位增加时的两个点之间的线

        组件扩展类NodeManagerEditor

                OnInspectorGUI绘制列表和按钮

                OnSceneGUI实现点击场景后,位置点生成

                        位置点由HandleUtility.GUIPointToWorldRay发出射线计算问题,创建新的对象后,编辑状态会被取消,原因,新创建的对象,会占据Inspector面板,此问题有弹窗的Update,一直选中对象。

                删除按钮实现NodeManager下List内数据删除

                        Destroy会等当前帧执行完后,删除GameObject

                        DestroyImmediate会直接删除对象,不安全,有可能后续有代码处理逻辑编辑器下,对象没有脚本,生命周期函数不会运行,可以直接使用第二个API删除对象和列表中的数据

                NodeWindow窗口实现

                        创建窗口时,需要将Plane对象传递过来,保证Update可以一直选中Plane,Update()实现一直选中Plane物体。

异或位运算

        相同为零,不同为一

        A与B异或得到C,那么

                B与C异或,可再次获得A

                A与C异或,可再次获得B

        所以如果A是明文,B是密钥,C就是密文,使用异或实现的算法,可以将C密文利用B密钥,解出A即原始文字。

该系列专栏为网课课程笔记,仅用于学习参考。