Giter Site home page Giter Site logo

tencent / behaviac Goto Github PK

View Code? Open in Web Editor NEW
2.8K 203.0 785.0 38.6 MB

behaviac is a framework of the game AI development, and it also can be used as a rapid game prototype design tool. behaviac supports the behavior tree, finite state machine and hierarchical task network(BT, FSM, HTN)

Home Page: http://www.behaviac.com/

License: Other

CMake 0.28% C 1.05% C++ 32.03% Batchfile 0.04% Shell 0.02% C# 65.53% Makefile 0.91% Java 0.01% HTML 0.13%
bt behavior-tree behavior-trees fsm htn game unity game-ai

behaviac's Issues

Lua支持

你好,请问什么时候可以支持Lua?

行为树中的空指针问题

我的项目中有这样一种情况
AgentA有一个property的类型是AgentB
AgentA在执行时,这个property有可能是null
如果直接用动作去调用它的方法,会直接崩掉
有没有什么比较好的办法来避免?

关于手动添加类型的流程问题

当需要暴露已经再项目中实现的类型给AI时,会进行这样一个手动添加类型meta的过程。工具现在提供的流程有2个地方不太合理。

比如希望暴露给AI, 游戏中的实体类型GameEntity, 该类型已经有了成熟的代码实现。
问题1.新类型一定要继承behavic::Agent. 强制要求继承会要求更改之前已经存在的成熟类型,这个不能更改的设定很不友好。
问题2.增加GameEntity.meta.xml之后,编辑器重新加载工作区之后会合并,并且删除新增的meta定义文件。
这个对管理复杂的项目只使用一个类型定义的meta文件方式,并不方便历史查看,对比,多人合作。

The Instance can not be found.Check the Agent.BindInstance

1.为什么会出现这个问题? .btsetcurrent("")中弹出.
是不是在编辑器中.只能引用 self/ self:method的方法?

2.关于整合到项目当中的AgentProperties和 自己行为生成类.
可以通过更改二者的命名空间来整合到项目中吗.
测试实例的时候更改不会报错.
而当自己的行为树更改的时候就会提示 要将完整的AgentProperties整合到项目当中.
另外整合的框架为 .net core 2.0.

编辑器异常

behaviac/tools/designer/External/DockPanel/WinFormsUI/Docking/VS2005DockPaneStrip.cs :916
image

再现方法是在编辑树时为当前agent添加method

如何使用behaviac的事件?

snipaste_2018-08-27_17-53-40

我在行为树执行的时候(次数阻塞于wait signal节点),通过外部代码fireevent,但是总是在行为树中不能正确接收事件,以至于不能正确回调, 想问一下, 会是神马问题。

What's the mean of `m_bHasEvents |= m_bHasEvents`

    void BehaviorNode::load_attachments(int version, const char*  agentType, BsonDeserizer& d, bool bIsTransition) {
        ...
        this->m_bHasEvents |= this->HasEvents();
        ...
    }

It seems meanless because

    bool BehaviorNode::HasEvents() const {
        return this->m_bHasEvents;
    }

BehaviorLoaderImplement 依赖于静态变量的初始化顺序

在集成 c++ 生成的代码时,我们先将其编译成 .a 静态库,然后在 link 阶段将其集成进服务器中。但是执行时会报错:

The types/internal/behaviac_agent_meta.cpp should be exported from the behaviac designer, and then integrated into your project!

这个检查是在 src/common/meta.cpp:806 进行的
if (signature != (long long)AgentMeta::GetTotalSignature())

GetTotalSignature() 依赖于 BehaviorLoaderImplement 的初始化,但是 BehaviorLoaderImplement 是作为静态变量初始化的。这样一来,它的初始化就依赖于 linkder 的 Link 顺序和编译选项。这在使用的时候就会造成许多麻烦。

这个问题是否可以打个补丁修复呢。

动作节点方法返回了EBTStatus值,但决定状态的选项仍然需要设置

