Unity3D人工智能编程精粹

1、运动层、决策层、战略层。

  运动层、决策层包含的算法是针对单个角色的,战略层是针对小队乃至更大规模群体的。

  导航寻路是运行层的主要任务。

  决策层决定角色下一时间步该做什么。

  感知(Sense)-> 思考(Think)-> 行动(Act)。

2、通过产生一定大小、方向的操控力,使角色以某种方工运动。Unity3d提供的开源库 UnitySteer 可以快捷地实现操控行为。

3、如果游戏的决策系统不是很复杂,只要利用 FSM 就可以实现。在处理大规模的问题时,FSM很难复用、维护、调试。行为树层次清晰,易于模块化,简洁高效。

4、每一个物体拥有 position、mass、velocity、orientation。以及 max_force、max_speed。

  这个物体位置的计算方法:

  1)确定每一帧的当前操作力(最大不超过max_force)。

  2)除以交通工具的质量mass,可以确定一个加速度。

  3)将这个加速度与原来的速度相加,得到新的速度(最大不超过max_speed)。

  4)根据速度和这一帧时间,计算出位置的变化 。

  5)与原来的位置相加,得到新位置。

    

5、Vehicle类。一个物体可以受到多个操作力。,每个操作力有各自的weight。

  注意 steering_force 是一个向量:

        

  分别有以下类型的个体操作行为:

    

6、AILocomotion 中速度的计算。注意 moveDistance是向量。

  

  通过 slerp 防止方向大幅抖动。  

  

7、操作向量是预期速度与当前速度的差。

  

8、1)SteeringForSeek。

  

  

9、2)SteeringForFlee。与Seek相比,多了fearDistance,另外DesiredVelocity速度相反。

  

10、3)SteeringForAttrive。以Target为中心,圆外径直冲向Target,圆内减速。

  注意:以下代码,应当对 desiredVelocity进行限速。

  

11、4)SteeringForPersuit。目标不再是静态物体,而是会移动的物体。

  当距离很近时,直接冲向目标。当距离较远时,需要预测在哪个postion,可能追上Target。

  注意:不是追逐Target下一帧的位置,而是追逐预测的相遇点的位置。

  

12、5)SteeringForEvade。预测目标将在哪个positon追上自己,然后给一个相反方向的力。

    注意:以下 lookaheadTime 代表的是最快可能追上的时间。

  

13、6)SteeringForWander。

    随机瞎逛,一种通常的做法是,每隔几秒随机一个目标位置,让角色奔向这个位置。这种做法存在角色突然调头的问题,体验不是很好。

    

  

14、7)SteeringForPath(路径跟随)。路点半径,当角色距离目标点多远时认为已经达到,从而继续向下一个路点前进。

  

15、8)SteeringForAvoidance。只躲避最近的障碍物。

  

  avoidance_force = ahead - obstacle_center。

  注意:下面代码使用 Physics.Raycast 进行碰撞检测,并未使用 Half Ahead方法。

    

16、群体行为。

  

17、SteeringForSeparation.cs

  

18、SteeringForAlighment。

  

19、SteeringForCohesion。

  

游戏AI技术的更多相关文章

  1. 游戏AI技术 2

    [Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...

  2. 常见的游戏AI技术对比(FSM,HFSM,BT,GOAP,HTN,Utilitay,机器学习)

    最近研究的内容,比较懒还没写文章,先占个坑,过几天补

  3. 游戏AI之初步介绍(0)

    目录 游戏AI是什么? 游戏AI和理论AI 智能的假象 (更新)游戏AI和机器学习 介绍一些游戏AI 4X游戏AI <求生之路>系列 角色扮演/沙盒游戏中的NPC 游戏AI 需要学些什么? ...

  4. 游戏AI之路径规划(3)

    目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...

  5. 游戏AI之决策结构—有限状态机/行为树(2)

    目录 有限状态机 行为树 控制节点 条件节点 行为节点 装饰节点 总结 额外/细节/优化 游戏AI的决策部分是比较重要的部分,游戏程序的老前辈们留下了两种经过考验的用于AI决策的结构: 有限状态机 行 ...

  6. IBM沃森会成为第一个被抛弃的AI技术吗?

    作者|William Vorhies 译者|姚佳灵 编辑|Debra 导读:IBM 的沃森问答机(Question Answering Machine,简称 QAM),因 2011 年参加综艺节目&l ...

  7. 游戏AI玩伴,是“神队友”还是“猪队友”?

    “一代英豪”暴雪迎来了自己的暴风雪. 2月13日,动视暴雪公布了2018年全年财报.财报显示,暴雪第四季度营业收入仅为28.4亿美元,低于华尔街分析师预期的30.4亿美元.在公布了财报业绩后,该公司又 ...

  8. 王亮:游戏AI探索之旅——从alphago到moba游戏

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云加社区技术沙龙 发表于云+社区专栏 演讲嘉宾:王亮,腾讯AI高级研究员.2013年加入腾讯,从事大数据预测以及游戏AI研发工作.目前 ...

  9. 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

随机推荐

  1. Win/Lin 双系统时间错误的调整 (转)

    Win/Lin 双系统时间错误的调整 http://jingyan.baidu.com/article/154b46317b25ca28ca8f41e8.html | 浏览:1070 | 更新:201 ...

  2. 20165205 2017-2018-2 《Java程序设计》实验二 Java面向对象程序设计

    20165205 2016-2017-2 <Java程序设计>实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UM ...

  3. uva-317-找规律

    无耻的抄袭了结果,三组数,从每一组数中选取一个数组成正六边形的对边,总共会有27个正六边形,从27个小六边形中选取19个组成大六边形,求大六边形的最大值 #include<iostream> ...

  4. 49.纯 CSS 创作一支诱人的冰棍

    原文地址:https://segmentfault.com/a/1190000015257561 感想:重点在让色彩滚动起来->background-position: 0 1000vh; HT ...

  5. MFC 如何在一个窗体中嵌套在另一个窗体中

    其中的一个方法是讲子窗体设置为非模式对话框,具体操作为 :设置子窗体的border属性为none,style为 child. 在父窗体中需要用create来实现,具体例子如下. 在父窗体的OnInit ...

  6. 数电——全减器分析(用74HC138设计提示)

    -1=1(即Di=1). Di=(Y1' * Y2' * Y4' * Y7')'可以得到74HC138来表示,(注意:Ai,Bi,Ci-1的各自位权对应A2,A1,A0) Ci同理可得.

  7. c#调用带输出参数的存储过程

    sql server中编写一个存储过程: CREATE PROCEDURE ProGetPWD @username varchar(20), @password varchar(20) OUTPUT ...

  8. QtCreator中F1帮助不能使用的解决方法

    环境:ubuntu11.04 在Qt中按F1跳转帮助是一个很方便的东东,点击左边的Help图标也是一样的功能.我今天遇到的问题是F1跳转出错,找不到文档: “No documentation avai ...

  9. iframe+form上传文件

    <iframe id="iframe1" name="ifra1" style="display: none"></ifr ...

  10. span标签 宽度无效解决方案

    完美的解决方案 下 面代码的CSS定义完美解决了span的宽度设置问题. 由于浏览器通常对不支持的CSS属性采取忽略处理的态度, 所以最好将display:inline -block行写在后面,这样在 ...