Unity3D关于挂载脚本的勾选

一般来说,从设计初衷来看,把挂在物体上的脚本勾选状态改为不勾选,这个脚本就不会运行。

然而真实情形只是生命周期函数和用户自定义的且外部不被访问的函数不运行罢了;

当enabled设置为false,且方法为外部调用的这个是必定会被执行,暂不讨论。

我遇到去掉钩也运行的情况,是调用unity API导致的,难免有些意外,就此说道说道好了!
首先,神奇的代码如下:

using UnityEngine;
public class testForChangeTexture : MonoBehaviour {
    AnimEmoj animEmoj;
    void Start () {
        animEmoj = GetComponent<AnimEmoj>();
    }
    private void OnMouseDown()
    {
        animEmoj.Playing(gameObject,0,-1);
    }
}

然后取消勾选该脚本,运行居然还会报错:
在这里插入图片描述
明明取消了脚本的勾选

在这里插入图片描述
居然这个脚本会爆出对象为空警告

我们分析下为何他会报错:显然是animEmoj没有赋值,也就是说Start方法没有运行。
综上,我们先怀疑一下,就是事件监听这类的Unity内置方法,只要挂在游戏对象上,即便不勾选也会执行;
好的,我们试试究竟是不是真的取消了勾选,这个OnMouseDown()依旧运行!
如下,Debug一下即可:

using UnityEngine;
public class testForChangeTexture : MonoBehaviour {
    AnimEmoj animEmoj;
    void Start () {
        animEmoj = GetComponent<AnimEmoj>();
        Debug.Log("运行了Start方法!");
    }
    private void OnMouseDown()
    {
        Debug.Log("我还在运行");
        animEmoj.Playing(gameObject,0,-1);
    }
}

在这里插入图片描述
运行前先挂载该脚本,但不勾选

好!! 见证奇迹时候到了(注意:Start里面的Debug没有运行~):
在这里插入图片描述对着挂载该脚本的游戏对象点击,居然还是运行了

别浪,再试试OnTriggerEnter(),不勾选能进去不?
代码块:

using UnityEngine;
public class testForChangeTexture : MonoBehaviour {
    AnimEmoj animEmoj;
    void Start () {
        Debug.Log("运行了Start方法!");
        animEmoj = GetComponent<AnimEmoj>();
    }
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("我运行了,"+other.name+"在碰我!");
    }
}

在这里插入图片描述

我真的取消了勾选,居然真的真的还是运行了!!

注意: Start里面的Debug依旧没有运行~

再来一例

using UnityEngine;
public class testForChangeTexture : MonoBehaviour {
    public AnimEmoj animEmoj;
    public GameObject obj;
    void Start () {
        Debug.Log("进来?");
    }
    private void OnMouseDown()
    {
        Debug.Log("你没有勾选,但我就是进来了!");
        if (null!=animEmoj)
        {
        animEmoj.Playing(obj, 0, -1);
        }
    }
}

Debug输出&效果:

在这里插入图片描述
没有勾选也跑的那么溜,你说坑不坑

绕过Start直接赋值OnMouseDown()里面要用到的对象,运行起来发现脚本勾不勾选都make no difference了;
总结: 脚本不被勾选,大部分生命周期函数不会执行,但是内置的事件监测的方法,譬如这个OnMouseDown(),OnTriggerEnter();都能运行;
经过确认,生命周期函数Awake,OnApplicationPause,不勾选启动时均会调用一次,停止运行时OnDestoey,OnApplicationQuit 会调用一次

还有一个笔者没有试的,那就是继承了unity内置接口并实现的,被响应也会执行吧…

好了,要教大家躲坑了;

1、如果在这些方法里面写了逻辑,逻辑里面引用的对象的,先判断对象是否为Null;
2、如果这些事件监听的方法里面写了音乐播放的,特效播放的,用代码控制这个脚本的Active属性没用哦
直接动态加载和卸载这个脚本就好了(Destory(GetComponet<yourcode.cs>()))
3、看了本文,以后调试报错就不会因为这个现象懵逼了
4、针对行文开头提及的enabled设为false,外部调用方法的问题,建议为了稳健,可以先判断enabled不为false时执行。


有时候脚本的勾选项会没有了,如:

在这里插入图片描述

这时,如果你想让勾选框显示出来, 加上Start、Update、LateUpdate、FixedUpdate、OnGUI 其中一个方法可以让勾选框显示出来。。。但是Awake不行。。


参考链接:https://www.jianshu.com/p/7a680771c34b
http://www.xuanyusong.com/archives/3130

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值