关于Unity中的封装,继承和多态

一、封装:

封装的核心是:把对象自己的数据和行为放在一起,隐藏内部实现,只给外部提供必要的使用方式。

比如角色受到伤害后变红,过一段时间恢复白色。外部脚本不需要知道角色怎么变色、怎么计时,只需要调用 TakeDamage()。

using UnityEngine;
public class DamageFlash : MonoBehaviour
{
  private SpriteRenderer spriteRenderer;
  [SerializeField] private float flashDuration = 0.3f;
  private float lastDamageTime;
  private bool isFlashing;
  
  private void Awake()
  {
    spriteRenderer = GetComponent<SpriteRenderer>();
  }
  
  private void Update()
  {
    if (isFlashing && Time.time - lastDamageTime >= flashDuration)
    {
      spriteRenderer.color = Color.white; isFlashing = false;
    }
  }
 
  public void TakeDamage(int damage)
  {
    spriteRenderer.color = Color.red;
    lastDamageTime = Time.time;
    isFlashing = true;
  }
}

在这段代码中,spriteRenderer、lastDamageTime、isFlashing 都是 private,只能在类内部使用,外部不能随便修改。

flashDuration 使用了 [SerializeField] private,表示它仍然是私有变量,但可以在 Unity 的 Inspector 面板中调整。

外部真正需要使用的,只有这个公开方法:

TakeDamage(1);

这就是封装的作用:外部只需要知道“调用这个方法可以让角色受伤”,不需要关心内部具体怎么实现。

这样写可以让代码职责更清楚,也更方便以后修改。例如以后不想变红,而是播放受击动画,只需要修改 TakeDamage() 内部,外部调用方式不用变。

 

二、继承和多态:

继承的核心是:把多个类共有的内容放到父类中,子类只写自己特殊的部分。

比如游戏里有不同类型的敌人:哥布林、弓箭手。它们都是敌人,都有名字、移动速度、攻击行为,所以可以先写一个父类 Enemy:

using UnityEngine;
public class Enemy : MonoBehaviour
{
  [SerializeField] protected float moveSpeed = 3f;
  protected virtual void Attack()
  {
    Debug.Log("Enemy attacks.");
  }
}

这里的 Enemy 是父类,里面放的是所有敌人共有的内容。

protected 表示这个变量或方法可以被子类使用,但不能被外部脚本随便访问。

virtual 表示这个方法允许子类重写。

然后可以写两个不同的敌人:

using UnityEngine; public class Goblin : Enemy
{
  protected override void Attack()
  {
    Debug.Log("Goblin attacks with a dagger.");
  }
}
 
 
using UnityEngine;
public class Archer : Enemy
{
  protected override void Attack()
  {
    Debug.Log("Archer shoots an arrow.");
  }
}

Goblin 和 Archer 都继承自 Enemy,所以它们本质上都是敌人。

但它们的攻击方式不同,所以各自用 override 重写了 Attack() 方法。

这就是多态:同样是调用攻击方法,不同的子类会表现出不同的行为。

比如:

Enemy enemy1 = new Goblin();
Enemy enemy2 = new Archer();
enemy1.Attack();
enemy2.Attack();

虽然变量类型都是 Enemy,但实际执行时:

enemy1.Attack();
enemy2.Attack();

结果会根据真实对象的类型不同而不同。

在 Unity 项目中,继承和多态的作用是让代码更容易扩展。

比如以后想新增一个法师敌人,只需要再写一个子类:

public class Mage : Enemy
{
  protected override void Attack()
  {
    Debug.Log("Mage casts a fireball.");
  }
}

不用重写所有敌人的基础逻辑,只需要写法师自己的攻击方式。

简单来说:

继承是把共同点放到父类中,子类复用这些内容。

多态是父类提供统一方法,子类根据自己的特点表现出不同结果。

posted @ 2026-05-05 20:01  GhbBskl  阅读(14)  评论(0)    收藏  举报