1
2
如上图,Attack方法是返回EBTStatus的(图1),但动作节点属性中决定状态的选项依然需要设置(图2)
看手册(动作节点)中描述是这样的:如果动作节点的方法返回EBTStatus值,那么该值就直接作为动作节点的状态,“决定状态的选项”和“决定状态的函数”将被禁用无需设置。
是新版本改掉了这个规则么?

编辑器版本:3.6.39
工作区打包文件:MainAI.zip
行为树:Attack

编辑器很明显的bug

au 9 b4grjms j qy31cm

bbb

先给agent创建了一个task 名为tryRleaseSkill, 参数是skillName, 后台把参数名改为了param,结果打开成员变量列表一看,还是现实的skillName

序列节点下的结束节点不能结束整个行为树

123
例如这个行为树,执行到结束节点时会一直返回RUNNING,导致整个行为树不会结束。
验证发现只要结束节点前面有类似循环、等待等节点(放在序列节点下)就会出现这种情况,是不是结束节点不支持这样使用?

同一行为的树 如何设置Property不同

假设A B怪的行为完全是一样的 但是A怪搜索敌人的范围比B大 这样A和B只能用不同类型的Agent 然后设置不同的搜索范围的敌人吗 还是可以在同一个Agent里面设置

Struct定义的引用类型去除后编译错误

定义Struct A, 默认为引用类型。MyAgent 添加属性 a, 类型为 A. 然后将 Struct A 定义中的引用类型去除,重新导出。代码 behaviac_agent_member_visitor.h 没有相应更改,造成编译错误。

struct PROPERTY_TYPE_MyAgent_a { };
template<> inline A*& MyAgent::_Get_Property_<PROPERTY_TYPE_MyAgent_a>()
{
	return this->a;
}

a 已不是指针:

class MyAgent : public behaviac::Agent
{
	private: A a;
...

从非引用类型改成引用类型则是正常的。

”用户自定义属性”的Property没有"*"标记

"按QQ群公告:提供必要上下文,版本号,平台信息,重现步骤"

  • 上下文:无,因为是必现
  • 版本号:3.6.39
  • 平台信息:
    • 操作系统:Windows7 sp1 x64
    • 程序段开发语言:C#
  • 重现步骤:
    • 打开“类型信息面板”
    • 选中类型列表中需要添加自定义Property的类型:如:XXXAgent
    • 成员类型选中:Property
    • 点击右边的“新增”按钮
    • 填写上对应的”变量名“,”类型“,确定
    • 然后,刚刚添加的Property,在”类型信息面板“中并没有显示”*“标记。

http://www.behaviac.com/language/zh/overview/ 中的3.1.3 变量介绍中
Property名称前有""标记的,介绍说是”用户自定义属性”,但我发现我自定义的N个Property都没有""标记。

关于task传递参数的问题

image
image

如图,我在Task1里打印传递进来的参数retry,打印的结果都是第一次的值。
retry_times初始化=-1
总体打印输出是:
第一次循环:-1 0 0
第二次循环:0 1 0
第三次循环:1 2 0
....
是我的用法不对吗?

关于状态机子树的问题

您好,看了node_test/fsm/fsm_ref_bt_ut的例子,对应c++代码fsmunittest.cpp
当testVar_0为2时,调用btexec, 前置使得testVar_0变为3,那此时是先执行子树action_ut_1_2呢, 还是根据条件跳转到Exit节点。

status = testBtAgent->btexec();
CHECK_EQUAL(behaviac::BT_RUNNING, status);
CHECK_EQUAL(4, testBtAgent->testVar_0);

另外这里为啥返回状态是status为running

盼复,谢谢。

自定义类型的枚举和类,在设定成员类型时,类型列表中找不到对应的枚举和类

问题:自定义类型的枚举和类,在设定成员类型时,类型列表中找不到对应的枚举和类
重现方式:不确定
已知情况:一开始创建自定义类型的枚举和类时,在类型列表中是可以找到对应的枚举和类,后面不确定什么操作,突然就找不到了。删除原有的定义,重新定义一个也不行,感觉工作环境被破坏了一样。没法恢复,感觉太糟了。
有知道什么问题导致的吗?

为何BehaviacDesigner没看到有地方可创建:Prefabs(预制行为树)

"按QQ群公告:提供必要上下文,版本号,平台信息,重现步骤"

