//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())
         }
      }

   }