在C#中使用抽象变量和非抽象方法创建超类

时间:2016-05-25 18:58:11

标签: c# inheritance unity3d interface abstract

基本上,超类应包含将在子类中设置的变量(或属性,无论哪个属性),并且还应包含所有子类将使用的方法。我不知道是否有办法在不使用2个类的情况下执行此操作,一个是包含变量的接口,另一个是包含这些方法的类,但我假设有。我可能想象的对C#很陌生。

只是为了澄清,这是针对Unity中的一个项目,超类将是一个通用字符类,所有子类(字符)都将使用它。

编辑:稍后会添加许多其他变量和方法,但这里是粗略预览它应该是什么

uicontrols

2 个答案:

答案 0 :(得分:2)

  

超类将是一般字符类

?但等等,真的没有这样的事情--Unity是一个ECS系统。

您只需向GameObject添加组件即可。 (也就是说,行为 - 你所能做的就是向GameObject添加行为(渲染器,骨骼动画师,定时器,相机,碰撞器等等)

Unity中没有继承或类似继承的东西; OO甚至都不含糊。使用Unity就像使用Photoshop一样!

(当然,在编写时恰好用于编写的语言,在Unity中编写组件是一种面向对象的语言,但这无关紧要,明天可能会改变。 #39;以任何方式制造Unity OO。)

答案 1 :(得分:0)

面向对象的编程概念在Unity中仍然可用于从组件构建实体。

using UnityEngine;

public abstract class Character : MonoBehaviour
{
    public int HitPoints { get; set; }

    public virtual void ChangeHP(int amount)
    {
        HitPoints += amount;
    }

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("DeathTrigger"))
        {
            Die();
        }
    }

    protected virtual void Die()
    {
        Debug.Log("I'm dead.");
    }
}

public class LordOfTerror : Character
{
    protected override void Die()
    {
        base.Die();
        Debug.Log("But I also come back from the dead very soon.");
        HitPoints = 100;
    }
}

但是这种编程确实只适用于小型继承树,并且只有一些限制或变通方法才能在Unity中习惯。通常,尽可能多地使用组件是有意义的。这是一个示例的变体,展示了如何将面向对象与组合结合起来:

using System;
using UnityEngine;

public abstract class StatAttribute
{
    public int current;
    public int min;
    public int max;

    public void Change(int amount)
    {
        current += amount;
    }
}

public sealed class Health : StatAttribute
{
    public event Action tookDamage;

    public bool isAlive
    {
        get { return current > min; }
    }

    public void Damage(int amount)
    {
        base.Change(-amount);
        // also fire an event to make other components play an animation etc.
        if(tookDamage != null)
            tookDamage();
    }
}

public sealed class Speed : StatAttribute
{
    public int boost;

    public int GetFinalSpeed()
    {
        return base.current * boost;
    }
}

通常,您从附加到GameObjects的各个组件开始。所有组合构成您的角色。你有健康 CharacterMovement PlayerInput 动画等等。在某些时候你注意到代码是重复,这是在组件之间共享某些基类可能有意义的地方。