Unity сериализованные объекты в разных списках не равны после нажатия Play - PullRequest
0 голосов
/ 24 июня 2018

В основном у меня есть эти списки:

[System.Serializable]
public class PatrolGraph : MonoBehaviour {

public List<Node> nodes = new List<Node>();
public List<Edge> edges = new List<Edge>();
[...]
}

Я генерирую оба списка (узлы и ребра), используя метод, который запускаю из редактора. Node и Edge являются сериализуемыми, а Edge содержит два узла. Однако после нажатия кнопки воспроизведения узлы, сохраненные в объектах Edge списка ребер, не кажутся такими же, как узлы в моем списке узлов (NodeA.Equals (NodeB)), даже если они должны быть. Если я запускаю функцию для генерации списков во время воспроизведения (то же, что я запускаю в режиме редактирования), функция Equals внезапно возвращает true.

Вот код для классов Node и Edge:

Node:

[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 в объектах Edge были теми же узлами, что и те, что были сохранены в списке узлов после того, как я нажал play. Что я делаю неправильно?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Как упомянул Kacper, невозможно сохранить ссылки при использовании сериализации. После десериализации узлы, на которые ссылаются несколько переменных, приведут к отдельным экземплярам для каждой переменной и заставят функцию Equals возвращать false при использовании в этих экземплярах.

Однако мне удалось сохранить края между узлами, добавив идентификаторы к узлам, которые представляют их индекс списка

for (int i = 0; i< nodes.Length; i++){
nodes[i].id = i;
}

и наличие ребер только для сохранения индекса / идентификаторов узлов вместо ссылки на сами узлы

public class Edge
{
public int id_1;
public int id_2;
}

которая решила проблему.

0 голосов
/ 24 июня 2018

Это потому, что Object.Equals проверяет только ссылки, когда Edge и Node являются ссылочными типами.И Сериализация создает новый объект с новым адресом, поэтому Equals возвращает false.Если вы переопределите этот метод для проверки значений полей, это решит вашу проблему.Я рекомендую проверить MSDN для получения дополнительной информации о том, как переопределить Equals.Или ответ на форуме с сообществом единства:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...