Как создать свойство списка модульных классов - PullRequest
0 голосов
/ 28 сентября 2019

Возможно, я задаю неправильные вопросы, поскольку я не смог ничего найти в Интернете по этому вопросу ...

По сути, моя цель - определить класс перемещения, заданный в проекте \ Schemas \ Move.cs:

public class Move
{
    private int power;
    private float accuracy;
    private string type; 
    private string style; 

    public Move(int p, float a, string t, string s, float sh)
    {
        this.power = p;
        this.accuracy = a;
        this.type = t;
        this.style = s;
    }

}

И я бы хотел, чтобы коллекция ВСЕХ ходов была доступна из моего игрового движка, но я хочу, чтобы эта коллекция ходов создавалась автоматически на основе других файлов в проекте \ Moves \ move_ *.

Я, честно говоря, не уверен, как это сделать в C #.На другом языке я бы просто инициализировал глобальную коллекцию, и в каждом файле перемещения я бы просто назвал GlobalCollection.Add(new Move(...)) или что-то подобное.

Надеюсь, кто-нибудь мне поможет!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Если я вас правильно понимаю, вам нужно иметь один экземпляр, например List<Move>, и вы хотите «зарегистрировать» каждый созданный экземпляр Move здесь.Так почему бы не просто что-то вроде

// This is a static class so it does not have to be instantiated
// but rather simply "lives" in the assets
public static class MoveManager
{
    public static List<Move> Moves = new List<Move>();
}

Тогда вы могли бы что-то вроде

public class Move
{
    private int power;
    private float accuracy;
    private string type; 
    private string style;  

    public Move(int p, float a, string t, string s, float sh)
    {
        power = p;
        accuracy = a;
        type = t;
        style = s;

        // a static class member is simply accessed via the type itself
        MoveManager.Moves.Add(this);
    }
}

problem: Когда вы удаляете их из списка?

Обычно вы хотите сделать это в деконструкторе, например,

~Move()
{
    MoveManager.Moves.Remove(this);
}

НО в Unity деконструктор не вызывается автоматически - особенно, если что-то еще ссылается на этот Moveэкземпляр ... предупреждение спойлера: список Moves будет всегда!Поэтому при необходимости вам придется очищать список Moves «вручную» каждый раз, когда вы действительно хотите уничтожить экземпляр Move.

0 голосов
/ 29 сентября 2019

Нет (хорошего) способа сделать то, что вы хотите.

Вариант 1:

Пишите это вручную.Например, , как я сделал здесь .Это всегда будет работать, и это то, чего вы пытаетесь избежать.

Вариант 2:

Размышляюще осмотрите сборку и загрузите все содержащиеся в ней классы , например, .Но это будет склонно делать неожиданные вещи.Например, Unity отбирает эти классы от компиляции, когда вы создаете автономную сборку, потому что они нигде не ссылаются.Или непреднамеренное создание экземпляра объекта, которого не должно быть.Или не помнить, что «о да, MoveXYZ имеет уникальный конструктор, который требует дополнительного параметра».

...