编辑器简单开发

文章介绍了Unity中编辑器开发的基础知识,包括如何使用[SerializedField]等属性让私有变量在Inspector面板显示,以及CustomEditor和EditorWindow的使用来创建自定义编辑器和弹窗。此外,还讨论了对象的装箱拆箱、深浅拷贝的概念,并举例说明了枚举类型的深拷贝。最后,提到了资源和场景的序列化以及C#脚本的热重载(HotReloading)机制。
摘要由CSDN通过智能技术生成

编辑器简单开发

序列化标签

[SerializedField] :让私有变量可以在Inspector面板显示

[Serializable] :序列化对象 使类可以显示在Inspector面板显示

[MenuItem(“第一级视图/本方法在菜单显示的名字”)]

[Space(“与上一条显示信息空出的距离 单位/ 像素点”)]

[Mutiline("int ")] :输入框的行数设置

[TextArea(int min,int max)]:默认显示5行 最多显示10行 再多就出现滑块

[ContextMenu(“显示本方法 在编辑界面可以调用")] :inspector 界面的小齿轮出现方法

[ContextMenuItem(“显示的名字”),”调用的方法“]:给成员变量提供右键菜单

[Tooltip(”增加抬头的名字“)]

编辑器监视面板开发

1.引用 UnityEditor命名空间

2.[ CustomEditor( typrof ( 类名 ) ) ] 在脚本前面增加这个标识符

3.拿到要编辑的脚本的引用

  1. 在OnInspectorGUI()中

编辑器弹窗开发

1.引用UnityEditor命名空间

2.继承EditorWindow类

3.定义静态方法

static void OpenWind()
{
 PopWind Window=GetWindow<PopWindow>(false,"名字",true);
   // 参数1:是否是公用的 参数2:弹窗名字 参数3:是否聚焦在这个窗口
    window.minSize=new vector2();
    window.minSize=new vector2()
}

4.在OnGUI()函数中绘制界面

序列化

序列化的一个例子:UnityEngine.Object.Instantiate()

object 这个词一出现 往往使代表着最底层

常见的monobehaviour,gameobject,material,component 等等 都是继承UnityEngine.Object

而object是System.Object 这个是数据类型 string,int 等等的父类

这里又想到了 object和int 之间的装箱拆箱的问题

装箱

int a=100;
object obj=a;  //这里就涉及到了一个装箱操作了 
// 这里obj是堆里 所以 要把a copy一份 到堆里 用箱子装起来

拆箱

object obj=100;  //这个100的值是存在堆里的
int a=(int)obj;  // 栈里申请了一块空间 把obj的值拆出来 copy给a

这里聊到了拷贝 又想起了 深浅拷贝

浅拷贝 : 就是拷贝不完全 值拷贝是直接复制一份值 赋给新对象

而 引用拷贝 是两个对象公用一块地址 一个改变另一个也会随着改变

深拷贝: 就是完全拷贝 开辟一块新的大小相同的空间 互相不会影响

这里实验了

public enum Profression
{
    Warrior,
    Master
}
public class Boss
{
    public int hp = 100;
    public int Mp = 100;
    public Profression profression ;
    public Boss DeepCopy()
    {
       Boss boss = new Boss();
        boss.hp = hp;
        boss.Mp=Mp;
        boss.profression = new Profression();
        return  boss;
    }
}
public class Program
{
    public static void Main()
    {
        Boss boss1 = new Boss();       
        Console.WriteLine(boss1.profression);
        Boss boss2 = boss1.DeepCopy();
        boss2.profression = Profression.Master;
        Console.WriteLine(boss2.profression);
       Console.WriteLine(boss1.profression);
        Console.ReadKey();
    }
}

这些全部理解后 回到序列化这个问题

a)Aseet和Scene的加载和保存

资源和场景这些文件都是可以保存的 保存后其实就是序列化了 尝试用文档的形式打开 发现都是一种数据形式

b) Inspector Window

请添加图片描述

只有实实在在被序列化的成员变量才看得到 其中 public 访问权限的成员变量 是默认序列化

c#脚本序列化后在Inspector显示

在Inspector修改一些成员变量的Value会反序列化成c#脚本

c) 引擎C#层重载(Hot Reloading)

每次修改C#脚本后 都会重新编译 C#层中继承UnityEngine.Object的数据序列化 存进C++层 不管运行时怎么改变面板变量的数值 运行结束的时候反序列化回 恢复数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大橘915818

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值