Как получить доступ к свойству объекта, в списке сгенерированных объектов - PullRequest
1 голос
/ 18 апреля 2019

Я искал это, и не могу решить.У меня есть программа, подобная этой (это в Unity и Visual Studio 2019 для C #): обратите внимание, что загрузка CSV проходит нормально, когда я отлаживаю код, я вижу все, заполненное данными ядра.

#region character class
public class _Character
{
    public int Id { get; set; }
    public int Variation { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
}
#endregion

//Tools.LoadCsv generates a string[,] from a csv file
//Tools.IntParse parses int's with a lot of format error checking

void Start()
    {
#region load characters class
        string[,] CharacterCSV = Tools.LoadCsv(@"Assets/GameDB/character.csv");
        List<_Character> Character = new List<_Character>();
        for (int i = 1; i < CharacterCSV.GetUpperBound(0); i++)
        {
            _Character temp = new _Character();
            temp.Id = Tools.IntParse(CharacterCSV[i, 0]);
            temp.Variation = Tools.IntParse(CharacterCSV[i, 1]);
            temp.Name = CharacterCSV[i, 2];
            temp.LastName = CharacterCSV[i, 3];

            Character.Add(temp);
        }

        CharacterCSV = null;
        #endregion
}

Я едва понимаю объекты, поэтому мне жаль, если я делаю это неправильно.

У меня есть следующие вопросы:

  1. Почему генерация списка объектов должна бытьв пуск?Кажется, я не могу сделать это в своем собственном классе.

  2. Как я могу получить объект из списка объектов персонажа, содержащий Id = 100 и Name = "John", и получить доступэто из другого класса или метода.

Я обычно Франкенштейн чертовски из кода и делаю это достаточно хорошо для меня, но теперь я хотел сделать что-то хорошее и, кажется, не могу добраться дообъекты.

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

// главная проблема заключалась в объявлении объекта внутри класса, когда объект List был объявлен вне класса, он был доступен для внешнего мира.Список <_Character> Character = новый список <_Character> ();перейти на улицу Start {}

Я не редактирую вопрос, чтобы исправить код, потому что вопрос должен оставаться ясным.//

1 Ответ

1 голос
/ 18 апреля 2019

Почему генерация списка объектов должна быть в Start?Я не могу сделать это в своем собственном классе.

Как я могу получить объект из списка объектов символов, содержащий Id = 100 и Name = "John", и получить к нему доступ из другого класса или метода.

Если вы хотите получить символ из-за пределов класса, вам нужно объявить список вне функции Start, в противном случае список будетбыть уничтоженным, так как это локальная переменная функции.

// Declare the list outside of the functions
private List<_Character> characters;

void Start()
{
    // Avoid using regions, they encourage you to make very long functions with multiple responsabilities, which is not advised
    // Instead, create short and simple functions, and call them
    LoadCharactersFromCSV();
}

void LoadCharactersFromCSV()
{
    string[,] CharacterCSV = Tools.LoadCsv(@"Assets/GameDB/character.csv");

    // If you can, indicate the approximate numbers of elements
    // It's not mandatory, but it improves a little bit the performances
    characters = new List<_Character>( CharacterCSV.GetUpperBound(0) );

    // I believe `i` should start at 0 instead of 1
    for (int i = 1; i < CharacterCSV.GetUpperBound(0); i++)
    {
        // I advise you to create a constructor
        // instead of accessing the properties one by one
        _Character temp = new _Character();
        temp.Id = Tools.IntParse(CharacterCSV[i, 0]);
        temp.Variation = Tools.IntParse(CharacterCSV[i, 1]);
        temp.Name = CharacterCSV[i, 2];
        temp.LastName = CharacterCSV[i, 3];

        characters.Add(temp);
    }

    CharacterCSV = null;
}

// Using this function, you will be able to get a character from its id
public _Character GetCharacter( int id )
{
    for (int 0 = 1; i < characters.Count; i++)
    {
        if( characters[i].Id == id )
            return characters[i];
    }

    // Return null if no character with the given ID has been found
    return null ;
}

Затем вызвать GetCharacter из другого класса:

public class ExampleMonoBehaviour : MonoBehaviour
{
    // Replace `TheClassName` by the name of the class above, containing the `Start` function
    // Drag & drop in the inspector the gameObject holding the previous class
    public TheClassName CharactersManager;


    // I use `Start` for the sake of the example
    private void Start()
    {
        // According to your code, `_Character` is defined **inside** the other class
        // so you have to use this syntax
        // You can get rid of `TheClassName.` if you declare `_Character` outside of it
        TheClassName._Character john = CharactersManager.GetCharacter( 100 );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...