简单地说,我有以下清单:
[System.Serializable]
public class PatrolGraph : MonoBehaviour {
public List<Node> nodes = new List<Node>();
public List<Edge> edges = new List<Edge>();
[...]
}我使用从编辑器运行的方法生成两个列表(节点和边)。节点和边缘都是可序列化的,边缘包含两个节点。但是,在我点击play之后,保存在边缘列表边缘对象中的节点似乎与我的节点列表(NodeA.Equals(NodeB))中的节点不一样,尽管它们应该是相同的。如果我运行函数以在播放模式(在编辑模式下运行的相同)生成列表,那么Equals函数突然返回true。
以下是Node和Edge类的代码:
节点:
[System.Serializable]
public class Node
{
public float lastVisited = 0;
public Vector3 position;
}边缘:
[System.Serializable]
public class Edge
{
public Node A;
public Node B;
public Edge (Node A, Node B)
{
this.A = A;
this.B = B;
}
}我希望边缘对象中的节点A和B与我点击play后保存在节点列表中的节点相同。我做错了什么?
提前感谢
发布于 2018-06-30 13:28:28
正如Kacper所提到的,在使用序列化时不可能保存引用。反序列化之后,在多个变量中引用的节点将为每个变量产生独立的实例,并在对这些实例使用时使等于函数返回false。
不过,我还是设法通过向节点添加id来保存节点之间的边,这些节点表示它们的列表索引。
for (int i = 0; i< nodes.Length; i++){
nodes[i].id = i;
}边只保存节点的索引/ids,而不是引用节点本身。
public class Edge
{
public int id_1;
public int id_2;
}解决了问题。
https://stackoverflow.com/questions/51013288
复制相似问题