Реализация абстрактного свойства Enum в дочернем классе - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующий базовый класс

public abstract class Character : MonoBehaviour
{
    protected abstract Enum CurrentState
    {
        get;
        set;
    }
}

и следующий дочерний класс

public class Player : Character
{
    protected override Enum CurrentState
    {
        get
        {
            return (State)_anim.GetInteger("State");
        }
        set
        {
           _anim.SetInteger("State", Convert.ToInt32(value));
        }
    }

    private enum State
    {
        IDLE = 0,
        WALK = 1,
        JUMP = 2,
        FALL = 3,
        CLIMB = 4,
        LOOKING_DOWN = 5,
        NPC = 6,
        IMPATIENT = 7,
        LOOKING_UP = 8,
        STUCK = 9,
    }

    void FixedUpdate()
    {
        if (CurrentState == State.CLIMB)
        {

        }
    }

}

Строка

if (CurrentState == State.CLIMB)

выдает следующую ошибку: Operator '== 'нельзя применить к операндам типа' Enum 'и' Player.State '

Любая помощь?Геттер работает нормально.Так что, возможно, мне нужно сделать преобразование приведения в наборе доступа?Я не совсем уверен ... Я немного новичок в этом ... Любая помощь будет более чем признательна.

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Если я заменил свойство двумя разными аксессорами, это, похоже, сработает ...

protected override Enum SetCurrentState
{
    set
    {
        _anim.SetInteger("State", Convert.ToInt32(value));
    }
}

private bool GetCurrentState(State state)
{
    return Convert.ToInt32((State)_anim.GetInteger("State")) == Convert.ToInt32(state);
}
0 голосов
/ 10 мая 2018

Как отмечалось в предыдущем посте, незаконная работа Enum.Не делай этого.

 namespace ConsoleApplication1
    {
        public enum State
        {
            IDLE = 0,
            WALK = 1,
            JUMP = 2,
            FALL = 3,
            CLIMB = 4,
            LOOKING_DOWN = 5,
            NPC = 6,
            IMPATIENT = 7,
            LOOKING_UP = 8,
            STUCK = 9,
        }

        public abstract class Character : MonoBehaviour
        {
            protected abstract State CurrentState
            {
                get;
                set;
            }
        }


        public class MonoBehaviour
        {
        }

        public class Player : Character
        {      

            protected override State CurrentState
            {
                get
                {
                    return (State)_anim.GetInteger("State");
                }
                set
                {
                    _anim.SetInteger("State", Convert.ToInt32(value));
                }
            }



            void FixedUpdate()
            {
                if (CurrentState == State.CLIMB)
                {

                }
            }

        }

    }
0 голосов
/ 10 мая 2018

Попробуйте это:

if (Convert.ToInt32(CurrentState) == Convert.ToInt32(State.CLIMB))
            { 

            }

Поскольку Enum нельзя сравнивать как типы, вам необходимо преобразовать их для сравнения.

0 голосов
/ 10 мая 2018

Вы сравниваете Enum с State.Что незаконно.Вы возвращаете тип для CurrentState должно быть State .Что-то вроде -

protected override State CurrentState
{
    get
    {
        return (State)_anim.GetInteger("State");
    }
    set
    {
       _anim.SetInteger("State", Convert.ToInt32(value));
    }
}
...