我是C#和Unity的新手,他遇到了我无法解决的错误。
我有两个类,tileMap和rangeHandler。我在tileMap中有一个tileTypes数组,包含名称,对象和移动成本,我需要在rangeHandler中引用它来确定角色可以走多远。在tileMap中,我有一个函数(下面),它返回给定tile的moveCost,在pathfinding函数中使用时没有错误。
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]]没有设置为对象的实例,即使tile [targetX,targetY]是用于的相同值寻找路径。下面是tileMap中调用tileCost的位置,然后是rangeHandler中调用的位置。
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网站上没有得到任何答案。有什么想法吗?
答案 0 :(得分:0)
我认为此行失败
tileData td = tileTypes[tiles[targetX, targetY]];
tileTypes为null或tiles [targetX,targetY]为null。分成2行
var idx = tiles[targetX,targetY];
var td = tileTypes[idx];
这样您就可以看到哪一个为null并使用调试器来检查值