目录
前言
本篇笔记用于记录唐老狮视频课程的学习心得。
Inspector窗口在Unity工作中占据了一个非常重要的地位,这篇笔记主要用来记录这个窗口与变量相关的内容与知识。
除了Unity软件本身运用的c#的反射原理,我们要在Inspector窗口中查看与编辑变量还运用到了c#中关于特性的知识。
在Inspector窗口中修改的意义,我认为主要是更加方便的修改和保存变量,利于我们调试项目。
修饰符对显示的影响
首先,在正常情况下,我们不使用任何特性,那么只有修饰符是public的成员变量可以被显示,用private和protected修饰的变量都不能被显示。如果你使用任何修饰符,那么默认会使用private修饰,所以也不能被显示。
public class Study : MonoBehaviour
{
int commonInt = 1;
public int publicInt = 2;
private int privateInt = 3;
protected int protectedInt = 4;
}
上面我创建了一个Study的脚本,代码是里面的主要内容,并且挂载到了一个GameObject上,下图是在Untiy里面的显示效果。
可以很清楚的看到,只有publicInt,也就是加了public修饰符的成员变量被显示了。
显示私有和被保护对象
对于使用了private和protected修饰符的成员变量,我们还可以使用特性[serializeField]来让它们在Inspector中显示出来。
public class Study : MonoBehaviour
{
[SerializeField]
int commonInt = 1;
public int publicInt = 2;
[SerializeField]
private int privateInt = 3;
[SerializeField]
protected int protectedInt = 4;
}
我们在变量前面加上这个特性就可以让它们显示出来啦,如下图所示。
隐藏公共对象
不想让公共对象被显示出来,我们可以使用特性[HideInInspector]来隐藏我们的公共对象。
public class Study : MonoBehaviour
{
[SerializeField]
int commonInt = 1;
[HideInInspector]
public int publicInt = 2;
[SerializeField]
private int privateInt = 3;
[SerializeField]
protected int protectedInt = 4;
}
在public前面加上了这个特性,效果如下图所示。
很清楚的可以看到public修饰的int被隐藏了。
不同类型在Inspector中的显示
不用特性就可以显示的类型
大部分类型都可以直接在Inspector中显示,除了上文提到的整数类型,还包括数组、字符串、列表、枚举、Unity中的GameObject等。默认类型基本都支持显示。
public enum Enum{
我是枚举,
这是枚举
}
public class Study : MonoBehaviour
{
public int[] array; //数组
public string str; //字符串
public List<int> list; //列表
public Enum publicEnum; //枚举
public GameObject gameObject; //Unity中的GameObject
}
效果如下图所示。
显示自定义的类型
我们自己写的结构体和类是不能被显示,但是我们可以使用System这个命名空间提供的序列化特性,也就是[System.Serializable]来让他们被显示出来。
//结构体
[System.Serializable]
public struct Struct
{
public int name;
public bool sex;
}
//类
[System.Serializable]
public class Class
{
public int name;
public bool sex;
}
public class Study : MonoBehaviour
{
public Struct myStruct;
public Class myClass;
}
效果如下图所示。
无法被显示的类型
在一般情况下,有的类是无论如何也无法被显示出来的,比如Dictionary字典类,即便你使用了特性,也无法让它在Inspector窗口中显示。
public class Study : MonoBehaviour
{
public Dictionary<int,string> dic;
}
我们会发现,不论如何也无法让字典在Inspector窗口中显示出来。
锦上添花的辅助特性
这些特性可能并不是特别重要,但是在管理数据上可以为我们提供更多的便利。
Header
这是分组说明特性,能为我们的成员变量分组,方便管理和理解这些变量的作用。
public class Study : MonoBehaviour
{
[Header("分组说明")]
public int a;
[Header("账号密码")]
public int account;
public string password;
}
效果如下图所示。
Tooltip
可以为自己的变量增加提示词,但实际上用起来比较麻烦和鸡肋,不如给变量取一个容易理解的名字。
public class Study : MonoBehaviour
{
[Tooltip("这是闪避率")]
public float miss;
}
我们需要把鼠标放在这个变量上就会显示这个提示词了。
Space()
可以让两个字段之间出现间隔。对初学者而言也是个比较鸡肋的特性,做复杂的脚本的时候可能会用到。
public class Study : MonoBehaviour
{
public int atk;
public int dfs;
[Space()]
public float miss;
public int hp;
}
如下图所示,变量之间空了一行。
Range
修饰数值的大小范围,可以让我们用滚动条、滑条来调整这个数值的大小。
public class Study : MonoBehaviour
{
[Range(0,10)]
public float MyFloat;
}
它同时规定了这个数值的大小范围,我们是无法越出这个大小范围的。
Multiline
多行显示字符串,如果不填写参数就是默认三行。
public class Study : MonoBehaviour
{
[Multiline]
public string str1;
[Multiline(5)]
public string str2;
}
效果如下图所示。
TestArea
与上一个特性类似,效果是,如果内容超过一定行数就会显示滚动条,如果不填写参数,就默认三行。
public class Study : MonoBehaviour
{
//[TextArea(最少显示几行,最多显示几行)]
[TextArea(2,4)]
public string str1;
}
效果如下图所示。
ContextMenuItem
为变量提供快捷方法,第一个参数时为按钮命名,第二个参数时函数的方法名,不需要参数。
我们需要再脚本里有对应名字的函数,是无返回值无参数的函数。一般用来重置变量。这个方法的修饰符是无所谓的,即便是priavte和protected也是可以的。
public class Study : MonoBehaviour
{
[ContextMenuItem("名字","Name")]
public string str1;
public void Name(){
str1 = "111";
}
}
我们需要右键这个变量名来唤出菜单,然后我们就可以看到这个方法了。
ContextMenu
能为方法添加特性,让它们能在Inspector窗口中被执行。
我们可以用这个功能来进行一些测试,在运行的时候,一般没什么用。
public class Study : MonoBehaviour
{
[ContextMenu("打印东西")]
public void Speak(){
Debug.Log("我要在控制台打印东西啦。");
}
}
我们可以左键这个脚本右上角那竖着的三个点,就可以找到这个方法了。
总结
Inspector窗口里面的变量关联的就是对象成员变量,改变他们的值就是在改变成员变量的值。
我们在把这个脚本拖拽到我们的对象上之后,在回到代码里面改变默认值的话,是不会改变那些已经挂载好了的脚本里的成员变量的值的。
在Untiy运行中是发生改变的值不会改变。不过还是可以通过拷贝这个脚本和粘贴这个脚本的值的方法来让这个值保存下来。
文章仅用于学习使用,如果有错误请指出,一起进步,谢谢!