{"id":27453682,"url":"https://github.com/eraclys/behaviourtree","last_synced_at":"2025-04-15T13:56:38.408Z","repository":{"id":22472338,"uuid":"96347928","full_name":"Eraclys/BehaviourTree","owner":"Eraclys","description":null,"archived":false,"fork":false,"pushed_at":"2022-12-27T05:03:49.000Z","size":320,"stargazers_count":109,"open_issues_count":1,"forks_count":31,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-15T13:56:28.404Z","etag":null,"topics":["ai","behaviour-tree","behaviour-trees","c-sharp"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Eraclys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-07-05T18:10:29.000Z","updated_at":"2025-04-08T02:54:06.000Z","dependencies_parsed_at":"2023-01-11T21:38:24.272Z","dependency_job_id":null,"html_url":"https://github.com/Eraclys/BehaviourTree","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eraclys%2FBehaviourTree","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eraclys%2FBehaviourTree/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eraclys%2FBehaviourTree/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Eraclys%2FBehaviourTree/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Eraclys","download_url":"https://codeload.github.com/Eraclys/BehaviourTree/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249085485,"owners_count":21210267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","behaviour-tree","behaviour-trees","c-sharp"],"created_at":"2025-04-15T13:56:36.992Z","updated_at":"2025-04-15T13:56:38.400Z","avatar_url":"https://github.com/Eraclys.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BehaviourTree\n\n[![Build status](https://ci.appveyor.com/api/projects/status/ad6prnywckev6s4b?svg=true)](https://ci.appveyor.com/api/projects/status/ad6prnywckev6s4b?svg=true)\n\n\n## Installation\n \n```\nInstall-Package BehaviourTree\n```\n\n## Demo\nhttps://www.youtube.com/watch?v=OeVo2l-O0vU\n\n[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/OeVo2l-O0vU/0.jpg)](https://www.youtube.com/watch?v=OeVo2l-O0vU)\n\n## Features\n\n - Generic context \n - Extensible\n - Fluent Builder\n - Basic node types included\n - Tree visualizer (Coming soon)\n\n## Usage (FluentBuilder)\n\n``` cs    \nvar behaviourTree = FluentBuilder.Create\u003cMyContext\u003e()\n    .Sequence(\"root\")\n        .Do(\"walk to door\", WalkToDoorFunc)\n        .Selector(\"open door sequence\")\n            .Do(\"open door\", OpenDoorFunc)\n            .Sequence(\"locked door sequence\")\n                .Do(\"unlock door\", UnlockDoorFunc)\n                .Do(\"open door\", OpenDoorFunc)\n            .End()\n            .Do(\"smash door\", SmashDoorFunc)\n        .End()\n        .Do(\"walk through door\", WalkThroughDoorFunc)\n        .Do(\"close door\", CloseDoorFunc)\n    .End()\n    .Build();\n```\n\n## Node Types\n\n### Leaves\n\n#### Action\n``` cs    \nbuilder.Do(\"my-action\", context =\u003e BehaviourStatus.Succeeded)\n```\n\n#### Wait\n``` cs    \nbuilder.Wait(\"my-wait\", 3000) // 3 seconds\n```\n\n#### Condition\n``` cs    \nbuilder.Condition(\"my-condition\", context =\u003e true)\n```\n\n### Composites\n\n#### Sequence\n``` cs    \nbuilder.Sequence(\"my-sequence\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### Selector\n``` cs    \nbuilder.Selector(\"my-selector\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### RandomSequence\n``` cs    \nbuilder.RandomSequence(\"my-random-sequence\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### RandomSelector\n``` cs    \nbuilder.RandomSelector(\"my-random-selector\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### PrioritySequence\n``` cs    \nbuilder.PrioritySequence(\"my-priority-sequence\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### PrioritySelector\n``` cs    \nbuilder.PrioritySelector(\"my-priority-selector\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Succeeded)\n    .Do(\"action3\", context =\u003e BehaviourStatus.Succeeded)\n    ...\n.End()\n```\n\n#### SimpleParallel\n``` cs\npublic enum SimpleParallelPolicy\n{\n    BothMustSucceed,\n    OnlyOneMustSucceed\n}\n\nvar policy = SimpleParallelPolicy.BothMustSucceed;\n\nbuilder.SimpleParallel(\"my-parallel\", policy)\n    .Do(\"action1\", context =\u003e BehaviourStatus.Running)\n    .Do(\"action2\", context =\u003e BehaviourStatus.Running)\n.End()\n```\n\n### Decorators\n\n#### Cooldown\n``` cs    \nbuilder.Cooldown(\"my-cooldown\", 4000) // 4 seconds\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### Failer\n``` cs    \nbuilder.AlwaysFail(\"my-failer\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n.End()\n```\n\n#### Succeeder\n``` cs    \nbuilder.AlwaysSucceed(\"my-succeeder\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### Inverter\n``` cs    \nbuilder.Invert(\"my-inverter\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### RateLimiter (Cache)\n``` cs    \nbuilder.LimitCallRate(\"my-rate-limiter\", 1000) // 1 second\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### Repeat\n``` cs    \nbuilder.Repeat(\"my-repeater\", 5)\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### TimeLimit\n``` cs    \nbuilder.TimeLimit(\"my-time-limit\", 5000) // has 5 seconds to complete or will fail\n    .Do(\"action1\", context =\u003e BehaviourStatus.Running)\n.End()\n```\n\n#### UntilSuccess\n``` cs    \nbuilder.UntilSuccess(\"my-until-success\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Failed)\n.End()\n```\n\n#### UntilFailed\n``` cs    \nbuilder.UntilFailed(\"my-until-failed\")\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n.End()\n```\n\n#### Random\n``` cs    \nbuilder.Random(\"my-random\", 0.6) // will call child 60% of the time\n    .Do(\"action1\", context =\u003e BehaviourStatus.Succeeded)\n.End()\n```\n\n#### SubTree\n``` cs    \nbuilder.SubTree(\"my-sub-tree\", otherBehaviourTree)\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feraclys%2Fbehaviourtree","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feraclys%2Fbehaviourtree","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feraclys%2Fbehaviourtree/lists"}