Appearance
接口
接口是什么
接口可以理解成“能力合同”。它不关心一个对象具体是什么,只关心它“必须会做什么”。
比如:
c
public interface IDamageable
{
void TakeDamage(int damage);
}意思是:谁实现了 IDamageable,谁就必须提供 TakeDamage 这个方法。
c
public class Enemy : MonoBehaviour, IDamageable
{
public void TakeDamage(int damage)
{
Debug.Log("敌人受伤:" + damage);
}
}这里 Enemy 是敌人类,同时它拥有“可受伤”能力。
Unity 里为什么接口特别有用
比如子弹打到不同对象:敌人、木箱、Boss、机关都可能受伤。你不想写:
c
if (碰到敌人) 敌人扣血;
if (碰到木箱) 木箱扣血;
if (碰到Boss) Boss扣血;你可以统一写:
c
IDamageable target = other.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(10);
}只要对方实现了 IDamageable,子弹就能调用它的受伤逻辑。子弹不需要知道对方到底是 Enemy、Boss 还是 BreakableBox。
记住这句话
class 更像是在说“我是什么”,interface 更像是在说“我会什么”。
一个类只能继承一个父类,但可以实现多个接口:
c
public class EnemyChest : MonoBehaviour, IDamageable, IInteractable
{
public void TakeDamage(int damage) { }
public void Interact(GameObject user) { }
}这表示它既“可受伤”,也“可交互”。
接口 vs 抽象类
如果你想表达“同一种家族”,比如所有敌人都有血量、名字、攻击力,可以考虑抽象类。
如果你想表达“同一种能力”,比如可受伤、可交互、可存档、可拾取,就优先考虑接口。
Unity 注意点
接口本身不是组件,也不能直接挂到 GameObject 上。真正挂上去的是实现接口的脚本,比如 Enemy.cs。另外,Inspector 里直接拖接口字段会有序列化限制,Unity 中常见做法是运行时用 GetComponent<接口>() 查找,或者序列化具体的 MonoBehaviour 后再转换/校验。
参考链接