对象引用有时被设置为一个对象的实例(Unity)

本文关键字:实例 Unity 一个对象 设置 对象引用 | 更新日期: 2023-09-27 18:17:34

我是c#和Unity的新手,一直遇到一个我无法解决的错误。

我有两个类,tileMap和rangeHandler。我在tileMap中有一个包含名称、对象和移动成本的tileTypes数组,我需要在rangeHandler中引用它来确定角色可以走多远。在tileMap中,我有一个函数(如下所示),它返回给定tile的moveCost,在寻路函数中使用它不会出错。

public float tileCost(int sourceX, int SourceY, int targetX, int targetY)
     {
         tileData td = tileTypes[tiles[targetX, targetY]];
         float cost = td.moveCost;
         if (canEnter(targetX, targetY) == false)
         {
             return Mathf.Infinity;
         }
         //cosmetic increase to movement cost for diagonals
         if(sourceX != targetX && SourceY != targetY)
         {
             cost += 0.001F;
         }
         return cost;
     }

然而,当我从rangeHandler调用相同的函数时,它告诉我tileTypes[tiles[targetX, targetY]]没有设置为对象的实例,即使tiles[targetX, targetY]是寻路中使用的相同值。下面是在tileMap中调用tileCost的地方,然后是在rangeHandler中调用tileCost的地方。

foreach (Node v in u.edges)
             {
                 //float alt = dist[u] + u.DistanceTo(v);
                 float alt = dist[u] + tileCost(u.x, u.y, v.x, v.y);
                 if (alt < dist[v])
                 {
                     dist[v] = alt;
                     prev[v] = u;
                 }
             }

using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 using Random = UnityEngine.Random;

 public class rangeHandler : MonoBehaviour
 {
     public tileMap map = new tileMap();
     public tileData td = new tileData();
     Dictionary<Node, Node> prev = new Dictionary<Node, Node>();
     Dictionary<Node, float> dist = new Dictionary<Node, float>();
     List<Node> unvisited = new List<Node>();

     public static bool[,] tilesHighlighted = null;


     public void getRange(int x, int y, int r)
      {
         r--;
          tilesHighlighted = new bool[tileMap.mapX, tileMap.mapY];
         foreach (Node v in tileMap.graph)
         {
                 dist[v] = Mathf.Infinity;
                 prev[v] = null;

             unvisited.Add(v);
         }

         //adds the source to the highlight array


         tilesHighlighted[x, y] = true;
          //then adds all adjacent tiles too

          foreach (Node n in tileMap.graph[x, y].edges)
          {

                 tilesHighlighted[n.x, n.y] = true;

                 dist[n] = map.tileCost(tileMap.graph[x, y].x, tileMap.graph[x, y].y, n.x, n.y);

                 extendRange(n.x, n.y, r, n);


          }
          map.generateRange(true);
      }

错误在tileCost()的第一行,我在Unity网站上没有得到任何答案。什么好主意吗?

对象引用有时被设置为一个对象的实例(Unity)

我假设这行不行

 tileData td = tileTypes[tiles[targetX, targetY]];

tileTypes为null或tiles[targetX,targetY]为null。分成两行

var idx = tiles[targetX,targetY];
var td = tileTypes[idx];

所以你可以看到哪个是空的,并使用调试器检查值