Appearance
继承
继承是什么
继承就是:一个类可以复用另一个类已有的代码。
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 上,也才能用 transform、gameObject、GetComponent()、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 生命周期里的 Awake、Start、Update 先按 Unity 自动调用的方法理解,不要一上来就当成普通继承重写。
参考链接