ue4-动态调用obj对象的方法

在使用AnimInstance的Notify时候发现可以动态调用UObject对象的方法,前提是这个方法必须是暴露给蓝图的或者是蓝图中的方法,应该是ue4中的某中反射机制生成的蓝图类XXX.generated.h


1、使用一个AMychar对象调用自身的bp func或者 c++暴露给蓝图的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void UMyBpFuncLib::TestObjFunc(AMyChar* _myChar,FString _funcName)
{
FName FuncFName = FName(*_funcName);
UFunction* Function = _myChar->FindFunction(FuncFName);
if (Function)
{
FString str = FString::Printf(TEXT("--- UFunction arg num:%d"), Function->NumParms); //这个方法的参数个数

GEngine->AddOnScreenDebugMessage(0, 2.0f, FColor::Green, str);

struct FAnimNotifierHandler_Parms //结构体和方法参数的类型和顺序要一致
{
int32 NotifyNum;
FString NotifyStr;
};

FAnimNotifierHandler_Parms Parms;
Parms.NotifyNum = 987;
Parms.NotifyStr = FString(TEXT("yangx"));
_myChar->ProcessEvent(Function, &Parms);
}
}

2、然后看下AMychar要被动态调用的方法

  • 一定要暴露给蓝图,也就是加UFUNCTION
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //h
    UFUNCTION(BlueprintCallable, Category = "MyChar")
    void TestFunction(int32 _num, FString _str);


    //cpp
    void AMyChar::TestFunction(int32 _num, FString _str)
    {
    FString str = FString::Printf(TEXT("--- AMyChar::TestFunction - num:%d, str:%s"), _num, *_str);
    GEngine->AddOnScreenDebugMessage(0, 5.0f, FColor::Green, str);
    }

3、蓝图动态调用c++方法

这里写图片描述

  • 结果:
    这里写图片描述

4、蓝图动态调用blueprint方法

  1. 在AMychar的蓝图类中其个方法
    这里写图片描述

  2. 然后动态调用
    这里写图片描述

  3. 结果
    这里写图片描述