簡體   English   中英

GetComponent函數返回null

[英]GetComponent function returning null

我正在使用C#在Unity 2017中開發一個簡單的游戲。

在我的關卡菜單中,我有一個Text對象,其中包含一個按鈕組件,並附有一個腳本。

這是目前腳本中的內容:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LevelLock : MonoBehaviour {

    public bool isLocked = true;
    private Button lvlBtn;

    // Use this for initialization
    void Start () {
        lvlBtn = GetComponent<Button> ();
        if (lvlBtn != null) {
            Debug.Log ("this should be working");
        } else {
            Debug.Log ("you did something wrong");
        }
        //if(isLocked){
        //  lvlBtn.enabled = false;
        //}
    }

}

問題是, GetComponent<Button>()返回null ,這意味着它沒有在對象中找到按鈕組件。

我嘗試添加Animator組件並執行相同的操作只是為了檢查它確實有效,所以我不知道為什么它不應該找到按鈕組件。 如果有人可以幫忙解決這個問題,或者向我指出我做錯了什么,我會非常感激

編輯

檢查員標簽:

帶按鈕組件截圖的文本對象

控制台標簽:

Inspector標簽截圖

您的屏幕截圖顯示您LevelLock腳本附加到Button,這很好。

可能的原因和解決方法

1.組件/腳本甚至沒有附加到GameObject或附加到錯誤的對象。

在你的代碼中,調用GetComponent<Button>(); 沒有找到游戲對象第一意味着GetComponent應該尋找一個Button ,其安裝到該組件GameObject這個腳本( LevelLock )附連到。

如果你想獲取腳本,連接到另一個游戲物體,你可以通過先解決這個問題,找到游戲對象的Button組件連接到與GameObject.Find然后檢索Button從中組件/腳本。

更換

lvlBtn = GetComponent<Button> ();

GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();

3. .Script附加到多個對象

GetComponent<Button>()可能返回false的原因之一是因為您錯誤地將LevelLock腳本附加到另一個LevelLock 它可能是一個空的GameObject,但GameObject沒有附加Button組件。

找到這個LevelLockLevelLock刪除LevelLock腳本。

為此,從“項目”選項卡中選擇“ LevelLock腳本,然后轉到“ 資源”“在場景中查找引用” 從其他LevelLock刪除LevelLock腳本。

在此輸入圖像描述

這將確保LevelLock腳本僅附加到“lvl 2”GameObject


3.具有相同名稱但在不同namespace多個腳本:

如果你有兩個具有相同名稱但在不同命名空間中的類,並且在嘗試從代碼訪問另一個時將一個類附加到GameObject ,則它將為null因為它們不是相同的。 我查看了你的項目,這就是問題所在。

您創建了一個名為“Button”的腳本,而Unity帶有它自己的內置腳本/組件,也稱為“Button” ,它位於UnityEngine.UI命名空間中。

您將Unity的內置“Button”腳本附加到GameObject,但之后您嘗試從腳本中訪問自己創建的“Button”腳本。 提供UnityEngine.UI的命名空間,以便Unity知道您想要使用Unity附帶的Button組件。

更改:

vlBtn = GetComponent<Button> ();

lvlBtn = GetComponent<UnityEngine.UI.Button>();

也改變:

private Button lvlBtn;

private UnityEngine.UI.Button lvlBtn;

最后, 不要將腳本命名為與任何內置組件相同的名稱,如ButtonImageTextRigidbody等。 創建一個class名,並確保它不存在於Unity API中,否則您將繼續遇到此類問題,甚至SO上的人也無法幫助您,除非他們可以訪問您的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM