cocos creator主程入门教程(十一)—— 行为树

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑。本系列文章以TypeScript为介绍语言。

本篇介绍行为树。在RPG游戏中,地图上存在一些剧情NPC,不同的剧情下,NPC的行为会不一样。这些NPC的行为可以通过行为树进行管理。行为树是在固有行为集下,进行行为抉择的AI算法。行为树包括数据解析、逻辑控制、行为执行三部分。

行为树数据由节点组成,每个节点有对应的行为类型、参数、返回值。节点有一个子节点数组,通过这种方式将节点组织成树状。

export class BehaviorNode {
    private type: number = 0;
    private params: any = null;
    private retVal: any = null;
    private subBehaviors: Array<BehaviorNode> = [];
}

  

逻辑控制节点都有子节点,逻辑控制指的是跟编程类似的if条件判断、while循环、串行执行、并行执行等。if行为如果返回true,执行子节点行为,子行为结束则整体行为结束。while行为如果返回true,执行子节点行为,如果子节点结束,重置子节点重新执行。串行行为,子节点一条一条的依次执行,子节点结束则整体结束。并行行为,子节点同时执行,子节点结束则整体结束。

行为树的叶节点是实际行为执行的节点,在开发一款RPG游戏时,需要根据剧情需要,提炼出角色的细粒行为,例如行走、对话、播放表情、切换动画、触发战斗等。一般地,RPG都会开发一个对应的剧情编辑器,对地图上的NPC进行行为设定,导出对应行为的参数。游戏加载这些数据,解析生成行为树,NPC每帧执行行为树,叶节点行为有对应的执行方法,方法的参数为行为节点的参数。

private _parseWalkData(): BehaviorNode {
    // TODO 二进制数据解析为json
}

  

public execBehavior(b: BehaviorNode): void {
    if (!b) {
        return;
    }

    switch(b.type) {
        case BehaviorType.WALK:
            this.execWalk(b);
            break;
    }
}

  

private _execWalk(b: BehaviorNode): void {
    let actorId = b.params.id;
    let destGridX = b.params.destGridX;
    let destGridY = b.params.destGridY;

    let actor = map.getActor(actorId);
    let curGridX = actor.gridX;
    let curGridY = actor.gridY;
    let loadGrids = AStar.findLoad(curGridX, curGridY, destGridX, destGridY);
    actor.setLoad(loadGrids);
}

  

一般地,游戏地图中的物件都可以挂载行为树,地图本身、角色、地图物品等,将一个剧情的复杂行为,分拆到每一个地图物件上,通过剧情任务作为条件区分触发,简化行为的组织。程序员只负责将策划的设定提取出细粒行为,编写对应的数据解析和执行方法,由策划使用编辑器编辑数据,由数据驱动剧情的推进。

行为树先说到这里,下一篇我们将介绍有限状态机。

原文地址:https://www.cnblogs.com/niudanshui/p/10464786.html

时间: 2024-08-30 14:10:56

cocos creator主程入门教程(十一)—— 行为树的相关文章

cocos creator主程入门教程(一)—— 初识creator

四邑隐侠,本名关健昌,10年游戏生涯,现隐居四邑.本系列文章以TypeScript为介绍语言. 我们在cocos creator新建一个Hello TypeScript项目,都会有一个assets/Scene/helloworld.fire文件.使用cocos creator开发游戏时,项目可以只有一个.fire文件.一般地,我会把这个文件夹改名为assets/scene,下面只有main.fire文件:assets/scene/main.fire. 双击main.fire文件,在层级管理器可以

cocos creator主程入门教程(五)—— 日志系统

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍日志系统的设计.一般我们开发一个demo,只会简单的用cocos提供的cc.log打印下日志,方便调试功能.但是要开发一个商业项目,还要考虑怎么收集日志,方便产品上线后定位线上问题.如果线上产品运行出异常时能把当时的上下文日志发到一个文件服务器,有利于分析异常的原因.例如如果有通信数据日志,可以先判断是后端返回数据异常,还是前端逻辑出问题.因此,我会在项目里设计一个统一的日志系统,游戏里所有

cocos creator主程入门教程(四)—— 网络通信

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 前面已经介绍怎样加载资源.管理弹窗.开发一个网络游戏,难免要处理网络通信.有几点问题需要注意: 1.服务端为了快速开发可能前期使用http通信,后面再改成websocket/socket. 2.同时存在http和websocket/socket通信 3.通信数据格式可能需要随时替换为json或protocol buffer,可能需要添加额外头部. 4.在新手引导里使用本地数据做模拟,请求不需要发送给后

cocos creator主程入门教程(八)—— 代码结构

五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇简单介绍下代码结构,清晰的代码结构更有利于团队对项目的理解和维护. 1.前面我们介绍了一系列基础功能封装,这部分内容可以被不同的游戏重用.这一部分代码都可以放到framework目录下. 2.游戏业务代码统一放到game目录下 3.平台sdk接入代码放到channel目录下 4.数据上报的sdk接入代码放到report目录下. StartCtrl是项目的入口,负责项目的初始化,包括渠道sdk.数

RabbitMQ入门教程(十一):消息属性Properties

原文:RabbitMQ入门教程(十一):消息属性Properties 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78698364 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 发送消息可以为消息指定一些参数 Delivery mode: 是否持久化,1 - Non-persistent,2 -

Go语言入门教程(十一)

原创: IT干货栈 Hello,各位小伙伴大家好,我是小栈君,昨天讲了关于go语言的函数的定义和自定函数的部分种类,我们今天接着上期所讲的内容继续进行分享. 一.函数之无参有返回值 有返回值的函数,必须有明确的终止语句,否则会引发编译错误.所以在有返回值的函数中需要使用关键字 return . 他可以是一个或者多个返回值.官方建议:最好命名返回值,因为不命名返回值,虽然使得代码更加简洁了,但是会造成生成的文档可读性差. //方式1 func Test01() int { return 250 }

Webpack入门教程十一

60.htmlwebpackplugin插件的配置-title的使用,修改webpack.config.js文件,修改的内容如下 var webpack = require('webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry:  __dirname + "/app/Greeter.js", output: { path: __dirname + &quo

Java入门教程十一(异常处理)

在程序设计和运行的过程中,发生错误是不可避免的.尽管 Java 语言的设计从根本上提供了便于写出整洁.安全代码的方法,并且程序员也尽量地减少错误的产生,但是使程序被迫停止的错误的存在仍然不可避免.为此,Java 提供了异常处理机制来帮助程序员检查可能出现的错误,以保证程序的可读性和可维护性 异常(Exception) 异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类.错误可能产生于程序员

Cocos Creator 从“新手引导”到“自动化测试”

手新引导框架,自动化测试框架,先看一段视频: 点击此处观看视频 https://www.bilibili.com/video/av60001770/ 在线预览体验 http://example.creator-star.cn/demo-ui-autorun 注意,在电脑上预览才能体验自动引导功能! Shawn 刚开始只是为了完成新手引导功能点,同时要求引导代码要做非***式,尽量对游戏代码零干扰. 1. 步骤指令 当引导框架完成后,发现引导的配置工作效率低下,非程序员非项目程序员,上手困难,于是