【问题标题】:(UE4 C++) Converting a data-table row name to a class name to spawn actors(UE4 C++) 将数据表行名转换为类名以生成actors
【发布时间】:2020-10-08 02:59:05
【问题描述】:

所以我正在开发一款基于小队的策略游戏,例如《英雄连》。我目前仍在构建玩家将与之交互并下达命令的小队框架。我决定使用数据表来定义小队和单位的内容,但在弄清楚我的 CreateUnit 函数将如何工作时遇到了麻烦(它将根据小队演员的请求处理生成士兵)。我将两个参数传递给它,即从数据表的行名中获取的 FName 形式的请求类名和必须生成的该类型的数量。我在尝试将该类名变量输入 SpawnActor 函数时遇到了麻烦。这是相关代码的精简版:

TArray<FName> ClassNames = ContainerDataTable->GetRowNames();
    
// Call CreateUnit function for every request until squad is full
for (auto& RequestedUnitClass : ClassNames)
    {
    // Select Row
        FUnitContainerData* SelectedRow = ContainerDataTable->FindRow<FUnitContainerData>(RequestedUnitClass, "");
    
        // Find number requested
        int AmountToSpawn = SelectedRow->NumberOfUnits;
    
        CreateUnit(RequestedUnitClass, AmountToSpawn);
    }
    
    void AUnitContainer::CreateUnit(FName Classname, int Amount)
{
    // Determine class from row name
    FName RequestedUnitClass = Classname;

    // Spawn unit from Class
    FActorSpawnParameters SpawnInfo;
    RequestedUnitClass* Unit = GetWorld()->SpawnActor<RequestedUnitClass>(RequestedUnitClass::StaticClass(), SpawnLocation, SpawnRotation, SpawnInfo);

我遇到的问题是变量 RequestedUnitClass 不被接受为 SpawnActor 函数的参数的一部分。我仍在学习 C++,在我看来,我只是传递了错误的数据。我想使用行名作为类名的变量,但这可能吗?就像名为 SoldierType1 的行在解析时会生成名为 SoldierType1 的类,并带有相应的数据(在这种情况下,需要生成多少个)。

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

    documentationUWorld::SpawnActor的函数定义,

    template<class T>
    T * SpawnActor
    (
        UClass * Class,
        FVector const & Location,
        FRotator const & Rotation,
        const FActorSpawnParameters & SpawnParameters
    )
    

    该函数不采用FName 类型的参数,因此您必须替换它,因为其他三个参数似乎是正确的。此外,您的模板参数必须是一个实际的类,并且第一个函数参数必须是 UClass* 类型。现在,您有一个类型为 FName 的变量,这两个变量都不正确。因此,您应该用TArray&lt;TSubclassOf&lt;AActor&gt;&gt; Classes 变量替换您的TArray&lt;FName&gt; ClassNames 变量,以便RequestedUnitClass 的类型为UClass*。您必须修改您的 ContainerDataTable-&gt;GetRowNames() 函数以返回 TArray&lt;TSubclassOf&lt;AActor&gt;&gt; 类型的变量,这样才能正常工作。

    当调用SpawnActor 时,您将使用AActor 作为模板参数。请注意,我仅将AActor 用于TSubclassOfSpawnActor 的模板参数,因为我假设您的数组可以引用各种actor 类,所以我希望尽可能通用。然后对于SpawnActor 函数采用的UClass* 参数,RequestedUnitClass 现在应该可以工作了。由于我假设您不希望生成的每个演员一直都是一般的AActor,因此您可以在生成演员后将结果转换为特定的类,但我将由您决定。

    AActor* Unit = GetWorld()->SpawnActor<AActor>(RequestedUnitClass, SpawnLocation, SpawnRotation, SpawnInfo);
    ...
    // do some IsA class checks to figure out which class to cast the actor to
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多