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

正确调用Workspace.Update(),热加载没效果

0 喜欢 0 不喜欢
163 浏览

我基于behaviac写了一个简单的AI Demo,现在Demo能跑起来,连调也没问题,但是热加载却没效果

按照官网上提供的热加载教程,我正确调用了behaviac.Workspace.Update,也就自动调用了DebugUpdate(),可热加载就是没效果

我调试代码端,看了看behaviac.Workspace的源码,打断点,发现运行到Workspace.HotReload方法时,m_ModifiedFiles这个集合时空的

进一步调试发现m_ModifiedFiles的初始化是在OnFileChanged这个方法中执行的,然后OnFileChanged的调用采用的delegate的方式,问题就出现在代理初始化了,但是OnFileChanged这个方法并没有执行,所以m_ModifiedFiles是空的,热加载就没效果

Workspace.TryInit方法的部分源码如下:

// set the file watcher
if (Config.IsDesktop && behaviac.Config.IsHotReload)
{
    if (this.FileFormat != EFileFormat.EFF_cs)
    {
        if (m_DirectoryMonitor == null)
        {
            m_DirectoryMonitor = new DirectoryMonitor();
            m_DirectoryMonitor.Changed += new DirectoryMonitor.FileSystemEvent(OnFileChanged);// 代理的OnFileChanged方法没有执行
        }

        string filter = "*.*";

        if (this.FileFormat == EFileFormat.EFF_xml)
        {
            filter = "*.xml";
        }
        else if (this.FileFormat == EFileFormat.EFF_bson)
        {
            filter = "*.bson.bytes";
        }

        m_DirectoryMonitor.Start(this.FilePath, filter);
    }
}

 

不知道这是不是bug,还是我代码哪里可能写的不对,求解答,谢谢!

 

版本号:3.5.4

平台:Unity3D(C#) + Windows

最新提问 7月 1, 2016 用户: bluecoder (450 分)

1个回答

0 喜欢 0 不喜欢
 
已采纳

首先看你的描述,应该这里提到的都正确了 http://bbs.behaviac.com/index.php/5/%E7%83%AD%E5%8A%A0%E8%BD%BD%E9%BB%98%E8%AE%A4%E6%94%AF%E6%8C%81%E5%90%97%EF%BC%9F

反正,如果没有看过的话,请参考下。

然后,可以参考以及尝试源码中提供的BattleCityDemo,里面的HotReload是可以运行的。

最新回答 7月 1, 2016 用户: jonygli (58,570 分)
采纳于 8月 1, 2016 用户:bluecoder
1、你提供的这个链接,我之前看过,我是按照官方文档来做的,没问题

2、官网提供的BattleCityDemo的HotReload我这边也是运行不起的,不然我也就不会提问了

o(╯□╰)o
对了,热加载只对xml或bson这种数据格式有效。格式是c#的话没有效果。

肯定是xml格式啊,现在是开发版,怎么会用C#格式呢

// set behaviac tree export path
behaviac.Workspace.Instance.FilePath = this.WorkspaceExportPath;
behaviac.Workspace.Instance.FileFormat = behaviac.Workspace.EFileFormat.EFF_xml;

你仔细看看我提问的详细描述吧,问题出在OnFileChanged这个方法没有调用

如下图,我用BattleCityDemo作的测试,OnFileChanged断到啦(小哥不要急,我需要花时间测试哈)。

对了,所谓的热加载,并非你修改源行为树,而是当导出的行为树被修改的时候被自动加载哈。

或者你手工修改,或者更普通的是在编辑器里做了修改,重新导出。

image

没有急哈,嘿嘿

但是真是奇怪,我这边OnFiledChanged断点并没有跑到

o(╯□╰)o

image

btw,刚才测试的时候,确实也发现了一个bug,要做下面的修改(很奇怪。。。,不过这个修改未必能解决你的问题):

image

 

你可以试试重新导出所有的行为树(如果你是手工修改的话,怕你是不是弄错文件了)。

你说的这些问题我都没问题的,行为树是在编辑器中修改并导出了的,一切都是按照官网提供的教程来做的

我在运行游戏中,编辑导出行为树,新的行为树没有效果

但是编辑导出行为树后,重新开游戏,新的行为树就有效果了,这明显是热加载出问题了呀

 

算了,我再看看吧,o(╯□╰)o
...