Как установить переменную Value этого настраиваемого класса Odin Inspector - PullRequest
0 голосов
/ 29 мая 2020

Я знаю, название плохое, но я не мог придумать, что лучше. Вопрос очень конкретный. c.

Хорошо, поэтому я использую в своей игре класс, идентичный классам RPG Skills из примера Odin Inspector. Но он настроен так, как я не совсем понимаю, и я не могу понять, как установить значение (я могу получить его, а есть сеттер , так что можно и установить). Кроме того, все классы / структуры навыков / et c находятся в одном файле .cs.

Функция SkillList, которую я использую для получения значения: (я получаю его с skills[Strength].Value; в других классах)

public int this[SkillType type]
{
    get
    {
        for (int i = 0; i < this.skills.Count; i++)
        {
            if (this.skills[i].Type == type)
                return this.skills[i].Value;
        }
        return 0;
    }
    set
    {
        for (int i = 0; i < this.skills.Count; i++)
        {
            if (this.skills[i].Type == type)
            {
                var val = this.skills[i];
                val.Value = value;
                this.skills[i] = val;
                return;
            }
        }
        this.skills.Add(new SkillValue(type, value));
    }
}

Структура SkillValue:

[Serializable]
public struct SkillValue : IEquatable<SkillValue>
{
    public SkillType Type;
    public int Value;

    public SkillValue(SkillType type, int value)
    {
        this.Type = type;
        this.Value = value;
    }

    public SkillValue(SkillType type)
    {
        this.Type = type;
        this.Value = 0;
    }

    public bool Equals(SkillValue other)
    { return this.Type == other.Type && this.Value == other.Value; }
}

Перечисление SkillType:

public enum SkillType
{
    Science,
    Technology,
    Arts,
    Language,
}

Я пробовал:

skills[Science].Value = 10;

skills[Science] = new SkillValue(Science, 10);

skills[Science, 10]; (с использованием созданной мной новой функции)

skills[Science](10);

skills[Science].Value(10);

skills[Science] = 10;

Но ничего не работает, и теперь я просто гадаю наугад. Как я могу установить значение? Спасибо


Решение: character.skills[Rorschach.Character.Skills.SkillType.Science] = value;

1 Ответ

1 голос
/ 29 мая 2020

Ваше свойство имеет тип int и ожидает ключ типа SkillType, поэтому он, вероятно, должен быть

SkillList skills;

skills[SkillType.Science] = 10;

на самом деле также

Я получаю его с помощью skills[Strength].Value;

кажется странным с указанным вами кодом. Как сказано, свойство возвращает int, у которого нет свойства Value, поэтому на самом деле оно должно быть

int x = skills[SkillType.Strength];

Теперь, зная полный код реализации и ваше фактическое использование:

public SkillList skills;

...

public int Science 
{ 
    get { return this.Character.skills[Science].Value; } 
    set { this.Character.skills[Science].Value(10); }
}

ВНИМАНИЕ!

То, что вы здесь случайно сделали, это использование другого свойства

public SkillValue this[int index]
{
    get { return this.skills[index]; }
    set { this.skills[index] = value; }
}

, который принимает индекс int и возвращает SkillValue.

НО вы вызываете время выполнения StackOverlowExeption из-за рекурсивного вызова Science.

Вы не можете использовать Science внутри геттера или сеттера одинаково называемого свойства!

Представьте, что в качестве примера используется геттер:

  • Вы бы позвонили

    var test = Science;
    
  • , чтобы он выполнял геттер

    return Character.skills[Science].Value;
    
  • , но хорошо ... чтобы узнать значение Science, чтобы использовать его здесь в качестве индекса, ему снова придется выполнить геттер, так что еще раз

    return Character.skills[Science].Value;
    

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

Решение

Ваша собственность должна выглядеть, как и предполагалось ранее

public int Science 
{ 
    get { return Character.skills[SkillType.Science]; } 
    set { Character.skills[SkillType.Science] = value; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...