Unity中的继承变量问题(更改继承的变量)(C#)

时间:2016-10-17 23:10:03

标签: c# variables inheritance unity3d

对不起,我在这个问题上有点茫然。例如,假设我有一个基类Character和两个子类FriendlyCharacter和EnemyCharacter。我希望他们都继承健康等变量,但我不应该在公共角色中使健康变量正确吗?我假设如果我更改了友好角色的公共变量,它会改变健康的所有实例吗?

如何初始化Character以包含将被其他类继承的变量?一旦继承,这些类将拥有自己的变量实例。我觉得不得不重新初始化每个子类中的变量只会使基类中的初始化毫无意义。

我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您正在寻找的是接口或抽象/虚拟功能。从广义上讲,有两种技术:

public abstract class Character : MonoBehaviour
{
    public float m_Health { get; protected set; }
    protected abstract float DefaultHealth { get; }
    void Awake()
    {
        m_Health = DefaultHealth;
    }
}
public class Enemy : Character
{
    protected override float DefaultHealth { get { return 10; } }
}

(如果应该有基本实现并且覆盖是可选的,则使用虚函数而不是抽象。)当逻辑全部共享时使用上述模式,但在子类中指定的位数不同。基类中的大函数调用可以在子类中指定的小函数。

第二种技术是当课程看起来与外界相同但在基础层面上有不同的作用时:

public interface ILiving
{
    float Health { get; }
}
public class Character : ILiving
{
    // implement health as a normal variable
    public float Health { get; protected set; }
}
public class OldMan : ILiving
{
    // implement health based on time until death at 2020
    public float Health { get { return (2020-DateTime.Now.Year)/20; } }
}

在这种情况下,两种类型都有健康,但它们运作的逻辑是不同的。对于外面的世界,它们看起来是一样的,但它们是如此不同,以至于它们不应该分享任何逻辑。

请注意,在Unity中,事情会变得混乱。由于我们被迫继承MonoBehaviour(并且C#缺少多重继承),我们偶尔也不能在我们想要的地方使用继承。在这些情况下,我们可以通过使用接口,显式接口实现(受保护函数的合理传真)和扩展方法来模仿继承。 (定义扩展方法的类将扮演基类的角色。)通常,当类想成为两个类层次结构的一部分时(基于两个不可调和的功能集),就会出现这种情况。在游戏中,盔甲,武器和法术都可能都想参与升级系统。装甲和武器是装备类等级的一部分,但法术不是。所以相关数据被制作成接口函数,共享代码被定义为扩展方法(因为arm {和spell不共享一个共同的基类,除了MonoBehaviour)。

答案 1 :(得分:0)

在Unity的背景下,我不确定你所询问的是什么方式真的有用。

实现此目标的最佳方法是制作一个游戏对象(角色),您可以根据需要进行复制和调整(FriendlyCharacter / EnemyCharacter),只需更改Unity中的标签,以确保它们与其他对象进行交互

一般来说,在Unity中," Public"或者"私人"标签只是决定是否可以在特定脚本之外更改值(即在Inspector中或通过其他脚本)。

编辑:此外,作为关于继承的更广泛的注释,更改类(或子类)的对象中的任何继承变量不会为更高级别的所有对象更改该变量,并且不是什么" Public"或者"私人"请参阅。

相关问题