簡體   English   中英

(Unity) 游戲對象不引用預制件

[英](Unity) gameObject not referencing the prefab

編輯:我發現了問題。 我簡直就是個大笨蛋!

我從“IEnumerator”中刪除了“public static”並修復了所有問題。

我是編程的完全初學者,這是我編寫的第一個程序。 為了學習,我決定重新制作簡單的游戲,Flappy Bird 是我的第一次嘗試。

我的問題:我用“[SerializeField] GameObject”聲明了一個游戲對象,但無法在檢查器中分配預制件。

這個腳本“SpawnPipes”附加到一個空的游戲對象“PipeSpawner”

    [SerializeField] public GameObject Pipe;

    //declared some other variables and stuff.. 

   
    void Start()
    {
        StartCoroutine(SpawnRoutine());
    }


    public static IEnumerator SpawnRoutine()
    {
        while (spawningOn == true)
        {
            Instantiate(Pipe,
                new Vector3(xpos, UnityEngine.Random.Range(minYPos, maxYPos), 0), Quaternion.identity);

            Debug.Log("spawned a pipe");

            yield return new WaitForSeconds(spawnRate);
        }
    } 

如您所見,我已經聲明了一個序列化的游戲對象“Pipe”,因此應該會顯示在檢查器中。 它確實……一開始。

我正在做一些最后的錯誤修復,突然這段代碼崩潰了。 我正在編輯一個不同的腳本(其中包括根據游戲狀態將“spawningOn”變為 true 或 false 的代碼),當我對其進行測試時,我的 SpawnPipes 腳本出現了一個新錯誤,我什至沒有碰過它!

這是錯誤消息:

非靜態字段、方法或屬性“SpawnPipes.Pipe”需要 object 引用

該錯誤使我參考了該行

Instantiate (Pipe,

當我 hover 超過“管道”時,突出顯示我的“GameObject Pipe;” 所以我知道這兩者之間的關系是正確的。 但它似乎認為我沒有分配預制件,但我確實這樣做了。

我嘗試的第一件事是將我的“GameObject Pipe”更改為“static GameObject Pipe”。 這消除了錯誤,但是當我測試游戲時,管道沒有產生,我得到的消息是我試圖實例化的 object 是 null,因為沒有 object 分配給“GameObject Pipe”..

我在檢查器中打開了我的游戲對象“PipeSpawner”,並查看了“SpawnPipes”腳本,由於某種原因,我的 Pipe 字段不見了。 請記住,我將我的游戲對象 Pipe 聲明為序列化和公開的,因此沒有理由丟失它!

我刪除了 GameObject 聲明代碼,並在有和沒有“static”的情況下重寫了它,該字段沒有返回。 我重新導入了我所有的預制件,該字段沒有返回。 我重新啟動了 Visual Studios 和 Unity,字段沒有返回。

最終,我不記得發生了什么,但我確實讓這個領域回來了,我再次將我的 pipe 預制件分配給它。

但是,它仍然說

非靜態字段、方法或屬性“SpawnPipes.Pipe”需要 object 引用

預制件已分配! 只有一個字段名為“管道”,所以我知道它已分配給正確的字段! 請幫忙!

[SerializeField] public GameObject Pipe;

是非靜態字段,這意味着 static 函數無法訪問它,考慮將 function 設置為非靜態

public IEnumerator SpawnRoutine()

in this case you won't be able to call the function directly you need an instance of the class, you could use singleton to call the function.

聽起來您需要將腳本組件添加到游戲對象,然后在選中游戲對象的檢查器中,向下滾動到腳本並將游戲對象拖到它所在的空欄中。 我可能是錯的,因為我沒有在 Unity 上查看您的界面,但聽起來您可能需要這樣做。

出現錯誤消息“非靜態字段、方法或屬性‘SpawnPipes.Pipe’需要一個 object 引用”,因為“SpawnRoutine”方法被標記為“靜態”,但它正在嘗試訪問“管道” " 不是 static 的變量。因為 "SpawnRoutine" 方法是 static,它不能訪問非靜態的 "Pipe" 變量。

要解決此問題,您可以將“Pipe”變量設置為 static,或者從“SpawnRoutine”方法中刪除“static”關鍵字。 但是,如果您將“Pipe”變量設置為 static,請注意它將在“SpawnPipes”腳本的所有實例之間共享,這可能不是所需的行為。

檢查分配給“管道”變量的預制件是否不是 null 或在項目中丟失也很重要。 錯誤消息“object is null”表示實例化試圖從 null 引用創建 object。

如果問題仍然存在,則腳本執行順序可能存在問題,這意味着設置“Pipe”變量值的腳本可能未在“SpawnRoutine”方法之前執行。 要解決此問題,您可以在 Unity 編輯器中調整腳本執行順序,方法是選擇“SpawnPipes”腳本並將其設置為在其他腳本之前執行。 看起來錯誤的發生是因為“SpawnRoutine”方法被標記為“靜態”,但它正在嘗試訪問非靜態“管道”變量。

為了解決這個問題,您可以:

  1. 從“SpawnRoutine”方法中刪除“static”關鍵字,以便它可以訪問非靜態“Pipe”變量。

     public IEnumerator SpawnRoutine()

    { while (spawningOn == true) { Instantiate(Pipe, new Vector3(xpos, UnityEngine.Random.Range(minYPos, maxYPos), 0), Quaternion.identity); Debug.Log("產生了一個管道"); yield return new WaitForSeconds(spawnRate); } }

  2. 使“Pipe”變量為static,這樣它就可以被static“SpawnRoutine”方法訪問到。

     public static GameObject Pipe;

檢查分配給“管道”變量的預制件是否不是 null 或在項目中丟失也很重要。 如果“spawningOn”未設置為 true,管道將不會生成。

最后,確保腳本執行順序設置正確,設置“Pipe”變量值的腳本在“SpawnRoutine”方法之前執行。

暫無
暫無

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

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