对象引用有时被设置为一个对象的实例(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网站上没有得到任何答案。什么好主意吗?
我假设这行不行
tileData td = tileTypes[tiles[targetX, targetY]];
tileTypes为null或tiles[targetX,targetY]为null。分成两行
var idx = tiles[targetX,targetY];
var td = tileTypes[idx];
所以你可以看到哪个是空的,并使用调试器检查值