在 Unreal Engine 的 C++ 中,Cast 是一个核心的类型转换函数,用于在类的继承体系中安全地进行指针转换,尤其适用于处理 UObject 派生类(如 Actor、Widget、Component 等)的类型转换。它比 C++ 原生的 static_cast 或 dynamic_cast 更安全,且与 UE 的反射系统深度集成。

基本用法

cpp

运行

// 格式:Cast<目标类型>(源指针)
目标类型* 结果指针 = Cast<目标类型>(源指针);

  • 如果转换成功(源指针指向的对象确实是目标类型或其派生类),返回有效的目标类型指针。
  • 如果转换失败(类型不匹配),返回 nullptr

典型场景示例

  1. UI 控件类型转换
    在获取 UMG 控件时,将基类 UWidget* 转换为具体类型(如 UButton*):

    cpp

    运行

    // 从 Widget 中获取名为"LoginButton"的控件(返回 UWidget*)
    UWidget* Widget = GetWidgetFromName(TEXT("LoginButton"));
    
    // 转换为 UButton* 类型
    UButton* LoginButton = Cast<UButton>(Widget);
    
    if (LoginButton) {
        // 转换成功,可调用 UButton 特有的方法(如绑定点击事件)
        LoginButton->OnClicked.AddDynamic(this, &ULoginWidget::OnLoginClicked);
    } else {
        // 转换失败(可能控件不是按钮,或名称错误)
        UE_LOG(LogTemp, Warning, TEXT("转换为 UButton 失败!"));
    }
    
  2. Actor 类型转换
    在场景中获取 Actor 后,转换为自定义的 Actor 类型:

    cpp

    运行

    // 获取场景中的某个 Actor(返回 AActor*)
    AActor* FoundActor = UGameplayStatics::GetActorOfClass(GetWorld(), AActor::StaticClass());
    
    // 转换为自定义的 AMyCharacter 类型
    AMyCharacter* MyCharacter = Cast<AMyCharacter>(FoundActor);
    
    if (MyCharacter) {
        // 调用 AMyCharacter 特有的方法
        MyCharacter->PlayAttackAnimation();
    }
    

与 C++ 原生转换的区别

  • static_cast:编译时检查,不保证运行时安全,对于 UE 的反射类型可能失效。
  • dynamic_cast:运行时检查,但不支持 UE 的 UObject 类型(依赖 C++ RTTI,而 UE 通常禁用 RTTI 以优化性能)。
  • Cast:基于 UE 反射系统实现,专门用于 UObject 派生类,性能更好且更安全,是 UE 开发中的首选。

扩展用法:CastChecked

如果确定转换一定成功(例如在测试环境或逻辑上必然成立的场景),可以使用 CastChecked,转换失败时会触发断言(便于调试):

cpp

运行

// 转换失败时会在编辑器中弹出断言错误,提示调试
UButton* LoginButton = CastChecked<UButton>(Widget);

核心原理

Cast 函数通过 UE 的反射系统(UClass)检查源对象的类型是否与目标类型兼容:

  • 源对象的类必须是目标类型的子类或本身。
  • 依赖对象的 GetClass() 方法获取类型信息,这也是 UObject 派生类才能使用 Cast 的原因。

总结:Cast 是 UE 中处理类型转换的标准工具,核心作用是安全地将基类指针转换为派生类指针,配合空指针检查可以有效避免类型转换导致的崩溃,是连接不同类层次逻辑的关键函数。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