• UE4 ProcessEvent multiple parameters


    //FunctionClassName为具体执行方法的组件名字 例如:MyRadarComponent
    //data是一个结构体 记录了所要执行方法的名字(例如:test)和具体要执行方法的组件名字 没有也可以 直接调用 下边代码修改下就行
    //具体调用是填充data数据结构,例如要执行方法的组件名字,要执行的方法名,方法名样式:test 或者 test(1)或者test(1,1),多个参数逗号隔开,括号记得写
    UObject* FunctionObject = data->FunctionClassName.IsNone() ? this : GetOwner()->GetDefaultSubobjectByName(data->FunctionClassName);
    
       if (!FunctionObject)
       {
          UE_LOG(LogFlight, Warning, TEXT("This Component(%s) does't exist,Please check your data"), *data->FunctionClassName.ToString());
    
          //确保FunctionObject不为空
          FunctionObject = this;
       }
    
       UFunction* Func = nullptr;
    
       //检查方法名是否存在
       if (data->FunctionNames.IsValidIndex(data->NextState))
       {
          //查找对应按键方法
          FName FunctionName = data->FunctionNames[data->NextState];
          if (!FunctionName.IsNone())
          {
    
             //区分方法名和参数
             FString functionNameFullStr = FunctionName.ToString();
             FString FunctionStr;
             FString rightStr;
             TArray<FString> paramArray;
    
             bool bSuccess = functionNameFullStr.Split(TEXT("("), &FunctionStr, &rightStr);
    
             if (bSuccess)
             {
                FString paramStr;
                FString rightStr2;
                bool bSuccess2 = rightStr.Split(TEXT(")"), &paramStr, &rightStr2);
                if (bSuccess2)
                {
                   paramStr.ParseIntoArray(paramArray, TEXT(","), false);
                }
                else
                {
                   int num = rightStr.ParseIntoArray(paramArray, TEXT(","), false);
                   if (num == 0)
                   {
                      paramArray.Add(rightStr);
                   }
                }
    
             }
             else
             {
                FunctionStr = functionNameFullStr;
             }
    
             Func = FunctionObject->FindFunction(FName(FunctionStr));
    
             if (Func)
             {
    
                void* buf = FMemory_Alloca(Func->ParmsSize);
                FMemory::Memzero(buf, Func->ParmsSize);
                int i = 0;
                for (TFieldIterator<FProperty> PropertyIterator(Func); PropertyIterator; ++PropertyIterator, i++)
                {
    
                   FString* p = PropertyIterator->ContainerPtrToValuePtr<FString>(buf);
                   if (paramArray.IsValidIndex(i))
                   {
                      *p = paramArray[i];
                   }
                   else
                   {
                      *p = FString();
                   }
                }
    
                FunctionObject->ProcessEvent(Func, (void*)buf);
    
             }
             else
             {
                // PRINTWARNING(TEXT("This cockpit button does't have function"));
                UE_LOG(LogFlight, Warning, TEXT("This Component(%s) does't have function:%s"), *FunctionObject->GetName(), *data->FunctionNames[data->NextState].ToString())
             }
          }
    
       }
  • 相关阅读:
    CentOS防火墙相关命令
    Redis中几种数据类型的基本操作指令
    Pandas字符串操作及实例应用
    Pandas排列和随机采样
    Pandas数据的去重,替换和离散化,异常值的检测
    Pandas重塑和轴向旋转
    Pandas合并数据集之concat、combine_first方法
    Pandas合并数据集之merge、join方法
    转正述职报告
    Pandas操作数据库及保存csv
  • 原文地址:https://www.cnblogs.com/LynnVon/p/14794664.html
Copyright © 2020-2023  润新知