在运行时端(下面以C++版来加以说明,C#版基本类似),整个组建的更新可以通过Workspace::Update()函数来执行,该函数主要包括两大功能:
- 调用DebugUpdate()函数来更新一些连调和热加载相关的功能。
- 根据m_bExecAgents来判断是否需要执行所有Agent实例的btexec()函数,可以通过接口Workspace::SetIsExecAgents(bool bExecAgents)对m_bExecAgents进行设置。
具体执行逻辑如下代码所示:
void Workspace::DebugUpdate()
{
this->LogFrames();
this->HandleRequests();
if (this->GetAutoHotReload())
{
this->HotReload();
}
}
void Workspace::Update()
{
this->DebugUpdate();
if (this->m_bExecAgents)
{
int contextId = -1;
Context::execAgents(contextId);
}
}
对于C++版,行为树的执行可以调用behaviac::Workspace::GetInstance()->Update()来执行所有Agent实例的行为树,也可以单独调用Agent的接口btexec()来执行单个实例的行为树。
其中,Workspace::Update()会遍历所有的Agent实例并依次执行btexec(),但在自己的游戏项目中,可能在一帧中需要对某些Agent多次调用btexec(),而另一些Agent只需调用一次,这时候就需要单独调用Agent::btexec(),而不是统一调用Workspace::Update()。
Workspace::Update()在调用Agent::btexec()之前,会检查Agent::IsActive()是否为true,如果为false,那么btexec()就不会被调用。
此外,为了支持连调和热加载,请务必保证在自己游戏的更新函数中调用了DebugUpdate()函数。如果已经调用了behaviac::Workspace::GetInstance()->Update(),那么就不需要再单独调用DebugUpdate()。
上述示例代码虽然是C++,但对于C#,也都是同名的。
特别注意:对于C#版,behaviac.Workspace.IsExecAgents默认设为false。
- 如果将behaviac.Workspace.IsExecAgents设为true,使用behaviac.Workspace.Instance.Update()集中进行更新,Agent自己的更新就不需要调用btexec()了。
- 如果将behaviac.Workspace.IsExecAgents设为false,则不使用behaviac.Workspace.Instance.Update()集中进行更新,Agent自己的更新就需要调用btexec()了。
3 thoughts on “运行时端的执行流程”