前言
1.以control模式为例
2.比较散,想单独拿出一篇梳理下Experience的流程
GameFeatureAction_AddComponents
这部分建议看
《InsideUE5》GameFeatures架构(五)AddComponents
这里写的内容相当于是我跟着走了一遍
Lyra中角色基本类ALyraCharacter类似于一个框架,负责转发事件给其组件,组件实现相关功能,所以ALyraCharacter甚至只有几百行(在这个不算小的项目里这真的算短了(我觉得))。
在研究生成角色流程之前,我想先研究一下GameFeatureAction中的AddComponents,帮助之后的理解。
在加载Experience的过程中,执行到ULyraExperienceManagerComponent::OnExperienceLoadComplete时会激活GameFeature,以AddComponents为例,一直到OnGameFeatureActivating的调用栈如图:

而在OnGameFeatureActivating中都会调用到AddToWorld
前面经过一些World,客户端服务端之类的判断后,执行逻辑在如下的一行:
void UGameFeatureAction_AddComponents::AddToWorld(const FWorldContext& WorldContext, FContextHandles& Handles) {
...
Handles.ComponentRequestHandles.Add(GFCM->AddComponentRequest(Entry.ActorClass, ComponentClass, static_cast<EGameFrameworkAddComponentFlags>(Entry.AdditionFlags)));
...
}
GFCM::AddComponentRequest
TSharedPtr<FComponentRequestHandle> UGameFrameworkComponentManager::AddComponentRequest(const TSoftClassPtr<AActor>& ReceiverClass, TSubclassOf<UActorComponent> ComponentClass, const EGameFrameworkAddComponentFlags AdditionFlags)
{
// You must have a receiver and component class. The receiver cannot be AActor, that is too broad and would be bad for performance.
if (!ensure(!ReceiverClass.IsNull()) || !ensure(ComponentClass) || !ensure(ReceiverClass.ToString() != TEXT("/Script/Engine.Actor")))
{
return nullptr;
}//一些检查
FComponentRequestReceiverClassPath ReceiverClassPath(ReceiverClass);
UClass* ComponentClassPtr = ComponentClass.Get();
FComponentRequest NewRequest;
NewRequest.ReceiverClassPath = ReceiverClassPath;
NewRequest.ComponentClass = ComponentClassPtr;
// Add a request if there is not an already existing one. Note

最低0.47元/天 解锁文章
3558

被折叠的 条评论
为什么被折叠?



