一般来说,从设计初衷来看,把挂在物体上的脚本勾选状态改为不勾选,这个脚本就不会运行。
然而真实情形只是生命周期函数和用户自定义的且外部不被访问的函数不运行罢了;
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 diffrence了;
总结: 脚本不被勾选,大部分生命周期函数不会执行,但是内置的事件监测的方法,譬如这个OnMouseDown(),OnTriggerEnter();都能运行;
经过确认,生命周期函数Awake,OnApplicationPause,不勾选启动时均会调用一次,停止运行时OnDestoey会调用一次
还有一个笔者没有试的,那就是继承了unity内置接口并实现的,被响应也会执行吧…
好了,要教大家躲坑了;
- 如果在这些方法里面写了逻辑,逻辑里面引用的对象的,先判断对象是否为Null;
- 如果这些事件监听的方法里面写了音乐播放的,特效播放的,用代码控制这个脚本的Active属性没用哦
直接动态加载和卸载这个脚本就好了(Destory(GetComponet<yourcode.cs>())) - 看了本文,以后调试报错就不会因为这个现象懵逼了
- 针对行文开头提及的enabled设为false,外部调用方法的问题,建议为了稳健,可以先判断enabled不为false时执行。
标签:Unity3D、脚本编程、Bug、EventSystem、OnMouseDown、OntriggerEnter、AddListener
快捷访问: