Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在子类中实现抽象枚举属性_C#_Unity3d_Enums_Enumeration - Fatal编程技术网

C# 在子类中实现抽象枚举属性

C# 在子类中实现抽象枚举属性,c#,unity3d,enums,enumeration,C#,Unity3d,Enums,Enumeration,我有以下基类 public abstract class Character : MonoBehaviour { protected abstract Enum CurrentState { get; set; } } 还有下面的儿童班 public class Player : Character { protected override Enum CurrentState { get {

我有以下基类

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)
产生以下错误:运算符“==”不能应用于“Enum”和“Player.State”类型的操作数


有什么帮助吗?吸气剂很好用。也许我需要在set访问器中进行强制转换?我不太确定……我是个新手……任何帮助都将不胜感激。

您正在将
枚举
状态
进行比较。这是违法的。您返回的CurrentState类型应为State。差不多-

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

如前一篇文章所述,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)
                {

                }
            }

        }

    }
试试这个:

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

            }

由于枚举不能作为类型进行比较,您需要转换它们进行比较。

如果我用两个不同的访问器替换属性,它似乎可以工作

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);
}

尝试将您的类对象之外的私有枚举更改为公共枚举什么让您感到困惑
CurrentState
是类型
Enum
状态。Gramb
是类型
State
位于此处的Enum catch22的简明答案:您可以在此处查看如何比较枚举:我想您需要设置/获取类型State值的CurrentState属性。CurrentState不应该是枚举。为什么要转换而不是强制转换?这很有效,但我不能每次有if语句时都将参数的两边都转换为int32。因此,如果除Player之外的另一个对象继承自Character,该对象应该在何处定义其状态?枚举可以命名为命名空间,以明确您需要哪一个。您可以将它们放在任何您想要的地方,但请记住enum有助于在代码中清楚地显示您希望在英语中使用的整数值。