首頁>Game>source

我製作了一个預製件,並將其拖放到Tile Prefab插槽中,如圖所示

在我的代碼中

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameGrid :MonoBehaviour
{
    private int width;
    private int height;
    private int[,] gridArray;
    private float cellSize;
    [SerializeField]
    GameObject tilePrefab;// = default;
    public GameGrid(int width, int height, float cellSize)
    {
        this.width = width;
        this.height = height;
        this.cellSize = cellSize;
        gridArray = new int[width, height];
        Debug.Log(width + " " + height);
        for(int x = 0; x < gridArray.GetLength(0); x++)
        {
            for(int z = 0; z < gridArray.GetLength(1); z++)
            {
                
                GameObject tile =Instantiate(tilePrefab);
                tile.transform.SetParent(transform, false);
                tile.transform.localPosition = GetWorldPosition(x,z);
            }
        }
    }
    private Vector3 GetWorldPosition(int x, int z, int y = 0)
    {
        return new Vector3(x, 0, z) * cellSize;
    }
}

1。它丟擲錯誤,ArgumentException:您要例項化的物件為null,這很奇怪,因為我在檢查器中分配了Prefab,這可能会出錯,並且控製台没有告诉您,這很奇怪.我哪一行錯了。

2。另一个錯誤是"您正在尝試使用'new'關鍵字建立MonoBehaviour。這是不允许的。",這让我感到困惑,因為我什麼也没做。

3。這行代碼" tile.transform.SetParent(transform,false);" 我从其他我不完全理解的資源中複製了內容,我查看了Unity選單仍然不了解它的功能,它設置了setParent,但是此函式尝試設置的父屬性是試圖設置其父物件的轉換還是 什麼?

非常感谢我仍然是Unity的新手。

編輯: 這是我的testing.cs

public class Testing : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameGrid grid = new GameGrid(20, 10, 1);
    }
}

1。删除預設分配也不起作用。 2.關於setParent,我没有父母,那麼這个child要与哪个父母相连,如果這个函式將例項化一个父母,那麼就没有資訊提供给父母的建立,仍然很困惑。

最新回復
  • 5月前
    1 #

    Another error is "You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed", it confused me because I did not new anything.

    您在這裏執行此操作: GameGrid grid = new GameGrid(20, 10, 1); 通過構造函式建立MonoBehaviour無效,因為它们只能在GameObject的上下文中建立.因此,它们不應具有構造函式. MonoBehaviours應该作為场景的一部分通過編輯器建立,或者如果您真的想通過代碼添加它们(如果可以避免,則不應该這樣做),您必须使用 GameObject.AddComponent方法

    如果您仍然尝試通過構造函式建立MonoBehavior,那麼Unity將無法填充任何公共變數,這就是為什麼稍後会出現NullReferenceException的原因.在檢查器中設置的內容無關紧要,因為您没有在檢查器中使用该GameGrid.您將在此處建立一个新的單独GameGrid,该GameGrid与檢查器之間没有任何連線。

    当您的MonoBehaviour需要一些初始化代碼時,那麼该代碼應该在 void Start()中 方法.您可能会註意到此方法不接受任何引數.当MonoBehaviour初始化需要一些資訊時,您需要預先設置该資訊.当您將MonoBehaviour附加到GameObject時(建議的做事方式),請使這些變數 public 並將它们放在檢查器中。

    如果要在執行時建立具有MonoBehaviour的物件,則:

    使用 GameObject newGo = new GameObject()建立一个新的GameObject .或者,获取對現有GameObject的引用以向其添加MonoBehaviour。

    建立一个新的MonoBehaviour,並使用 GameGrid grid = newGo.AddComponent<GameGrid>() as GameGrid將其附加到该新的gameObject上 .這將建立一个新元件,並將所有公共變數設置為預設值,但尚未執行Start方法。

    像這樣設置每个公共變數: grid.width = 20; .或者,您也可以建立自己的公共初始化方法並呼叫它。

    该新物件的Start方法將在下一幀之前執行。

    但是我有點困惑為什麼您首先拥有那个Testing.cs指令碼,因為您的第一张圖片顯示您已经建立了一个名為" Grid"的GameObject,並在編輯器中附加了GameGrid元件.因此,没有理由通過代碼建立另一个.虽然我不確定您到底要做什麼,但是您可能不需要该指令碼。


    關於這條線: tile.transform.SetParent(transform, false); :這会將新例項化的圖塊附加到例項化它的gameObject上. transform 這裏指的是指令碼附加到的物件的Transform元件.轉換元件也是管理父/子關係的元件.這就是為什麼 SetParent 期待新父母的轉變。

相似問題

  • animation:匯入到Unity中時,已裝配的Blender模型變形
  • unreal 4:是否可以使用新的匯入選項重新匯入資产?