【问题标题】:Why would this cast fail? - Unreal Engine 4为什么这个演员会失败? - 虚幻引擎 4
【发布时间】:2021-07-16 23:45:16
【问题描述】:

我要做的是从数据表中读取一系列路径,加载这些资产,然后按资产类型对它们进行排序,以便我可以对每个路径进行不同的修改。

因此,我需要从这些资产路径中分离出哪些是静态网格、actor 蓝图、编辑器实用程序小部件等。但由于某种原因,当我去拆分蓝图时,转换到 UBlueprint 总是失败。

顺便说一句,这是在加载阶段为 PostEngineInit 的编辑器插件的启动模块中。我不确定这是否与它有关。

for (FToolData Tool : ToolCategories[i]->Tools)
{
    
    FStringAssetReference AssetPath(Tool.AssetPath);
    UObject* Asset = AssetPath.TryLoad();

    if (IsValid(Asset))
    {
        UBlueprint* BlueprintAsset = Cast<UBlueprint>(Asset);

        if (IsValid(BlueprintAsset))
        {
            TSubclassOf<UObject> Parent = BlueprintAsset->ParentClass;
        }

    }
}

我也确定 Asset 是一个 UBlueprint。我可以看到它的父类是 Actor 就在那里,但由于某种原因 BlueprintAsset 仍然无效。

【问题讨论】:

  • Cast&lt;UBlueprint&gt;(Asset) 不是标准的,可能是在您的程序或您正在使用的库中定义的。除非你描述它是什么,否则没有人能解释它为什么会失败。
  • "当我去拆分蓝图时,转换到 UBlueprint 总是失败" - 失败到底是怎么回事?是编译时失败还是运行时失败?有错误信息吗?
  • @Peter 抱歉,我很少使用堆栈溢出。我认为用虚幻引擎标记它会指定这是虚幻的。在问题中修复它。
  • IsValid 几乎可以肯定没有达到您的预期。如果您进入它,它可能是一个带有 bool 或其他东西的版本(指针是隐式可转换的,因此编译器不会让您知道默认情况下正在发生这种情况)。 if(Asset != nullptr) 甚至 if(Asset) 在大多数情况下都绰绰有余。例外情况是当你真正关心是否有东西被标记为待杀时。

标签: c++ casting unreal-engine4


【解决方案1】:

乔治是对的。我一直将if(IsValid(Asset)) 视为可以与if(Asset)if(Asset != nullptr) 互换。

一旦我将它切换到!= nullptr,它就可以正常工作了。 我想这与在启动时运行有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2023-03-08
    • 2016-11-30
    • 2016-07-06
    相关资源
    最近更新 更多