我在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}}
答案 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;状态);然后使用真实状态机来处理该状态类的对象。