  • 上下文:无
  • 版本号:3.6.39
  • 平台信息:
    • 操作系统:Windows7 sp1 x64
    • 程序段开发语言:C#
  • 重现步骤:无(因为这个是编辑器的功能未找到的问题)

RT

http://www.behaviac.com/language/zh/overview/ 中的3.3.2 预制
只有介绍,但编辑器不能创建吗?
那这个介绍有什么用。。。

:(

关于behaviac节点复用的疑问

behaviac是否支持自定义节点?譬如说,我想加一个动作节点,它的功能不是当前树对应类型的成员函数,而是另外的一个类型支持的功能(目前看好像只能通过子树的概念实现)

因为这个涉及到节点的复用,如果一个动作节点定义好了,它在任意的一棵树上,可以随时被创建调用。
目前看使用子树的概念可以达到类似的效果,但是本身概念上感觉被复杂化了,我的理解,动作节点就只做动作行为,条件节点就只做条件行为(这里说的是原子化的动作节点和条件节点),而子树,本身是树,它是一系列节点的组合,当它只做一个节点的事情的时候,它的效果是相当于原子节点,但是毕竟变复杂了。

关于behaviac在实际使用中的一些问题

在研究是否可以把behaviac应用到我们项目中来。有两个问题想请教一下:
1、behaviac是否在实际项目中使用过?是否有上线项目使用?
我看到behaviac的官网下面有用户案例,是这些项目都使用了behaviac作为ai编辑器吗?例如王者荣耀这款游戏,是在什么场景下使用了behaviac?
2、编辑器的使用者的定位是程序还是策划?

另外顺便提两个疑似BUG
1、在action中添加参数信息。将该action拖入行为树中,再在类型心中中将参数信息删除,应用。行为树中的参数信息不会删除。删除行为树中的节点,重新拖入action指定方法,还是需要参数信息。
2、action中不能指定决定状态的函数。我不知道有没有设置对,方法返回类型void,决定状态的选项是invalid,想指定的函数的参数是0个,返回值是status。

还有一个可能存在问题的地方
1、Prefab解除预制实例(我理解这个功能是与prefab解绑定),背景还是显示灰色的Prefab[...],不能直观判断解绑定了。

可能的空指针解引用查询

第一个问题是 base/workspace.cpp 104 行里

BehaviorTreeTask* Workspace::CreateBehaviorTreeTask(const char* relativePath) 函数实现里有 return 0,不知道是否有可能真的会运行这句,如果它返回了0,就会导致

agent/state_t.cpp 

               this->m_bt = Workspace::GetInstance()->CreateBehaviorTreeTask(btName.c_str());        // <== 这里返回0 的话
            }

            CSerializationID  nodeId("node");
            ISerializableNode* n = btNode->findChild(nodeId);
            BEHAVIAC_ASSERT(n);

            this->m_bt->Load(n);        // <== 这里就会 null pointer dereference

====================分割=========

第二个问题是 inc/behaviac/agent/agent.inl 447 行里

        if (pProperty && pProperty->m_bIsStatic)    // 这里做了pProperty 的 null 检查, 如果是 null 则跑到下面的步骤
        {
            int contextId = this->GetContextId();
            Context& c = Context::GetContext(contextId);

            const char* staticClassName = this->GetObjectTypeName();
            const VariableType* pVal = c.GetStaticVariable<VariableType>(staticClassName, variableId);
            return *pVal;
        }

