2016-10-17 71 views
0

对不起,我对这个主题有点空白。例如,假设我有一个基类Character和两个子类FriendlyCharacter和EnemyCharacter。我希望他们都继承像健康这样的变量,但是我不应该在公开角色中设置健康变量?我会假设,如果我改变了友好角色的公共变量,它会改变健康的所有实例正确吗?Unity(C#)中的继承变量问题(更改继承的变量)

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

我将不胜感激任何帮助。

回答

0

你在找什么是接口,或抽象/虚拟功能。广义地说,有两种技术:

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#没有多重继承),所以我们偶尔不会在我们想要的地方使用继承。在这些情况下,我们可以通过使用接口,显式接口实现(合理的传真保护功能)和扩展方法来模仿继承。 (定义扩展方法的类将扮演基类的角色。)通常,当类想要成为两个类层次结构的一部分(基于两个不可调和的功能集)时,就会出现这种情况。在游戏中,装甲,武器和法术可能都希望参与升级系统。装甲和武器是装备等级体系的一部分,但法术不是。所以相关数据被制作成接口函数,并且共享代码被定义为扩展方法(因为除了MonoBehaviour之外,装甲和法术不共享公共基类)。

+0

感谢这个细节! –

0

在Unity的背景下,我不确定你在问什么是真正的作品。

完成此操作的最佳方法是制作一个游戏对象(角色),您可以根据需要复制和调整(FriendlyCharacter/EnemyCharacter),只需更改Unity中的标记以确保它们与其他应用程序进行交互对象。

一般来说,在Unity中,“Public”或“Private”标签只能决定值是否可以在特定脚本之外(即在Inspector或其他脚本中)更改。

编辑:此外,作为更广泛的注意继承,更改类(或子类)的对象内的任何继承变量将永远不会更改该变量的所有从较高类出生的对象,这是而不是“公共”或“私人”是指什么。

+0

谢谢。我会牢记这些。我对这些事情有点生疏,对Unity也比较陌生。所以我会创建角色游戏对象,那么如何将友好/敌人的独特脚本链接到这些通用游戏对象? –

+0

您可以将该脚本作为您的角色脚本的一个子类,就像您以前所建议的那样。 在C#中,您可以使用“:”来完成此操作。在Unity中,当没有父类时,您可能会发现这通常显示为“YourScriptName:MonoBehavior”,然后您将制作“FriendlyCharacterScript:CharacterScript”等(即子类:父类) – mykeg

+0

为什么不让你的getter和setter基类获得敌人和角色对象,否则我不知道该怎么做。 – LumbusterTick