Ошибка, которая происходит только в unity3d, c# (с использованием графиков) - PullRequest
0 голосов
/ 17 марта 2020

Итак, вот проблема:

У меня есть класс графа (и вершина и ребро) для настройки графа. Однако в C# (в unity3d) всякий раз, когда я добавляю новую вершину в свой vertexList, предыдущие добавленные вершины переписываются с новой.

Теперь, я был так смущен, что даже спросил студента университета и моего учителя информатики, они были потрясены, они сами сказали.

Затем я попытался выяснить, написал ли я что-то неправильно, поэтому я написал все (только части, которые помогают составить vertexList) в Python. И он работал так же, как и в c#.

Ниже вы можете увидеть код C# (ссылка):

Класс графика - https://hastebin.com/usizigepaf.cs

Класс вершины - https://hastebin.com/ofiyozodun.cs

Класс ребра - https://hastebin.com/riwazawaki.cpp (это должно сказать cs для c#, я не знаю, почему написано cpp, все в порядке)

А вот код python:

Все - https://hastebin.com/ukokujesal.rb


Вы можете найти больше кода в кодах c#, но это потому, что я тоже хочу настроить ребра, однако мне нужно сначала настроить вершины ... это главная проблема, на которой я хочу сосредоточиться и нужна помощь.

Итак, как мне решить проблему? Что происходит не так?


РЕДАКТИРОВАТЬ:

Проблема начинается, когда я добавляю в vertexList, в основном в строке 17 класса графа. Эта строка вызывает метод, который начинается со строки 45, поэтому проблема может быть, на мой взгляд, только внутри метода (addVertex (data)).

1 Ответ

1 голос
/ 18 марта 2020

Проблема явно заключается в

public void addVertex(Transform data)
{
    Debug.Log("data: " + data);
    //Vertex vertex = new Vertex(data);

    Vertex vertex = GetComponent<Vertex>();
    vertex.setVertex(data);
    Debug.Log("vertex: " + vertex);

    vertexList[graphIndex] = vertex;
   // Debug.Log("Type of item at graphIndex " + graphIndex + ": " + vertexList[graphIndex]);
   // Debug.Log("Data within the item at graphIndex " + graphIndex + ": " + vertexList[graphIndex].getVertex());

   graphIndex++;
}

, где GetComponent<Vertex>() всегда возвращает один и тот же экземпляр Vertex (первый встреченный), прикрепленный к этому GameObject.

Как вы поняли, new запрещено для MonoBehaviour классов.


На самом деле нет никаких причин, по которым Vertex должен быть MonoBehaviour вообще. Просто сделайте это

[System.Serializable] // <- makes this class visible in the Inspector
                      //    including its serialized fields
public class Vertex
{
    ...

    public Vertex(Transform dataP)
    {
        data = dataP;
    }

    ...
}

, чтобы вы могли использовать new

public class Graph : MonoBehaviour
{
    [SerializedField] private Vertex[] vertexList;

    ...

    public void addVertex(Transform data)
    {
        Debug.Log("data: " + data);

        var vertex = new Vertex(data);

        Debug.Log("vertex: " + vertex);

        vertexList[graphIndex] = vertex;
       // Debug.Log("Type of item at graphIndex " + graphIndex + ": " + vertexList[graphIndex]);
       // Debug.Log("Data within the item at graphIndex " + graphIndex + ": " + vertexList[graphIndex].getVertex());

        graphIndex++;
    }

    ...
}

Вы также можете использовать ant List<Vertex> вместо массива и индекса, если вы собираетесь добавлять вершины динамически.

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