cocoscreator中使用行为树(BehaviorTree)一

cocoscreator中使用行为树(BehaviorTree)一

2023年6月22日发(作者:)

cocoscreator中使⽤⾏为树(BehaviorTree)⼀cocos creator中使⽤⾏为树(BehaviorTree) ⼀前提:1. 本⽂使⽤的cocos creator版本是1.10.2, 由于creator每个版本都有⼀些兼容性的坑, 所以还请⼤家与我的版本保持⼀致.2. 本⽂全部使⽤Typescript编写.3. 我也是第⼀次使⽤⾏为树制作游戏ai, 本⽂是⾃⼰学习的, 写的不对的, 望⼤家海涵!⾸先感谢论坛⼤佬提供的⾏为树可视化制作插件, 附.开始编写... 啦啦啦⾏为树可视化制作插件的使⽤我就不讲了, 论坛讲的很清楚, 但是有⼀点很重要, 我使⽤1.10.2版本按照论坛的⽅法操作会报错,

解决⽅法: 打开⽂件, 找到var Composite = (b3.z), 将其改为var Composite=(de);问题解决那么我们开始⾏为树第⼀个AI, 称为monsterSimple. 他的功能是 ⼀旦敌⼈靠近到⼀定范围, ⽴即发出警告!打开cocos creator, 按照论坛的⽅法操作后, 我们拥有了这两个脚本我们之后在说, 先把player(我们控制的对象)搞出来建⽴⼀个新场景,取名GameScene..

创建结点player, 红⾊那个turn表⽰玩家当前的朝向,创建控制脚本PlayerCtlimport GameScene from "./GameSCene"const {ccclass, property} = cc._decorator;@ccclassexport default class NewClass extends ent { direction = 0; // 当前状态 -1表⽰向左, 1表⽰向⽤, 0表⽰不动 faceTo = 1; // 当前⾯向 speed = 100; gameCtl: GameScene = null; // onLoad () {} start () { } init(gameCtl: GameScene) { l = gameCtl; } /** * 设置玩家⽅向 * @param dir

*/ setDirection(dir: number) { ion = dir; = dir == 0 ? : dir; = ; } /** * 更新玩家位置 * @param dt

*/ playerUpdate(dt: number) { if(ion == 0) { return ; } .x += ion * dt * ; }}就是⼀些简单的设置, 简单的控制player结点左右移动另附上GameSceneimport PlayerCtl from "./PlayerCtl";import { PlayerDir } from "./GameInterface";const {ccclass, property} = cc._decorator;/** * ⼀个简单的样例, ⽤于学习⾏为树AI * 怪物1, 默认在⼀段位置内巡逻, ⼀旦发现⽬标(玩家), 则发动攻击 */@ccclassexport default class GameScene extends ent { @property(PlayerCtl) // 到编辑器, 把player结点拖过来, 当然要先把playerCtl绑在结点上 playerCtl: PlayerCtl = null; onLoad() { (_DOWN, own, this); (_UP, p, this); } start () { (this); aviorTree(); } onKeyDown(event: any) { switch(e) { case : case .a: ection(); break; case : case .d: ection(); break; } } onKeyUp(event: any) { switch(e) { case : case .a: case : case .d: ection(); break;

} } onDestroy() { (_DOWN, own, this); (_UP, p, this); }

update(dt: number) {

// aviorTree(); Update(dt); }

}浏览器运⾏, 现在就可以通过左右键(或者a/s键)控制玩家左右移动.那么现在开始进⼊正题建⽴⼀个monster结点把BehaviorTree脚本挂在该结点上点击编辑, 打开⾏为树编辑⼯具恩, ⼀个简单的树搞定, 简单说⼀下这个树的⼯作流程, 单纯是⾃⼰理解的, 可能不对每次⾏为开始, 即被调⽤的该⾏为树(BehaviorTree)(我们这就是指monster上挂的BehaviorTree脚本)的tick⽅法先进⼊root(这个并不是必要的), 在进⼊(Look)结点(顺序由上到下), 在Look结点判断玩家(player)是否进⼊monster的监视范围内如果进⼊了, 那么return SUCCESS, 否则return FAILURE, 如果是SUCCESS, 那么继续向下执⾏, 进⼊Attack结点, 执⾏对应的攻击逻辑⼤概就是这么⼀个流程, 开始敲新建Look脚本, Attack脚本const {ccclass, property} = cc._decorator;@ccclassexport default class NewClass extends ent { // LIFE-CYCLE CALLBACKS: // onLoad () {} start () {

} enter (tick,b3,treeNode){ ("enter"); } open (tick,b3,treeNode){ ("open"); } tick (tick,b3,treeNode){ ("tick"); } close (tick,b3,treeNode){ ("close"); } exit (tick,b3,treeNode){ ("exit"); } // update (dt) {}}两个脚本是⼀样的, 这⾥就放了⼀个对了, 我们还没编辑Look 的监视范围, 在打开可视化编辑⼯具点击Look结点添加⼀个参数, 名字是radio, 值为15, 这个15就是监视范围, 具体数值我们之后在调整保存之后, 回到代码编辑页⾯因为我们需要实时的知道玩家的位置, ⽤于确认玩家和敌⼈的距离(我们这⾥只计算x轴)在playerCtl中添加getPosition⽅法getPosition() { return on; }现在就是让我们在Look脚本中获取玩家位置了, 但是我还没想好怎么⽅便的获取, 这个留到下次, 这次我们⽤个垃圾⽅法在Look脚本中@property(PlayerCtl) // 获得玩家playerCtl: PlayerCtl = null;修改tick⽅法tick (tick,b3,treeNode){ let radio = ; let playerX = ition().x; if((playerX - .x) < radio) { s("发现你啦!"); return S; }else { s("敌⼈"); return E; } }setTips(str: string) { ldByName("str").getComponent().string = str; }恩, 刚刚测试了⼀下, 监视范围设置15太⼩了, 我改成200了, 不改也⽆所谓, 提⼀下回到GameScene中现在的问题就是如何让敌⼈不断的思考, 以及设置敌⼈思考的时间间隔添加⽅法runBehaviorTreerunBehaviorTree() { ponent("BehaviorTree").tick();}在update中调⽤该⽅法update(dt: number) {

aviorTree(); Update(dt); }那么现在是每过⼀帧, 思考⼀次全部写完, 看看效果

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687383426a5980.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信