编辑器简单开发
序列化标签
[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.拿到要编辑的脚本的引用
- 在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++层 不管运行时怎么改变面板变量的数值 运行结束的时候反序列化回 恢复数据。