如何处理具有继承的实体类

本文关键字:继承 实体 何处理 处理 | 更新日期: 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类中定义一个virtualabstract方法,每个继承类将实现该方法。例如,如果您同时拥有可移动实体和不可移动实体,并且在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或类与一个共同的"做某事"的方法,并让每个派生类以自己的方式处理该方法调用的"如何"时,编码是更干净的。