前言
在开发UE4项目时,经常将UMG的动画直接在编辑器中实现。而调用的时机却是要由C++逻辑代码来决定。实现此类功能目前我知道的有两种方式
-
C++声明 UFUNCTION(BlueprintImplementableEvent)函数然后在蓝图中重载调用
-
利用反射代码来获取对应动作的对象,然后进行动画播放。
目前我自己是比较倾向于方式1
反射获取对应动画代码
AnimationsMap.Empty();
UProperty* Prop = GetClass()->PropertyLink;
/*遍历所有的UProperty*/
while (Prop)
{
if (Prop->GetClass() == UObjectProperty::StaticClass())
{
UObjectProperty* ObjProp =Cast<UObjectProperty>(Prop);
/*寻找我们的UWidgetAnimation*/
if (ObjProp->PropertyClass == UWidgetAnimation::StaticClass())
{
UObject* Obj = ObjProp->GetObjectPropertyValue_InContainer(this);
UWidgetAnimation* WidgetAnimation = Cast<UWidgetAnimation>(Obj);
if (WidgetAnimation && WidgetAnimation->MovieScene)
{
/*以动画名为Key存储引用*/
FName AnimName = WidgetAnimation->MovieScene->GetFName();
AnimationsMap.Add(AnimName, WidgetAnimation);
}
}
}
Prop = Prop->PropertyLinkNext;
}