将枚举声明为类属性(对于稍后定义的子类?)

时间:2016-10-16 22:32:16

标签: c# unity3d enums

我在Unity中制作游戏,所有玩家角色和敌人角色的动作都由枚举类型myMoveState的值决定。 (更新函数首先查询变量MoveStateAction()并调用switch / case函数ActorClass来决定要做什么。)我希望他们的父类moveState声明这个枚举,所以我不必在每个脚本中声明它。问题是,每个演员都有不同的可能{ get; set; }。虽然一个敌人可能能够充电,返回,等待和搜索,但也许另一个敌人可以跳跃,摔倒,跑动和停止(这些可能是需要调用特定方法的任何行动状态)。我希望子类继承枚举声明并用它自己的值填充它。

我尝试使用typedef使枚举成为属性,但编译器将“get”作为第一个枚举读取,并将分号作为语法错误读取。我已经研究过使用通用属性,但我不知道它是否可行,更不用说如何实现它了。微软的API指南令人困惑。

如果没有办法将空枚举声明为属性怎么办?有没有更好的办法?我也可以使用不同的变量类型,但我的代码几乎不可读。我甚至认为我不能使用void Start () { myBody = GetComponent<Rigidbody2D> (); myDirection = Direction.S; myMoveState = moveState.START; currentSpeed = new Vector2(0, 0); previousSpeed= new Vector2(0, 0); } void FixedUpdate () { currentSpeed = myBody.velocity; previousSpeed *= dragScale; MoveStateAction(); previousSpeed = currentSpeed; myBody.velocity = currentSpeed; } 别名来提高可读性。

以下是敌人的通用代码:

{{1}}

2 个答案:

答案 0 :(得分:0)

我认为你是从一个不利的角度来看这个问题。你会怎样做?您在父类中定义属性,由子类继承它,然后说“Nah,让我们踢出所有值并定义新值”。但这不再是父属性,也不是继承的想法。

那么为什么要创建一个可以继承的属性呢?可能是因为你希望所有的孩子在房产上以同样的方式做出反应。所以最有利的方法可能是定义一个包含所有可能的移动状态的枚举,然后阻止那些你不想要特定类的那些。例如,定义一个函数CheckMoveState,如果MoveState不是允许的状态之一,则返回None(例如,如果它是Jump,即使create只能滑动),并且每次将MoveState传递给class属性时调用此函数在二传手中。

所以这是父类中的定义:

public enum MoveState
{
    None,
    Jump,
    Stop,
    Slither
}

在孩子班上我们有:

private MoveState CheckMoveState(MoveState myMoveState)
{
    if (myMoveState == MoveState.Slither || myMoveState == MoveState.Stop)
        return myMoveState;
    return MoveState.None;
}

private MoveState _currentMoveState = MoveState.None;

public MoveState CurrentMoveState
{
    get { return _currentMoveState; }
    set { _currentMoveState = CheckMoveState(value); }
}

答案 1 :(得分:0)

枚举真的不是多态性的后代;并使它们抽象与你分享&#34;的基本原因相矛盾。首先是枚举。

从本质上讲,枚举是美化的常数,周围有一些语法糖。它们意味着共享&#34 ;;因此,有一个枚举的没有意义,但是将细节推迟到子类。

此外:你即将遇到&#34; enum陷阱&#34;无论如何。您似乎打算编写代码来切换枚举值以确定要执行的操作。那是一个糟糕的想法。因为你正在做的是伪装中的状态机。相反,你应该研究状态机的reall OO答案......那就是:实现一个。创建一个表示状态的抽象基类(然后你的子类可以自由定义&#34;不同的&#34;状态);然后使用真实状态机来处理该状态类的对象。