1. 接口的作用

提供一组 通用函数声明,不同的类可以实现这些函数。

让你在 不知道对象具体类型 的情况下,也能调用它的某些功能。

类似于 C++ 的纯虚类,但在 UE 里增加了对 蓝图 的支持。

👉 好处:写一套逻辑适配不同对象,减少耦合。

  1. 接口的结构

UE 接口分为两部分:

U 接口类(继承自 UInterface)

负责反射系统、蓝图暴露。

例如 UInteractable。

I 接口类(纯虚基类)

写函数声明,子类实现。

例如 IInteractable。

  1. 声明接口
    UINTERFACE(Blueprintable)
    class UDamageable : public UInterface
    {
    GENERATED_BODY()
    };

class IDamageable
{
GENERATED_BODY()

public:
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category=“Damage”)
void ApplyDamage(float Amount);
};

说明:

UINTERFACE → 声明 U 类,可用于蓝图。

IXXXX → 写方法声明。

BlueprintNativeEvent → 可 C++ 实现,也可蓝图覆盖。

  1. 实现接口
    class AEnemyCharacter : public ACharacter, public IDamageable
    {
    GENERATED_BODY()

public:
virtual void ApplyDamage_Implementation(float Amount) override;
};

C++:实现时要写 函数名_Implementation。

蓝图:直接覆盖接口函数。

  1. 调用接口函数
    5.1 C++ 调用
    AActor* HitActor = HitResult.GetActor();
    if (HitActor->GetClass()->ImplementsInterface(UDamageable::StaticClass()))
    {
    IDamageable::Execute_ApplyDamage(HitActor, 10.0f);
    }

ImplementsInterface → 检查对象是否实现接口。

Execute_ApplyDamage → 调用接口函数(自动支持 C++ / 蓝图)。

5.2 蓝图调用

节点:Does Implement Interface

成功 → 直接调用接口函数。

  1. Cast 与接口

Cast To 子类:把 Actor 转成具体类,访问类特有的变量/函数。

Cast To 接口:检查对象是否实现接口,如果是,就能调用接口函数。

👉 区别:

Cast 子类 → 依赖具体类(耦合度高)。

Cast 接口 → 只依赖接口(更解耦)。

  1. 常见使用场景

伤害系统:子弹命中任何实现 Damageable 接口的对象,都能调用 ApplyDamage。

交互系统:玩家调用 Interact(),门、NPC、道具各自实现不同逻辑。

AI 通信:不同 NPC 实现统一的命令接口,方便统一调用。

✅ 总结

UE 接口是 解耦合的调用机制:

定义一组通用方法 → 不同类去实现。

使用时不用关心对象具体类型 → 只要实现接口,就能统一调用。

C++ 和蓝图通用,Execute_XXX 负责调用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