Skip to content

继承

unity-csharp-inheritance-system

继承是什么

继承就是:一个类可以复用另一个类已有的代码。

c
public class Enemy
{
    public void Move()
    {
        Debug.Log("敌人移动");
    }
}

public class BossEnemy : Enemy
{
}

这里 BossEnemy : Enemy 的意思是:BossEnemy 继承 Enemy。所以 BossEnemy 自动拥有 Enemy 里可访问的成员。

记一句话

继承表达的是“是一个”的关系:

c
BossEnemy 是一种 Enemy
PlayerController 是一种 MonoBehaviour

如果不是“是一个”,就不要乱继承。比如“玩家有背包”,不是“玩家是背包”,这种更适合用字段组合。

Unity 里最常见的继承

你平时写的 Unity 脚本基本都是这样:

c
public class PlayerController : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Vector3.forward);
    }
}

因为继承了 MonoBehaviour,你的脚本才能挂到 GameObject 上,也才能用 transformgameObjectGetComponent()StartCoroutine() 等 Unity 提供的能力。

继承后子类能做三件事

复用父类代码:

c
public class Enemy : MonoBehaviour
{
    public void Move() { }
}

public class BossEnemy : Enemy
{
    // 自动拥有 Move()
}

增加自己的功能:

c
public class BossEnemy : Enemy
{
    public void SummonMinions()
    {
        Debug.Log("召唤小怪");
    }
}

改写父类行为:

c
public class Enemy : MonoBehaviour
{
    public virtual void Attack()
    {
        Debug.Log("普通攻击");
    }
}

public class BossEnemy : Enemy
{
    public override void Attack()
    {
        Debug.Log("Boss 范围攻击");
    }
}

virtual 表示父类允许子类改写。 override 表示子类真的改写了父类方法。

base 是什么base 表示“调用父类版本”。

c
public override void Attack()
{
    base.Attack();
    Debug.Log("Boss 追加技能");
}

这段意思是:先执行普通敌人的攻击,再追加 Boss 自己的攻击。

新手重点

字段默认优先 private。 要给子类用,才考虑 protected。 父类方法想允许子类改写,写 virtual。 子类改写父类方法,写 override。 Unity 生命周期里的 AwakeStartUpdate 先按 Unity 自动调用的方法理解,不要一上来就当成普通继承重写。

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0