Games104——游戏引擎Gameplay玩法系统:基础AI
这里写目录标题
- 寻路/导航系统Navigation
- Walkable Area
- Waypoint Network
- Grid
- Navigation Mesh(寻路网格)
- Sparse Voxel Octree
- Path Finding
- Dijkstra Algorithm迪杰斯特拉算法
- A Star(A*算法)
- Path Smoothing
- Steering系统
- Crowd Simulation群体模拟
- 群体模拟模型
- 微观方法:基于规则的模型
- 宏观方法
- 综合方法
- 避免碰撞
- 基于力的模型
- 基于速度的模型–速度障碍法
- Sensing环境感知
- 经典决策算法
- 有限状态机(Finite State Machine)
- 层次有限状态机(HFSM)
- 行为树(Behavior Tree)
- 可执行结点
- 控制结点
- 黑板(Blackboard)
AI分为16、17两节课讲,大纲如下:

寻路/导航系统Navigation
- 基本思路:

Walkable Area
需要让ai知道哪些部分可以通过(包含走路、跳、翻越攀爬、载具可过等不同情况,还要考虑物理碰撞)。
其表达方式有Waypoint Network、Grid、Navigation Mesh、Sparse Voxel Octree(空间八叉树)等。每种方式都尤其优缺点,因此游戏经常使用多种方式结合。
Waypoint Network
早期游戏引擎用的多,通过设置道路关键点(如道路两边)并用算法插值关键点得到路网,寻路时先找到距离当前位置和目标位置最近的路网点,再通过路网连通(就像坐地铁一样),如下图:

优点是好实现、效率高,缺点是不方便动态更新、总走路中间
Grid
地图网格化,类似光栅化,如下图:

优点是便于动态更新,缺点是精确度取决于格子大小、存储空间浪费、效率比较低、难以表达层叠结构(比如桥)
Navigation Mesh(寻路网格)
现代游戏引擎最普遍的方法,即把地图上所有可通行的区域连起来(用凸多边形),主要用物理碰撞与预测路线,既可以解决路线僵硬问题,又能应对层叠结构


优点是支持3d、精确、灵活、动态,缺点是生成Navigation Mesh的算法非常复杂,并且只能“寻路”,不能飞机3d空间导航
-
怎么生成Navigation Mesh呢?
现在基本都是自动生成,用一些开源库如recast,voxelization后去计算可通行区域;然后再通过计算离边缘最近的edge voxel,得到一个类似距离场的东西;

再找到每个区域距离边缘最远的中心点,用洪水算法向外扩散,直到覆盖所有区域,在通过进一步处理(比如连通区域变为凸多边形之类,比较复杂),这就是我们的生成的Mesh了

-
Polygon Flag
通过地形标签生成不同区域的mesh

-
Tile
那如果地图在动态变化怎么办,比如路障被用户打掉了。可以使用Tile把地图分块,部分地图更新后只需要重新计划该块tile即可

把空间分成一个个Tile,当Tile改变时只需要更新这个Tile即可 -
Off Mesh Link
建立一些手动的连接点和连接线可以让寻路变得更加复杂,增强拓展性

Sparse Voxel Octree
把空间体素化,通过求交导航。可以表达3d空间的导航,主要用于航空航天游戏。但缺点是存储消耗大
通过八叉树划分空间

Path Finding
以上每种方式都可以把各个几何元素的中心连接为点图,只要找到最短路径即可。

所谓寻路问题主要就是解决两个问题:
- 找到一条起点到终点的道路
- 尽可能的少走弯路
这个过程也有几种算法,比如经典的:
深度优先搜索(Depth-First Search):找到一个分支一直走,如果没有路就退回来,直到走到终点为止(时间换空间)
广度优先搜索(Breadth-First Search):每一个step都向全部子节点扩散一步,直到找到终点(空间换时间)
但以上两种方式都比较费,并且不能计算加权最短路径,所以还需要更多算法帮助:

Dijkstra Algorithm迪杰斯特拉算法
可以解决有权图中最短路径问题,参考这个大佬的文章:图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!
截图自大佬博客:

但是对于游戏来说,有时候并不需要真的“最优路径”,只要按照大致方向走就行了,所以引入了下边的A Star算法
A Star(A*算法)
用的最普遍,是一种启发式算法,通过有选择的节点搜索找到最短路径,因此更快,常用于游戏或机器人导航。
原理是通过计算一个代价函数:f = g(从原点已经走过的路程的代价,一般累计路程距离) + h(到终点还有多远的代价,一般用欧拉距离或x+y),来逐步寻找最优下一步的路径(按照网格或mesh的划分),原理有些类似梯度下降。




Path Smoothing
把无效的运动尽可能踢掉
Funnel Algorithm烟囱算法:类似于人走路时对道路的感知,如下图:


从起始点看向下一个三角形,视野卡在三角形两端,如果能全部在视野中,就继续看下一个三角形,更新视野,直到某一个三角形被挡住一部分时,左边被挡沿左视野边走,右边被挡沿右视野边走;
走到被卡视野的遮挡点后,再重新进行上述过程;
如果迭代过程中发现终点就在视野里时则直接向终点走。
Steering系统
载具的移动受限于它们的移动能力:油门、刹车、转向等,所以经常会在寻路中被障碍物卡死
steer behavior:
- Seek/Flee:包括 追踪、巡逻、流场跟随、路径跟随
- 速度匹配:快到目标点减速,减速到速度为0时刚好到达目标点,比如火箭发射会用到
- 一致性:角速度的加速和减速,比如npc看向主角

