等待(Wait)节点在指定的数值内(单位根据自己的使用场景来定)持续保持为运行(Running)状态,数值到达之后则返回成功,如下图所示:

wait

需要配置“持续时间”,可以是常数、属性或方法的返回值(支持double和int类型),如下图所示:

wait

在工作区配置窗口中,可以勾选左下角的“使用整数值”来表示是否使用整数值,如下图所示:

edit_workspace

如果勾选了“使用整数值”选项,那么在导出代码文件behaviac_agent_meta.cpp中,会自动生成Workspace::GetInstance()->SetUseIntValue(true)。

等待节点的更新逻辑是:

bool bUseIntValue = Workspace::GetInstance()->GetUseIntValue();

if (bUseIntValue)
{
    long long time = Workspace::GetInstance()->GetIntValueSinceStartup();

    if (time - this->m_intStart >= this->m_intTime)
    {
        return BT_SUCCESS;
    }
}
else
{
    double time = Workspace::GetInstance()->GetDoubleValueSinceStartup();

    if (time - this->m_start >= this->m_time)
    {
        return BT_SUCCESS;
    }
}

因此,只有保证Workspace::GetInstance()->GetIntValueSinceStartup()或Workspace::GetInstance()->GetDoubleValueSinceStartup()正确的返回从游戏启动到现在的总时间,等待节点才能正确工作。

如果勾选了“使用整数值”选项,那么Workspace::GetInstance()->GetUseIntValue()将返回true,并且该总数值需要通过Workspace::GetInstance()->SetIntValueSinceStartup(long long value)设置,可以在自己的游戏更新函数中调用该函数。

如果没有勾选“使用整数值”选项,那么Workspace::GetInstance()->GetUseIntValue()将返回false。该总时间需要通过Workspace::GetInstance()->SetDoubleValueSinceStartup(double value)设置,可以在自己的游戏更新函数中调用该函数。

注意:在C#代码中相应的接口需改为Workspace.Instance.IntValueSinceStartup或Workspace.Instance.DoubleValueSinceStartup,默认实现方式是返回Unity的系统时间Time.realtimeSinceStartup,一般情况无需自己重新实现,直接使用即可,不用类似C++的接口每帧更新时调用Workspace.Instance.IntValueSinceStartup或Workspace.Instance.DoubleValueSinceStartup为其赋值。

具体的执行逻辑可以查看behaviortree/nodes/actions/wait.cpp

One thought on “等待节点

发表评论

电子邮件地址不会被公开。 必填项已用*标注