Code Monkey home page Code Monkey logo

tencent / behaviac Goto Github PK

View Code? Open in Web Editor NEW
2.7K 202.0 783.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 People

Contributors

cainhuang avatar jonygli avatar justinzhuguangwen avatar kecookier avatar lfeng1420 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

behaviac's Issues

如何使用behaviac的事件?

snipaste_2018-08-27_17-53-40

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

关于behaviac节点复用的疑问

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

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

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;
...

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

可能的空指针解引用查询

第一个问题是 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)

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

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

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

编辑器很明显的bug

au 9 b4grjms j qy31cm

bbb

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

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

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

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

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

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

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

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

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

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

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

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

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

”用户自定义属性”的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都没有""标记。

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

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

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

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

RT

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

:(

编辑器异常

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

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

编译链接错误

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

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

枚举BUG

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

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

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

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

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

关于task传递参数的问题

image
image

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

为何新添加一个类型会导致原先设置的所有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类型中各个属性的类型值被清空,导致出错并清空行为树。

关于状态机子树的问题

您好,看了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行为树编辑器中所有用到Property、Method的节点,都突然重置了(Proerty、Method变成未设置状态)

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

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

如:
添加一下并设置:

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

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

状态机与行为树嵌套问题

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

有人知道什么情况吗

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 顺序和编译选项。这在使用的时候就会造成许多麻烦。

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

行为树中的空指针问题

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

Lua支持

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

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

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

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;
    }

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.