一.引言
前面提到游戏物体是一个没有剧本的演员,那么下面来解析它的剧本-组件脚本
二.组件脚本
下面会从创建一个组件脚本开始进行说明
- 创建脚本的规则
- 不可在VS或Rider中直接创建脚本(习惯不好)
- 可以放在Assets目录下的任何位置(建议使用一个专门的文件夹来管理)
- 类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type)
- 建议不要使用中文名来命名
- 没有特殊需求,不用管命名空间
- 创建爱的脚本默认继承MonoBehavior
- 关于MonoBehavior基类
- 创建的脚本默认都继承MonoBehaviour继承了它才能够挂载在GameObject上
- 继承了MonoBehavior的脚本不能new只能挂!!!!
- 继承了MonnBehavior的脚本不要去写构造函数,因为我们不会去new它,写构造函数没有任何意义
- 继承了MonoBehavior的脚本可以在一个对象上挂多个(如果没有加DisallowMultipleComponent特性)
- 继承MonoBehavior的类也可以再次被继承,遵循面向对象继承多态的规则
三.组件脚本的生命周期
脚本的生命周期很重要,游戏开发就是在生命周期函数中进行逻辑操作,依靠帧刷新更新逻辑以及画面
- 关于帧的概念
- 生命周期函数图解
注意:
- 其中FixedUpdate是物理更新,可以手动控制每帧的更新时间,在Project Setting中进行修改,默认是0.02秒
- 关于Update和LateUpdate的区别,它们几乎是同步的,只不过Unity在Update和LateUpdate之间还做了一些动画的更新,我们是看不到,所以如果要移动摄像机的位置一定要在LateUpdate里面写位移逻辑,避免动画更新不及时
四.脚本域可视化编辑
我们在脚本中定义的公共成员变量或者加了[SerializeField]注解的私有和保护类型的变量是可以在Unity的Inspector视图窗口中进行手动编辑以及赋值的
![]()
![]()
注:
- 如果想让公有的成员变量不出现在Inspector中,可以使用[HideInInspector]注解进行掩藏
- 其实在脚本中很多变量都可以在Inspector窗口进行操作,如下图
- 字典是一定不行的,自定义的类型比如类和结构体,可以在类的声明前面加上[System.Serializable],并且还需要让成员和类的修饰符都是public,否则找不到
[System.Serializable] public class MyClass { public int age; public string name; } // 使用时,声明方式和一般的变量一样,在Inspector窗口中可以直接给它的成员赋值 - 一些辅助用法,了解即可,日常开发用的不是很多,但是得知道,有的时候会锦上添花
//1.分组说明特性Header //为成员分组 //Header特性 //[Header("分组说明")] [Header("基础属性")] public int age; public bool sex; [Header("战斗属性")] public int atk; public int def; //2.悬停注释Tooltip //为变量添加说明 //[Tooltip("说明内容")] [Tooltip("闪避")] public int miss; //3.间隔特性 Space() //让两个字段间出现间隔 //[Space()] [Space()] public int crit; //4.修饰数值的滑条范围Range //[Range(最小值, 最大值)] [Range(0, 10)] public float luck; //5.多行显示字符串 默认不写参数显示3行 //写参数就是对应行 //[Multiline(4)] [Multiline(5)] public string tips; //6.滚动条显示字符串 //默认不写参数就是超过3行显示滚动条 //[TextArea(3, 4)] //最少显示3行,最多4行,超过4行就显示滚动条 [TextArea(3, 4)] public string myLife; //7.为变量添加快捷方法 ContextMenuItem //参数1 显示按钮名 //参数2 方法名 不能有参数 //[ContextMenuItem("显示按钮名", "方法名")] [ContextMenuItem("重置钱", "Test")] public int money; private void Test() { money = 99; } //8.为方法添加特性能够在Inspector中执行 //[ContextMenu("测试函数")] [ContextMenu("哈哈哈哈")] private void TestFun() { print("测试方法"); }
看到的效果如上图所示 - 另外,如果我们是通过播放模式来寻找一个变量的最优解,有的时候不用截屏记住它的值,可以直接拷贝,然后粘贴覆盖之前的配置,如下图操作:
五.总结
上述主要是总结脚本搭配Inspector可视化窗口使用的技巧