如何处理具有继承的实体类
本文关键字:继承 实体 何处理 处理 | 更新日期: 2023-09-27 17:50:49
所以,我担心的是不能完全意识到这是否是适合我情况的最佳方法。
让,说我有一个基类"实体"。假设目的是构造一个类层次系统。
public class Entity
{
public int _hp;
private int _max_hp;
public Entity(int hp)
{
_max_hp = hp;
_hp = _max_hp;
}
}
还有其他派生类
public class d_class1: Entity
{
public d_class1(int hp):
base(hp)
{
}
}
public class d_class1_Mono: MonoBehaviour
{
public d_class1 d1;
}
public class d_class2: Entity
{
public d_class2(int hp):
base(hp)
{
}
}
public class d_class2_Mono: MonoBehaviour
{
public d_class2 d2;
}
(请原谅糟糕的命名约定,这是故意的)
假设从Mono继承的脚本被附加到场景中的不同对象上。我希望能够区分我目前拥有的"类",当"点击"的单位。
有什么方法可以让我避免在所有可能的类之间进行检查吗?
。
obj = gameObject containg the component d_class2_Mono
if(obj contains d_class1)
do something with d1
else if(obj contains d_class2)
do something with d2
else
error("Unknown class derivation");
我觉得自己有时不得不这样做,因为我需要某种方式来访问组件,比如获取hp。也许这不是最好的办法。目前,这一切都很简单,但这些职业中的每一个都将以自己的方式与其他职业不同(即不同的能力等)
所以,希望有人能在我的理解中传授一些知识。
游戏对象,你可以附加MonoBehaviour,你可以有一个处理程序专门为该对象。例如,你可以在d_class1_Mono上实现"void OnUpdate()",并为d_class2_Mono实现一个不同的更新函数。
如果你假设你不知道你点击了哪个对象(因为这是通过其他类/函数路由的)-你可以这样做:
obj.GetComponent<d_class1_Mono>()
和obj.GetComponent<d_class2_Mono>()
返回非空引用的任何一个都附加了该脚本。
我可能会在Entity
类中定义一个virtual
或abstract
方法,每个继承类将实现该方法。例如,如果您同时拥有可移动实体和不可移动实体,并且在Entity
:
void MoveToPosition(Position pos)
方法。// Mobile entity
public class d_class1: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
TweenPosition(_currPosition, pos, movementSpeed);
}
}
// Immobile entity
public class d_class2: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
// Do nothing
}
}
然后在你的逻辑/更新循环中,你可以简单地告诉所有实体到MoveToPosition(...)
,那些不应该响应的实体将简单地不做任何事情。
我发现,当我有一个共同的interface
或类与一个共同的"做某事"的方法,并让每个派生类以自己的方式处理该方法调用的"如何"时,编码是更干净的。