Unity3D 掛載的腳本取消勾選居然還會運行?。?/h2>

一般來說,從設計初衷來看,把掛在物體上的腳本勾選狀態(tài)改為不勾選,這個腳本就不會運行。

然而真實情形只是生命周期函數和用戶自定義的且外部不被訪問的函數不運行罷了;

enabled設置為false,且方法為外部調用的這個是必定會被執(zhí)行,暫不討論。
我遇到去掉鉤也運行的情況,是調用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方法沒有運行。
綜上,我們先懷疑一下,就是事件監(jiān)聽這類的Unity內置方法,只要掛在游戲對象上,即便不勾選也會執(zhí)行;

好的,我們試試究竟是不是真的取消了勾選,這個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+"在碰我!");
    }
}

我真的取消了勾選,居然真的真的還是運行了?。?/div>

注意: 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()里面要用到的對象,運行起來發(fā)現腳本勾不勾選都make no diffrence了;
總結: 腳本不被勾選,大部分生命周期函數不會執(zhí)行,但是內置的事件監(jiān)測的方法,譬如這個OnMouseDown(),OnTriggerEnter();都能運行;
經過確認,生命周期函數Awake,OnApplicationPause,不勾選啟動時均會調用一次,停止運行時OnDestoey會調用一次

還有一個筆者沒有試的,那就是繼承了unity內置接口并實現的,被響應也會執(zhí)行吧…

好了,要教大家躲坑了;

  1. 如果在這些方法里面寫了邏輯,邏輯里面引用的對象的,先判斷對象是否為Null;
  2. 如果這些事件監(jiān)聽的方法里面寫了音樂播放的,特效播放的,用代碼控制這個腳本的Active屬性沒用哦
    直接動態(tài)加載和卸載這個腳本就好了(Destory(GetComponet<yourcode.cs>()))
  3. 看了本文,以后調試報錯就不會因為這個現象懵逼了
  4. 針對行文開頭提及的enabled設為false,外部調用方法的問題,建議為了穩(wěn)健,可以先判斷enabled不為false時執(zhí)行。

標簽:Unity3D、腳本編程、Bug、EventSystem、OnMouseDown、OntriggerEnter、AddListener


快捷訪問:

  1. Unity3D 如何設置CubeMap
  2. UGUI Button OnClick事件統一管理
  3. UGUI Slider onValueChanged事件統一管理
  4. UGUI Toggle onValueChanged事件統一管理
  5. Unity3D監(jiān)測按鍵輸入(快捷鍵)的有效方法
  6. Unity3D Editor模式下的System.IO數據訪問
  7. Unity3D 掛載的腳本取消勾選居然還會運行??! ←您在這里
  8. Unity 代碼動態(tài)勾選或取消材質球上的選項
  9. Unity SerializeField序列化字段導致Bug的跳坑筆記
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容