• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱

等待帧数执行逻辑动作不对的情况

0 喜欢 0 不喜欢
81 浏览

image

如图.有如下的行为树.

但是实际执行过程中.74号节点一直不会执行.

打断点发现

            protected override bool onenter(Agent pAgent)
            {
                this.m_start = Workspace.Instance.FrameSinceStartup;
                this.m_frames = this.GetFrames(pAgent);

                return (this.m_frames >= 0);
            }

Waitframes.cs中的onenter每次都被执行了.

导致了

            protected override EBTStatus update(Agent pAgent, EBTStatus childStatus)
            {
                Debug.Check(childStatus == EBTStatus.BT_RUNNING);

                if (Workspace.Instance.FrameSinceStartup - this.m_start + 1 >= this.m_frames)
                {
                    return EBTStatus.BT_SUCCESS;
                }

                return EBTStatus.BT_RUNNING;
            }

执行update的时候m_start和FrameSinceStartup一直一样.所以不会退出.

最新提问 9月 9, 2016 用户: qq_57bc0d701ec50 (270 分)

1个回答

0 喜欢 0 不喜欢
最新回答 9月 9, 2016 用户: jonygli (57,510 分)
上面说需要参考的地方,我这里是对的已经改了..用的是游戏本身自己管理的帧
从断点情况来看
Workspace.Instance.FrameSinceStartup,

this.m_start

都是在递增.但是每次都是一样.因为每次进waitframe这个action之前都执行了一次on_enter

让this.m_start = Workspace.Instance.FrameSinceStartup

奇怪的是.在同一个行为树其他地方的等待帧函数能正常执行
onenter应该在进入的时候执行一次,然后是update若干次一直到等待的帧数,然后onexit执行一次。

如果执行update的时候m_start和FrameSinceStartup一直一样,则是FrameSinceStartup没有被更新。你需要在你的更新逻辑了更新之。
不是.更新了.我单独测试了.在上面那个序列节点独立的情况.结果是正确...

简单来说正常情况时

假设100帧时候on_enter

等待60帧

到160帧返回success.

但是这时候不对的流程是

100到160帧都执行了on_enter.

通过断点发现..应该是整地执行流程出现了问题.

导致.WaitFrames这个update只执行了一次就退出了..

还有就是退出的时候behaviac.EBTStatus.BT_SUCCESS都没有返回..

把你整个树贴上来看看。

或者把你的workspace发给群主看看。

另外,最好提供log

可以参考:http://bbs.behaviac.com/index.php/1098

...