Crowd Simulation群体模拟
现在的游戏城市环境交互等越来越丰富,那群体模拟必不可少,比如一群鸽子突然飞走,一群npc四散逃跑等。群体模拟需要做到:避免碰撞、成群的来回移动(Swarming)、编队运动(motion in formation)
群体模拟模型
群体模拟模型大致有三种:
微观方法(Microscopic):自底向上的定义每个个体的行为,合起来就组成了群体行为。
宏观方法(Macroscopic):定义群体宏观的运动趋势,所有个体按照该趋势移动。
综合方法(Mesoscopic):将群体分组。既有宏观的趋势,也有微观的个体行为。
微观方法:基于规则的模型
比如动物的群体动力学,用简单规则控制每个个体的运动:
- 分离(Separation):避开自己的所有“邻居”(斥力)
- 凝聚性(Cohesion:朝向群体的“质心”移动
- 一致性(Alignment):和邻近的对象朝向同一个方向移动

好处是规则简单,坏处是宏观上是不可控且不怎么受人影响。
宏观方法
从宏观的角度模拟人群的运动,通过设置可通行区域和有势场或流体力学的控制运动,类似粒子系统运动?

综合方法
结合了宏观和微观方法,把群体分为很多小组,每组分别运动,同时组里的个体也有一点自己的区别。比如红警里圈出一群小兵运动时就是这样。

避免碰撞
这部分如果给ai做效率非常低,所以需要用一个碰撞系统帮助ai决策
基于力的模型
相当于使用距离场给障碍物增加一个反向力

好处:可以被拓展去模拟更慌乱的人群的行为。
坏处:类似于物理模拟,模拟的步骤应该足够小。
基于速度的模型–速度障碍法
类似人眼处理方式:当两个物体在同一速度线上行走,就都靠左边避让一点。

当参与的对象不止两个时,A 对 B 的避让可能又会影响到 C。所有需要做一些优化:Optimal Reciprocal
Velocity Avoidance(ORVA)。其数学复杂度非常高,不过实际中也会用基于力的方式替代(结果没那么丝滑但能用)

Sensing环境感知
对世界的感知是我们和ai决策的依据,感知分为内部和外部信息:
内部的信息包含位置、血量、护甲状态、增益状态、可以被自由获取的东西等等;外部的信息包含静态空间信息如Tactical Map战术地图、掩体等和动态信息如influenceMap人群热力图、视角图、游戏物体等。

这些非常类似人类对世界的感知(并不是上帝视角),有视觉、听觉并随距离衰减,有活动范围、视野等,但如果感知太多会影响性能,因此一般会取舍几个,并范围内共享信息

经典决策算法
经典决策算法有:
有限状态机(Finite State Machine)
行为树(Behavior Tree):AI最核心的体系
层次任务网络(Hierarchical Tasks Network)
目标驱动的行为计划系统(Goal Oriented Action Planning)
蒙特卡洛搜索树(Monte Carlo Tree Search)
深度学习(Deep Learning)
有限状态机(Finite State Machine)
根据一些条件转换(Transition)一个状态到其他状态

比如吃豆人的状态机示例:

好处:容易执行、容易理解、对于简单例子,应对起来非常快
坏处:可维护性差,特别是添加和移动状态;重用性差,不能被应用于其他项目或角色;可扩展性差,很难去修改复杂的案例
层次有限状态机(HFSM)
把状态机分为很多层或模块,每个状态机之间有相互的接口,复杂度可控;虽然能部分解决上述问题,但是会造成一定的性能下降,难以跳模块,反应速度也会下降。15年前的很多游戏就是这么做的,属于“古老”的方法。

行为树(Behavior Tree)
行为树和人的思考类似,例如 人碰到一个敌人,会根据自己的状态来选择追击还是撤退。(一些复杂的商业决策也有类似决策树的逻辑)

可执行结点
分为条件节点和动作节点
条件结点可以立马执行完,而行为结点有一定过程,例如追鬼,首先得有寻路系统,然后还需要转向系统。行为也分为正在进行和失败等几种状态。

控制结点

-
Sequence 顺序执行,&&:从左到右便利子节点,如果某个子节点返回 Failure 就停止整个行为,或者时所有子节点都成功执行,返回 Success,并执行该行为。

-
Selector 条件执行,||: 根据条件尝试所有子节点,一旦某个子节点 满足条件,立马作出该决策。

-
Parallel并行执行 :一个 AI 体可以同时进行多个行为,例如对于射击游戏来说可以同时进行移动和射击。
-
Decorator装饰节点:起修饰作用,例如循环执行、执行一次、计时器、定时等。

注意行为树tick更新时要每一帧都从根节点开始判断,这一点上也可以优化为正常从上一帧的节点继续,但某些优先级高的event会更新整棵树。

黑板(Blackboard)
用于记录行为状态,用于把数据与逻辑分离

-
行为树的好处:
模块化、层级组织(每个子树可以被看作是一个模块)
可读性高
容易维护,并且修改只会影响树的一部分
反应快,每个 tick 会快速的根据环境来改变行为
容易 Debug,每个 tick 都是是一个完整的决策。 -
行为树的坏处
如果不优化,每个 tick 都从根节点触发,会造成更大的开销
反应性越好,条件越多,每帧的花销也越大
QA
行为树和if else有什么区别:if else就是最简单的行为树,行为树类似goto、jump等语言指令
ai如何从环境中提取数据(感知):环境数据类型多数量多,其实很难读取,可以用引擎中的反射等技术解决;ai提取数据时效率其实不高,需要对感知做规划和指令
如何处理垂直邻面的NavMesh生成?根据高度设置为断开的悬崖或是可通过的障碍,如果可以攀爬另说
原文链接:
相关文章:
Games104——游戏引擎Gameplay玩法系统:基础AI
这里写目录标题 寻路/导航系统NavigationWalkable AreaWaypoint NetworkGridNavigation Mesh(寻路网格)Sparse Voxel Octree Path FindingDijkstra Algorithm迪杰斯特拉算法A Star(A*算法) Path Smoothing Steering系统Crowd Simu…...
stm32生成hex文件详解
1.产生的map文件干啥的? 2.组成情况??? 废话少说,直接上代码具体内容况: Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601]Section Cross Referencesstartup_stm32f103xe.o(S…...
【Windows 开发NVIDIA相关组件】CUDA、cuDNN、TensorRT
目录 1. 安装 CUDA Toolkit 2. 安装 cuDNN 3. 安装 Zlib 4. 安装 TensorRT 5. 安装 TensorRT Python 包[c++项目不需要] 6. 安装 ONNX GraphSurgeon 包[c++项目不需要] 1. 安装 CUDA Toolkit 从 CUDA ToolkitArchive 下载对应版本的离线安装包,以 11.7 版本为例。 打开安…...
AI大模型(二)基于Deepseek搭建本地可视化交互UI
AI大模型(二)基于Deepseek搭建本地可视化交互UI DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测,其社区热度指数暴涨、一跃成为近期内影响力最高的话题,这个来自中国团队的模型向世界证明:让每个普通人都能拥有媲…...
各种协议设计
这些设计问题背后的核心本质可以总结为以下几个关键原则,我将结合不同领域为您系统讲解: 一、核心设计原则(本质层面) 抽象与分层 本质:将复杂系统分解为不同层次的抽象(物理层/逻辑层/业务层)…...
DockerFile详细学习
目录 1.DockerFile介绍 2.DockerFile常用指令 3.指令详细讲解 4.实例 构建Node-Exporter 构建Alertmanager 构建Mariadb 1.DockerFile介绍 什么是 Dockerfile? Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。 Dockerfile 是一…...
Windows Docker笔记-简介摘录
Docker是一个开源的容器化平台,可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中,然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势: 1. 容器 容器是一个轻量级、独立的运行环境,包含了应用程…...
TeamSpeak开黑频道加入 —— 点歌机器人 (细致讲解100%学会)
文章目录 前言:搭建Ubuntu云服务器选择服务器:打开防火墙(前置工作):下载Xshell 连接: 创建机器人工作路径创建新用户teamspeak:升级新用户teamspeak的访问权限:切换为teamspeak用户并为机器人创建文件夹: 下载机器人本体安装依赖库:下载TS3…...
2025简约的打赏系统PHP网站源码
源码介绍 2025简约的打赏系统PHP网站源码 源码上传服务器,访问域名/install.php安装 支持自定义金额打赏 集成支付宝当面付 后台管理系统 订单记录查询 效果预览 源码获取 2025简约的打赏系统PHP网站源码...
网络安全 | 零信任架构:重构安全防线的未来趋势
网络安全 | 零信任架构:重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…...
JavaScript系列(62)--实时通信系统实现详解
JavaScript实时通信系统实现详解 🔄 今天,让我们深入探讨JavaScript的实时通信系统实现。实时通信是现代Web应用中不可或缺的一部分,它能够提供即时的数据交互和更好的用户体验。 WebSocket通信基础 🌟 💡 小知识&am…...
【蓝桥杯嵌入式】2_LED
1、电路图 74HC573是八位锁存器,当控制端LE脚为高电平时,芯片“导通”,LE为低电平时芯片“截止”即将输出状态“锁存”,led此时不会改变状态,所以可通过led对应的八个引脚的电平来控制led的状态,原理图分析…...
代码随想录day06
242.有效的字母异位词 刚学哈希表想着使用unordered_set来实现,结果无法通过,原因是对字母异位词理解有问题,字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。对字母出现的次数有要求&am…...
Spring @PropertySource:让你的应用配置更加模块化和可维护
PropertySource注解在Spring中的作用,就像是给Spring应用配了一个“外部配置箱”。 想象一下,你在开发一个Spring应用时,有很多配置信息需要设置,比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…...
【Java】MyBatis动态SQL
在MyBatis中使用动态SQL语句。 动态SQL是指根据参数数据动态组织SQL的技术。 生活中的案例: 在京东上买东西时,用户搜索商品,可以选择筛选条件,比如品牌,价格,材质等,也可以不使用筛选条件。这时…...
旅行社项目展示微信小程序功能模块和开发流程
旅行社当前旅游线路的程序(微信小程序),旨在帮助旅行社更高效地管理线下活动预订,同时为客户提供便捷的报名和查看功能。适用于短途游、团队建设等活动,支持在线预订、缴费及订单管理,可根据用户需求定制更多个性化服务,为公司提升品牌知名度与客户体验。通过简洁明了的…...
litemall,又一个小商场系统
litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端 代码地址:litemall: 又一个小商城。 litemall Spring Boot后端 Vue管理员前端 微信小程序用户前端 Vue用户移动端...
WGCLOUD监控系统部署教程
官网地址:下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库: sudo yum install -y epel-release 2、安装 OpenJDK 11: sudo yum install java-11-openjdk-devel 3、如果成功,你可以通过运行 java …...
Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 比赛信息管理 看板展示 系统管理 摘要 本文使用Python与…...
(苍穹外卖)项目结构
苍穹外卖项目结构 后端工程基于 maven 进行项目构建,并且进行分模块开发。 1). 用 IDEA 打开初始工程,了解项目的整体结构: 对工程的每个模块作用说明: 序号名称说明1sky-take-outmaven父工程,统一管理依赖版本&…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
