Unity学习-组件脚本以及其生命周期

298 阅读4分钟

一.引言

前面提到游戏物体是一个没有剧本的演员,那么下面来解析它的剧本-组件脚本

二.组件脚本

下面会从创建一个组件脚本开始进行说明

  1. 创建脚本的规则
    • 不可在VS或Rider中直接创建脚本(习惯不好)
    • 可以放在Assets目录下的任何位置(建议使用一个专门的文件夹来管理)
    • 类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type)
    • 建议不要使用中文名来命名
    • 没有特殊需求,不用管命名空间
    • 创建爱的脚本默认继承MonoBehavior
  2. 关于MonoBehavior基类
    • 创建的脚本默认都继承MonoBehaviour继承了它才能够挂载在GameObject上
    • 继承了MonoBehavior的脚本不能new只能挂!!!!
    • 继承了MonnBehavior的脚本不要去写构造函数,因为我们不会去new它,写构造函数没有任何意义
    • 继承了MonoBehavior的脚本可以在一个对象上挂多个(如果没有加DisallowMultipleComponent特性)
    • 继承MonoBehavior的类也可以再次被继承,遵循面向对象继承多态的规则

三.组件脚本的生命周期

脚本的生命周期很重要,游戏开发就是在生命周期函数中进行逻辑操作,依靠帧刷新更新逻辑以及画面

  1. 关于帧的概念 image.png
  2. 生命周期函数图解 image.png 注意:
    • 其中FixedUpdate是物理更新,可以手动控制每帧的更新时间,在Project Setting中进行修改,默认是0.02秒
    • 关于Update和LateUpdate的区别,它们几乎是同步的,只不过Unity在Update和LateUpdate之间还做了一些动画的更新,我们是看不到,所以如果要移动摄像机的位置一定要在LateUpdate里面写位移逻辑,避免动画更新不及时

四.脚本域可视化编辑

我们在脚本中定义的公共成员变量或者加了[SerializeField]注解的私有和保护类型的变量是可以在Unity的Inspector视图窗口中进行手动编辑以及赋值的 image.png image.png
注:

  • 如果想让公有的成员变量不出现在Inspector中,可以使用[HideInInspector]注解进行掩藏
  • 其实在脚本中很多变量都可以在Inspector窗口进行操作,如下图 成员变量Inspector操作_.gif
  • 字典是一定不行的,自定义的类型比如类和结构体,可以在类的声明前面加上[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("测试方法");
        }
    
    image.png
    看到的效果如上图所示
  • 另外,如果我们是通过播放模式来寻找一个变量的最优解,有的时候不用截屏记住它的值,可以直接拷贝,然后粘贴覆盖之前的配置,如下图操作: 暴力复制组件值_.gif

五.总结

上述主要是总结脚本搭配Inspector可视化窗口使用的技巧