Unity AI 感知侦探
游戏中AI的感知用的最多的是看到或者听到,也就是:
1.视觉感知
2.听觉感知
视觉感知:
视觉感知一般会有一个视野范围,这个范围与角色的朝向有关,只有在视觉范围内角色才有可能感知得到,这个范围与一个扇形接近,可以直接用半径和角度来控制。
潜在目标除了需要在视视觉范围内之外,探索者的视线还不能被其他障碍物遮挡,这里可以用射线来检测——发出一条从探索者到潜在目标的射线,如果目标是这条射线撞到的第一个单位,则该单位可以被看到,否则被忽略。
using System.Collections.Generic;
using UnityEngine; public class AIViewPerception : MonoBehaviour
{
//视野半径
public float radius=10f;
//视野的角度范围
public float angel=120f; //侦察的结果
public List<GameObject> PerceptionResult { get; private set; } /// <summary>
/// 进行一次侦察
/// </summary>
/// <param name="explorer">探索者</param>
/// <param name="targets">潜在目标集</param>
public void Check(GameObject explorer,List<GameObject> targets)
{
PerceptionResult.Clear(); foreach(var item in targets)
{
//距离判断,这里用平方减少系统开根号的计算量
Vector3 offset = item.transform.position - explorer.transform.position;
if (offset.sqrMagnitude > radius*radius)
continue; //角度判断,是否在视线范围内
float angel = Vector3.Angle(explorer.transform.forward, offset.normalized);
if (angel > this.angel * 1.0f / )
continue; //射线判断,是否被其它目标或障碍物阻挡
Ray ray = new Ray(explorer.transform.position, offset);
RaycastHit info;
if (Physics.Raycast(ray,out info,radius))
{
if (info.collider.gameObject == item)
{
PerceptionResult.Add(item);
}
}
}
} void Start()
{
//测试
PerceptionResult = new List<GameObject>();
var targets =new List<GameObject>(GameObject.FindGameObjectsWithTag("Target"));
Check(gameObject, targets);
foreach(var result in PerceptionResult)
{
Debug.Log(result.name);
}
}
听觉感知:
听觉感知不像视觉感知那样跟朝向有关,也没有一个角度范围,但听觉感知一般与声源的距离有关;距离越远声音越小,在距离相对较远的地方由于接收到的音量逐渐变小,更好的处理方式是根据距离的远近有感知丢失的可能性。
这里采用两个听力半径作为区分,一个是安全听力半径,一个是最大听力半径,在安全听力半径内一定能感知到声源,但超过安全半径后,直到最大听力范围,感知到声源的概率呈现线性降低,直到最大听力范围处为0。
using System.Collections.Generic;
using UnityEngine; public class AIListenPerception : MonoBehaviour
{
//最大听力半径
public float maxRadius = 10f;
//安全听力半径
public float safeRadius = 5f; //侦听结果
public Dictionary<AudioSource,float> PerceptionResult { get; private set; } /// <summary>
/// 进行一次侦听
/// </summary>
/// <param name="explorer">探索者</param>
/// <param name="targets">声源目标集</param>
public void Check(GameObject explorer, List<AudioSource> targets)
{
PerceptionResult.Clear(); foreach(var item in targets)
{
//最大听力范围判断
Vector3 offset = item.transform.position - explorer.transform.position;
if (offset.sqrMagnitude > maxRadius * maxRadius)
continue; //侦听丢失的概率判断:计算出一个声源距离比例权重,距离越远,权重越大,侦听丢失的概率越大
float distance = offset.magnitude;
float weight = (distance - safeRadius) * 1.0f / (maxRadius - safeRadius);
if (Random.value < weight)
continue; //计算真实的侦听到音量,与距离成反比
float volume = item.volume *(- distance / maxRadius);
PerceptionResult.Add(item, volume);
}
} private void Start()
{
//测试
PerceptionResult = new Dictionary<AudioSource, float>();
var targets = new List<GameObject>(GameObject.FindGameObjectsWithTag("Target"));
List<AudioSource> audioSources = new List<AudioSource>();
foreach(var item in targets)
{
audioSources.Add(item.GetComponent<AudioSource>());
}
Check(gameObject, audioSources);
foreach (var result in PerceptionResult)
{
Debug.Log("audioSource : " + result.Key.gameObject.name);
Debug.Log("volume : "+ result.Value);
}
}
Unity AI 感知侦探的更多相关文章
- [UE4]AIPerception,AI感知
- AI Conference 2018人工智能大会 参会总结
主 题:AI Conference 2018人工智能大会 时 间:2018.04.11-4.13 地 点:北京国际饭店会议中心 发起人:O'Reilly 和 Intel 参与部门:研发设计部 参会人员 ...
- 全球顶尖的内容创作引擎,Unity为创造而生
5月11日晚,Unite Beijing 2018 Keynote主题演讲于国家会议中心圆满落幕.今年的Keynote主题演讲汇聚了12位重量级嘉宾,为参会者呈现出了一场属于Unity 2018的技术 ...
- AI的真实感
目录 1.让AI"不完美"--估算和假设 2 AI感知 全能感知 特定感觉无知 3 AI的个性 4 AI的预判 5 AI的智能等级 AI的真实感一直是游戏AI程序员追求的目标, ...
- Unreal Engine 4 系列教程 Part 9:AI教程
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- UE4蓝图AI角色制作(四)之Gameplay调试器
8. 寻路网格体和Gameplay调试器 为了及时识别出AI系统中的导航问题,UE4提供了一个工具用来解决这类问题,它叫Gameplay调试器.打开项目设置,在左侧找到"引擎",然 ...
- 人工智能AI------有限状态机、分层状态机、行为树
https://www.cnblogs.com/zhanlang96/p/4793511.html 人工智能遵循着:感知->思考->行动决策方法:有限状态机(Finite-State Ma ...
- Unite Beijing 2018 参会简要分享
一. Training Day 主讲人:鲍建运 操作:马瑞 课程包括较为完整的功能,如灯光设置,角色动画控制,Cinemachine,Timeline,AI寻路,以及最新的Post Processin ...
- Unite Shanghai 2019全日程曝光(建议收藏)
https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q 5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕.本次大会共设 ...
随机推荐
- SQL Server如何找出一个表包含的页信息(Page)
在SQL Server中,如何找到一张表或某个索引拥有那些页面(page)呢? 有时候,我们在分析和研究(例如,死锁分析)的时候还真有这样的需求,那么如何做呢? SQL Server 2012提供了一 ...
- sql server使用sp_executesql返回拼接字符串里面的输出参数
问题: 今天一同事请教博主,他拼接了一个语句,select表格形式数据,然后使用@@rowcount获取到行数. 但他又有这样特别的需求:想只获取行数而不返回表格数据结果,因为是while循环,不想返 ...
- s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
1.SDRAM原理 black (1)SDRAM内部存储结构: (2)再看看与2440连接的SDRAM原理图: sdram引脚说明: A0-A12:地址总线 D0-D15:数据总线(位宽16,2片级联 ...
- reduce方法实现累加累乘的方式
reduce函数对参数序列中的值进行积累,第二个参数可以为:str,tuple,list,代码示例如下: from functools import reduce#实现列表内的所有数的累加,即第一步x ...
- Python-类的几种调用方法
一:实例 二:静态 可以调用类以外的变量,只限于此模块. 三:类方法 可以调用该类中定义的变量进行使用. 直接上代码
- SA详细注释不压行代码
){ //变量含义:m是字符集大小,n是字符串长度,c是一个桶数组,a[i]是字符串(下标从1开始) //rk[i]就是suffix(i)的字典序排名,sa[i]就是要求的排名为i的后缀的起始位置,即 ...
- json解决ajax跨域的原理
jsonp只能解决GET类型的ajax请求跨域问题 jsonp请求不是ajax请求,而是一般的get请求 基本原理 浏览器端: 动态生成<script>来请求后台接口(src就是接口的ur ...
- Jquery中的done() fail() then() $when()到底是什么
ajax的传统写法: $.ajax({ url: "test.html", success: function(){ alert("哈哈,成功了!"); }, ...
- 读后感:数据结构与算法JavaScript描述
本书看完,对常见的数据结构与算法从概念上有了更深入的理解. 书中关于数组.栈和队列.链表.字典.散列.集合.二叉树.图.排序.检索.动态规划.贪心算法都有详细的介绍.算是一本不错的学习书籍. 栈和队列 ...
- java基础(6):方法
1. 方法 1.1 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可 ...