【UE4】【UnLua】从UnLua的接口和Cast的使用谈谈Lua如何访问UE中的类(包括蓝图)
最近有人提了一个问题,在UnLua官方代码的Demo中,为什么OtherActor:Cast(UE4.ABP_PlayerCharacter_C)传入的参数是动画蓝图对应的类名?
我只能说,这只是一个巧合,这里传入的确确实实是角色蓝图的类名。要弄懂该问题。我们先看看接口的使用和Cast的使用代码。

UE4.UBPI_Interfaces_C.NotifyEnemyDied(GameMode)这行代码中,BPI_Interfaces_C是定义的蓝图接口,怎么直接调用了接口的方法,
最终到底调用的哪个对象的方法?
这里涉及到几个知识点:
1. UE4.UBPI_Interfaces_C涉及到lua中元方法Index
2. UE4.UBPI_Interfaces_C涉及到UnLua插件中是如何注册和获取UClass的
3. lua中冒号(:),点号(.)访问的区别
弄懂了这几点,我们就可以明白,为什么蓝图接口明明定义的是BPI_Interfaces,访问的时候却变成UBPI_Interfaces_C,_C我们都知道,UClass在加载时需要加_C。



从代码中可以看到,全局变量UE4的Index元方法是UE4_Index,UE4.UBPI_Interfaces_C就会调用到此元方法。
Name=UBPI_Interfaces_C,所以会调用RegisterClass方法,进而调用FReflectionRegistry::RegisterClass。该方法中如果第一个字母为特定字母则去掉第一个字母
并调用UE的FindObject或者LoadObject,到了UE加载类的流程中(这里不详加描述)。
关于接口调用部分,已经通过UE4.UBPI_Interfaces_C访问到的是类的信息了。相当于是知道了C++中Class的方法签名,那怎么调用呢?当然是直接将this传进去了。
所以第一个参数其实是this,相当于C++中调用ClassA::FunctionA(this, 后面是方法的参数列表)。
Lua中的点号(.)调用函数,不会传入self作为默认参数。上面的代码
其实可以改为GameMode:NotifyEnemyDied()。
现在来看看面的问题,Cast(UE4.ABP_PlayerCharacter_C)参数指的是动画蓝图吗?如果要检查动画蓝图,我们又该提供什么参数呢。留待大家去讨论吧!