我正在Unity中编写一个寻路脚本,我一直试图找出IEnumerables,我觉得我的互联网搜索措辞不正确,因为它根本不是我想要的。
我有3个脚本,1个查找节点,它添加到OpenNodes列表中,这是它自己的带有构造函数的脚本。我有一个IEnumerable,它仍然说它无法访问,或者只要公开它就需要是静态的。所以我的代码如下:
public class OpenNodes: IEnumerator, IEnumerable {
public static Vector3 node;
public static int g;
public static IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
public OpenNodes(Vector3 newNode, int newGscore)
{
node = newNode;
g = newGscore;
}
所以我试图在另一个“FinderScript”中做的就是沿着这些方向:
foreach(Vector3 node in OpenNodes)
我一直在努力解决这个问题,但我从未在像这样的构造函数列表中工作过。这对我来说是新的,所以任何帮助,都会非常感激..谢谢
编辑: 每个都需要将节点作为vector3,因为它使用.x,.y和.z值进行比较和更改。
答案 0 :(得分:0)
由于您需要为每个节点存储分数,因此您只需使用Dictionary<Vector3, int>
来存储值。
e.g。
var nodes = new Dictionary<Vector3, int>();
nodes.add(node, gScore);
然后直接访问它们
nodes[node] = ...
或循环浏览
foreach (var node in nodes.Keys) {
...
}
或者,也许你可以创建一个将得分和节点映射在一起的对象(或者只是使用Pair
然后只使用一个列表?
var nodes = new List<Vector3>();
var map = new Pair(node, gScore);
nodes.add(map);
然后按照惯例循环播放:
foreach (var node in nodes) {
...
}
不确定我是否理解正确,而且我还没有运行此代码。 HTH。
答案 1 :(得分:0)
我所面临的问题实际上更加简单。下面是我的构造函数列表的代码:
public class OpenNodes {
public Vector3 node;
public int g;
public OpenNodes(Vector3 newNode, int newGscore)
{
node = newNode;
g = newGscore;
}
}
foreach的代码如下:
foreach(OpenNodes list in OpenNode)
填充列表如下:
OpenNode.Add(new OpenNodes(nodeLocation, 0 ));
删除项目如下:
OpenNode.RemoveAll(OpenNodes => nodeLocation == OpenNodes.node && 0 == OpenNodes.g);
并且访问我的节点只是:
list.node.x
list.node
list.node.z
等。
这将迭代列表中的每个项目作为列表,然后在此之后调用每个变量。我希望这段代码可以帮助将来的某个人!