Skip to content

接口

unity-csharp-interface-system

接口是什么

接口可以理解成“能力合同”。它不关心一个对象具体是什么,只关心它“必须会做什么”。

比如:

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,子弹就能调用它的受伤逻辑。子弹不需要知道对方到底是 EnemyBoss 还是 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 后再转换/校验。

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

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