【问题标题】:How to fix null references when referencing gameobject from array script?从数组脚本引用游戏对象时如何修复空引用?
【发布时间】:2019-07-26 05:41:24
【问题描述】:

当我尝试从我的 levelGen 脚本中引用数组 gameObject 时发生空引用异常,由于检查器中的所有设置都正确,因此不确定如何修复它

我已经尝试在数组中引用 gameObject 的 int,直接调用它并弄乱我的实例化脚本的不同迭代,但似乎无法让它工作。

LevelGen 脚本

    public GameObject[] blockPrefabs;
public GameObject[] blocks;
public int blockInt;
public GameObject blockInstance;
// Use this for initialization
void Start () {

    //blocks = new GameObject[blockPrefabs.Length];
    //for (int b = 0; b < blockPrefabs.Length; b++) {
        //for (int y = 0; y < 5; y++) {
            //for (int i = 0; i < 5; i++) {

                //Duplicates square in each colour
                //blocks [b] = (blockPrefabs 
  [b].gameObject); Random.Range (0,blockPrefabs.Length);
                //blocks [b] = Instantiate(blocks [b], 
  new Vector3 (i * 5.0f, y * 5.0f, 0), transform.rotation);

            for (int y = 0; y < 5; y++) {
                for (int i = 0; i < 5; i++) {
            blockInt = Random.Range (0, 
  blockPrefabs.Length);
            Instantiate (blockPrefabs [blockInt], new 
  Vector3 (i * 5.0f, y * 5.0f, 0), transform.rotation);
                Debug.Log (blockPrefabs);

光线投射脚本

 if (Input.GetButtonDown ("Fire1")) {

        Ray raycast = Camera.main.ScreenPointToRay 
 (Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast (raycast, out hit)) {

            if ((hit.collider != null) && 
 (hit.collider.gameObject == levelgen.blockPrefabs[0])) {
                    redselect.redchange = true;
                    Debug.Log ("red clicked");
                    combinations ();
                } else {
                    Debug.Log ("failed red");
                }   

能够单击实例化的对象来运行我的其余代码。在我点击它的那一刻,它返回空引用。

【问题讨论】:

  • 您能先修复您问题中的代码吗?如果代码被注释掉,所以与问题无关,而是完全删除它。目前它有点被换行符弄乱了,甚至无法编译......你真的确定所有数组都在检查器中正确填充了吗?
  • 异常到底是在哪一行抛出的?既然您说单击时会发生这种情况,似乎它与Start 方法无关... levelgenredselect 来自哪里?请添加完整的代码。另请注意,blockPrefabs 包含来自场景的预制件而不是实例化对象 => 在 hit.collider.gameObject == levelgen.blockPrefabs[0]) 中的场景引用和预制件之间的检查永远不会为真。
  • 嘿 derHugo,如果有人在其他代码尝试中看到了可行的解决方案,我将代码留在其中,应该注释掉 start 和 for int y 之间的任何内容。我还意识到 blockint 应该是块而不是 blockPrefabs,因为这得到了我的随机级别。只填写blockPrefab数组,其他数组留空。

标签: c# arrays unity3d


【解决方案1】:

在您的情况下,当 blockInt 值超出 Object 数组的范围时,会发生空引用错误。您可以通过两种方式处理它:

  1. 检查blockInt 值,即if(blockInt&lt; blockPrefabs.Length)
  2. 检查空引用,即if(blockPrefabs [blockInt]!=null)

希望这能解决您的问题!

【讨论】:

  • 在这种情况下,它会抛出 ArgumentOutOfRangeException 而不是 NullReferenceException...
  • 由于 OP 说点击时会抛出它似乎与索引无关。
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 2021-04-15
  • 2022-11-18
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多