		const VariableType* pVal1 = VariableGettterDispatcher<VariableType, behaviac::Meta::IsRefType<VariableType>::Result>::Get(this->m_variables, this, pProperty, variableId);       // 这里没有再做检查就传入了 Get,里面没做检查就进行了 dereference,可能触发 null pointer deference,这个运行路径有可能出现吗
		if (pVal1)

枚举BUG

BUG:建一个enum,将enum做为 Agent的属性,命为 aEnum,再次打开工程, aEnum的类型消失。

状态机与行为树嵌套问题

在子树文档中的描述,状态机与行为树可以相互嵌套。在btunittest中的例子中是可以嵌套,但是我重新创建一个状态机,想为状态机添加一棵行为子树,问题:
1.从左边子树节点拉到状态机中作为节点,鼠标一直是禁止符号,不能创建
2.从已有的行为树拉到状态机中作为节点,鼠标一直是禁止符号,不能创建

有人知道什么情况吗

BehaviacDesigner行为树编辑器中所有用到Property、Method的节点,都突然重置了(Proerty、Method变成未设置状态)

"提供必要上下文,版本号,平台信息,重现步骤"

  • 上下文:无,因为是偶现
  • 版本号:3.6.39
  • 平台信息:
    • 操作系统:Windows7 sp1 x64
    • 程序段开发语言:C#
  • 重现步骤:无(暂时没发现规律,偶现)

如:
添加一下并设置:

  • 行为节点,设置调用方法:MethodA
  • 条件节点,设置判断某个属性:TestProperty0 == 0

对行为树编辑过程中,突然就全部节点只要用到:Property、Method的都重置为未设置状态。
不知道大家遇到这类问题没?
Behaviac从2012年开发到现在,不可能这么明显的BUG,大家都没遇到吧?

state machine exports file make compiling error

error CS0122: 'AlwaysTransition' is inaccessible due to its protection level

i see the define of AlwaysTransition is not public,but the exporting code used it.

The exported code is:
class AlwaysTransition_bt_Test_TestState_attach8 : behaviac.AlwaysTransition

大家好,怎样才能实现心跳包和其他逻辑消息并发不冲突呢

我在行为树中使用了“并行”节点来实现心跳包和其他逻辑并行,然而情况和我预想的不一样,在“并行”节点子节点上,给他增加的循环会导致一切在并行的逻辑都会进入循环,这样是并行的BUG还是就是如此设计的呢,那么如果我想实现类似的逻辑,应该如何操作呢~
望大家指教一二,谢谢

编译链接错误

2>behaviac_debugdll_win32_vs2010.lib(behaviac_debugdll_win32_vs2010.dll) : fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突

我们的项目是x64平台的,但是这个静态库是x86的,该如何解决?

为何新添加一个类型会导致原先设置的所有Agent类型的属性的类型都被置空且无法恢复

我在类型信息编辑器中添加了N个Agent类型,如A1、A2...AN它们都从behaviac::Agent类型继承。然后又添加了一个Agent类型B,也是从behaviac::Agent类型继承,然后为为这个类型B添加N个Property,类型分别为
A1,A2...AN,添加完后点应用生效。然后基于类型B,创建一棵行为树,如图:

然后在完善该行为树过程中,发现还需添加一种枚举类型,然后回到类型信息编辑器中添加了一个枚举类型,添加后点击应用,这时报workspace.cs这个文件出现了引用对象类型为空的错误,然后回到编辑器,选择Agent类型B,发现其类型为A1...AN的N个Property的类型下拉列表框内原先选择的A1...AN这些类型值都被置空了。遇到这个问题后,尝试重新在下拉列表框中选择对应的类型并点应用,均无效果,依然报workspace.cs里引用对象类型为空,也就是说找不到A1...AN这些类型的定义了。然后编辑器里所有Agent类型选择B的行为树的设置都被清空。尝试了各种恢复办法,比如将正常时备份的meta配置文件覆盖过去,都没有效果,最后将meta配置文件中对应Agent B节点手工删除,然后回到编辑器中重新添加类型B并重新添加各个类型为A1...AN的Property,然后点击应用生效才正常。实在是费时费力,最要命的是凡是引用类型B为Agent的所有行为树都被置空,需要重新选择和编辑各个子节点,简直让人抓狂啊。这个现象必现!!!也就是,在添加了一个拥有多个Agent类型属性的Agent类型后,后续不能再在同一命名空间中添加新的类型,如Agent\Struct\Enum,都不行,会导致该复合的Agent类型中各个属性的类型值被清空,导致出错并清空行为树。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.