Unity 初级AI躲避障碍物

1.引言

阅读《Unity Game AI programming 》第6章后,感觉躲避障碍物算法不是很给力。为了研究和学习Unity,自己改良躲避障碍物的算法。当然,代码没有优化,不过没关系,抛砖引玉,记录思想,学习交流。

2.与原书算法相比变化:

1.启用物理引擎,使用速度和力解决问题。而不是使用的角度和位置

2.加入沿着障碍物行走,即使障碍物宽度很大或物体向障碍物前进的速度过快,也不会发生穿墙而过现象。

3.为配合沿着障碍物行走,并且显得更自然,引入三个速度与障碍物的交互分区。

3.分享一下源码:

public void AvoidObstacles (ref Vector3 dir)
		{
				RaycastHit hit;

				//Only detect layer 8 (Obstacles)
				int layerMask = 1 << 8;

				//Check that the vehicle hit with the obstacles within it's minimum distance to avoid
				//print (transform.forward);

				//障碍物交互区
				if (Physics.Raycast (transform.position, rb.velocity, out hit, minimumDistToAvoid, layerMask)) {
						alongWall = false;
						Vector3 hitNormal = hit.normal;
						hitNormal.y = 0.0f; //Don't want to move in Y-Space
						disToAvoid = hit.distance;

						//[5-minimumDistToAvoid]排斥区
						if (disToAvoid > 5) {
								print ("排斥区");
								if (rb.velocity.sqrMagnitude > 100)
										rb.AddForce (hitNormal * 10);
						}

						//[2-5.0]牵引区
						else if (disToAvoid > 2f) {
								print ("牵引区");
								rb.AddForce (Vector3.Cross (hitNormal, Vector3.up).normalized * 5);
								//return;
						}
						//[0,2]平行区
						else {
								print ("平行区");
								alongWall = true;
								rb.velocity = Vector3.Cross (hitNormal, Vector3.up).normalized * 10;
								alongHitNormal = -hitNormal;
								//return;
						}

				}
				//目标交互区
				else if (Physics.Raycast (transform.position, dir, out hit, Vector3.Distance (transform.position, targetPoint), layerMask)) {

						if (alongWall) {

								if (!Physics.Raycast (transform.position, alongHitNormal, out hit, 2.0f, layerMask)) {
										print ("脱离平行区,开始转向");

										rb.AddForce (dir * 10);
								}
						}
						else if(hit.distance>minimumDistToAvoid){
							print("正常");
							rb.velocity=dir*8;
						}

				} else {
					print ("畅通无阻");
					rb.velocity = dir * 10;

				}

		}

这个算法依旧存在缺陷,最大问题是运算量较大,并且细节不够丰富,导致物体移动行为不自然。

4.算法详细描述:

当逐渐逼近障碍物时,首先进入排斥区,对移动物施加障碍物平面法线方向的斥力。再次逼近改为施加平行于障碍物平面的引导力。若再次逼近则将移动物体的速度直接更改为平行于障碍物平面的速度。平行于障碍物平面的速度是用向量叉乘求得的,并且遵守左手坐标系。

当物体沿着障碍物移动时,则不做任何事情,直到脱离障碍物,开始施加向目标点力。若物体没有沿着墙壁前进,并且通向目标一定范围内没有障碍物。则直接更改速度。

若发现目标点畅通无阻则直接更改速度向其前进。

5.注意事项:

把此段代码引入到原书项目中,可test效果。有一个问题需要注意一下,由于移动物体时存在体积的,所以单纯以物体position进行射线检测会在拐角处发生碰撞,为了简化问题,开启移动物体isTrigger选项。

时间: 2024-10-09 18:23:02

Unity 初级AI躲避障碍物的相关文章

基于tensorflow的躲避障碍物的ai训练

import pygameimport randomfrom pygame.locals import *import numpy as npfrom collections import dequeimport tensorflow as tf # http://blog.topspeedsnail.com/archives/10116import cv2 # http://blog.topspeedsnail.com/archives/4755score = 0BLACK = (0, 0,

Unity Rain Ai 插件基本使用(一)

1.下载安装Rain 插件 原先可以在unity的Asset Stroe 下载到,但是现在Rain 的开发公司因为人工智能的发展,公司得到投资,所以下架了rain插件. 所以我给出网盘链接 链接:https://share.weiyun.com/5BKFvOn 密码:wsikw8 链接失效请联系我. 2.向指定目标移动 导入后可以看到在顶部已经有了RAIN 创建一个地板和一个Ai对象如图: 选择要操作的Ai对象,创建AI子物体 我们可以看到AI自物件上有这么一个组件 参数如下: AI:当前这个r

Unity 怪物AI

using UnityEngine; using System.Collections; public class moster_AI : MonoBehaviour { public const int AI_Null = 10;     public const int AI_Idle = 0;     public const int AI_Patrol =1;     public const int AI_Pursuit =2;     public const int AI_Atta

[Unity插件]AI行为树使用总结

参考链接: https://blog.csdn.net/linxinfa/article/details/72937709 https://blog.csdn.net/wanghaodiablo/article/details/52587364 https://blog.csdn.net/q414620221/article/details/78596732 0.节点 一般情况下,只需要扩展Conditional和Action这两种节点即可,Decorator和Composite节点只需要使用内

总结Unity 初学者容易犯的编译与运行时错误

最近在教授Unity 初级课程的时候,经常被学生问及一些非常简单的Unity 出错信息如何解决的问题.我就想这些问题是否可以总结一下,给大家一张易错清单我的工作量是否可以大量减轻呢? 对! 说做就做,以下是我总结的部分内容. 问题1: 当脚本添加游戏对象过程中,弹出的出错窗口: "Can't add script....." ?解答:       原因是Unity 规定脚本的文件名称必须与类名相同,否则报错.请更改Unity脚本的名称或者类的名称. 问题2:       在学生学习导航

Understanding Steering Behavior: Collision Avoidace(行为控制之:碰撞躲避)

原文链接:http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-collision-avoidance--gamedev-7777 介绍 进行碰撞躲避的方法实际上非常的简单,就是在我们检测到"将要"和一个碰撞物相撞的时候,我们产生一个躲避的力来避免进行碰撞.记住,我们仅仅使用一个最近的障碍物来计算躲避的力,就算有很多的障碍物,这样的算法同样能够很好的运行. 所以可以看出,这个算法就需

左右躲避障碍-神手ts版本

TypeScript-左右躲避障碍-神手 学习typescript,第一步应该是学习官方文档,理解最基础的语法.第二步开始用typescript实现一些js+css 或者canvas类型的游行.现在开始我们用ts写跳一跳 前言: 最近微信小程序里面,出现了一个左右手躲避障碍物的游戏:神手.玩了一下觉得很有意思,决定用typescript写一版. 核心点: 1.识别手势动作:双指同时点击,单指随机放开 2.障碍物的成对生成. 3.动画帧的优化 游戏截图 Typescript脚本: 1 //1.创建

安全进化的终极猜想— 以“AI之盾”对抗“AI之矛”

今年的"3.15晚会"给我最大的震撼就是AI机器人带来的负面问题,40亿骚扰电话播出,每天播出5000个,一年拨出40亿个,设备日活跃量5000多台,在使用设备数量超过3万台,6亿多用户隐私泄露....... 一.AI本无罪,怀璧其罪 AI机器人替代人工,永远保持礼貌从不生气且不知疲倦的声音,当之无愧成为骚扰电话的主力军.AI机器人替代人工拨打骚扰电话的方案已形成"AI拨打电话+AI躲避监管+AI收集个人隐私"的完整黑色产业链.当人们用AI的能力辅助做安全.实现工作

使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (六)之自动寻路及优化

一.综述 赛车游戏的敌人赛车自动寻路一般有两种方式,一种是路点寻路,另外一种就是使用Unity自带组件NavMeshAgent进行寻路了,我介绍的是后者,另外后者在水平面上的汽车寻路导航还不错,但是一旦有Y方向的爬坡.下坡等,汽车就会因为角度依然保持水平显得很不自然,并且轮胎也不会旋转,我对此进行了优化 二.NavMeshAgent 这个和NavMesh是一对,用来设置寻路的游戏对象.关于属性,我不再一一介绍,我就距我的设置来说一下: 1.AgentSize 如下图中,那个圆柱形就是NavMes