• 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())
             }
          }
    
       }
  • 相关阅读:
    iOS 各种编译错误汇总
    Reveal查看任意app的高级技巧
    PCH in Xcode 6
    iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具
    UICollectionViewController xcode6.1 自定义Cell
    Xcode6.1 Prefix.pch添加方式
    最近开始研究php的缓存技术,来个系统自带的OPcache
    今天练手了下mysqlbinlog,标记下
    写了个数组多个数组合并返回的是不重复的数组
    ngnix配置thinkphp5隐藏index.php的方法亲测有效
  • 原文地址:https://www.cnblogs.com/LynnVon/p/14794664.html
Copyright © 2020-2023  润新知