【Unity】【C#】《U3d人工智能编程精粹》学习心得--------AI角色的感知方式-视觉感知实现解读

Unity人工智能编程精粹学习笔记 实现AI角色的自主移动——操控行为 操控行为 “操控行为”是指操作控制角色,让它们能以模拟真实的方式在游戏世界中移动。它的工作方式是通过产生一定大小和方向的操控力,使角色以某种方式运动。它属于AI模型中的运动层。 (1)操控行为包括一组基本“行为”。对于单独的AI角色,基本操控行为包括: 使角色靠近或离开目标的“Seek”,“Flee”行为; 当角色接近目标时使他减速的“Arrival”行为; 使捕猎者追逐猎物的“Pursuit”行为; 使猎物逃离捕猎者的“Evade”行为; 使角色在游戏世界中随机徘徊的“Wander”行为; 阅读详情

视觉感知:

sightSensor 与 sightTrigger 实现

视觉感知前提:

  • 需要判断是否有物体的视觉触发器处于其他物体的视觉感知器的范围内

 

感知视觉触发器的感知器-------sightSensor类

  1. 可视角度,
  2. 最远可视距离
  3. 绘制可视距离
  4. 绘制与视觉目标的连线

判断是否被视觉感知器触发的触发器--------sightTrigger类

  1. 判断感知器是否为视觉感知器
  2. 通过获取感知器上的信息与当前位置,计算出当前物体是否处于视觉感知器的范围内
  3. 更新触发器位置(触发器位置跟随着物体改变)

 

sightSensor类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SightSensor : Sensor {
    //定义这个AI角色的视域范围
    public float fieldOfView = 45;
    //定义这个AI角色最远能看到的距离
    public float viewDistance = 100.0f;
    //private AIController controller;
    
	// Use this for initialization
	void Start () {
        //controller = GetComponent<AIController>();
        //设置感知器类型
        sensorType = SensorType.sight;
        //向管理器注册
        manager.RegisterSensor(this);
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    public override void Notify(Trigger trigger)
    {
        //当感知器能够真正感觉到某个触发器的信息时被调用产生相应的行为决策
        print("i see a " + this.gameObject.name + "!");
        //画出与触发目标的连接线
        Debug.DrawLine(transform.position, trigger.transform.position, Color.red);
        //controller.MoveToTarget(trigger.transform.position);
    }

    private void OnDrawGizmos()
    {
        Vector3 frontRayPoint = transform.position + (transform.forward * viewDistance);
        //把45度转换成 Π/4
        float fieldOfViewinRadians = fieldOfView * 3.14f / 180.0f;

        Vector3 leftRayPoint = transform.TransformPoint(new Vector3(viewDistance * Mathf.Sin(fieldOfViewinRadians), 0, viewDistance * Mathf.Cos(fieldOfViewinRadians)));

        Vector3 rightRayPoint = transform.TransformPoint(new Vector3(-viewDistance * Mathf.Sin(fieldOfViewinRadians), 0, viewDistance * Mathf.Cos(fieldOfViewinRadians)));

        Debug.DrawLine(transform.position + new Vector3(0, 1, 0), frontRayPoint+ new Vector3(0, 1, 0), Color.green);

        Debug.DrawLine(transform.position + new Vector3(0, 1, 0), leftRayPoint + new Vector3(0, 1, 0), Color.green);

        Debug.DrawLine(transform.position + new Vector3(0, 1, 0), rightRayPoint + new Vector3(0, 1, 0), Color.green);

    }
}

sightTrigger类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SightTrigger : Trigger {
    public override void Try(Sensor sensor)
    {
        base.Try(sensor);
    }

    //判断感知器是否能感知到这个触发器
    public override bool isTouchingTrigger(Sensor sensor)
    {
        GameObject g = sensor.gameObject;
        //如果这个感知器能够感知视觉信息
        if (sensor.sensorType == Sensor.SensorType.sight)
        {
            RaycastHit hit;
            Vector3 rayDirection = transform.position - g.transform.position;
            rayDirection.y = 0;
            //判断感知体的前方向于物体所在的方向的夹角,是否在实现的范围内
            if((Vector3.Angle(rayDirection,g.transform.forward))<(sensor as SightSensor).fieldOfView)
            {
                //在实现距离内是否存在其他障碍物遮挡,如果没有障碍物,返回true;
                if(Physics.Raycast(g.transform.position+new Vector3(0,1,0),rayDirection,out hit,(sensor as SightSensor).viewDistance))
                {
                    if (hit.collider.gameObject == this.gameObject)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    //更新触发器内部消息,由于带有视觉触发器的AI角色可能是运动的,因此需要不停地更新这个触发器的位置
    public override void Updateme()
    {
        position = transform.position;
    }

    // Use this for initialization
    void Start () {
        base.Start();
        manager.RegisterTrigger(this);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

 

绘制可视范围(解读):

涉及公式:

a为夹角度数 

b为a的度数近似值     

度数近似值 = 度数 * 3.14 / 180b= a* 3.14 / 180

red为红色线长度,redx为红色虚线长度

sin(b)=red/redx

由图右上文字可知,

x=redx,y=redx

求出绿色坐标点的坐标

通过TransformPoint()将该本地坐标转换成世界坐标。

 

实现效果:

 

参考书籍:《unity3d人工智能编程精粹》 王洪源等著

《Unity3D人工智能编程精粹》笔记 Unity3D人工智能架构模型游戏AI的架构模型 Unity3D人工智能架构模型 感知:是AI角色与游戏世界的接口,负责在游戏运行过程中不断感知周围环境,读取游戏状态和数据,为思考和决策收集信息。(for example:是否有敌人接近等。) 思考:利用感知的结果选择行为,在多种可能性之间切换。(such as:战斗还是逃跑?躲到哪里?) 一般来说,这是决策系统的任务,有时也可能简单地与感知合二为一。 行动:发出命令、更新状态、寻路、播放声音动画,也包括生命值减少等。这是运动系统、动画系统和物理系统的任. 阅读详情

相关推荐

C#游戏开发入门与实践:Unity3D平台快速学习

C#(发音为 “C Sharp”)是微软开发的一种现代、面向对象的编程语言。它在2000年作为.NET Framework的一部分首次发布,并迅速成为开发各种应用程序,特别是Windows平台应用程序的首选语言之一。C#语言的设计理念兼顾了开发者的易用性与程序性能,其语法结构清晰、表达能力强,同时具备了类型安全和垃圾回收机制,确保了内存管理的自动化和安全性。Unity3D是一个全面的跨平台游戏引擎,它允许开发者使用C#等语言编写代码,并提供了强大的工具集,用于构建2D和3D游戏。

weixin_32673065的博客 1104

Unity3D 人工智能(一)群组行为

1,群组行为的介绍,不使用群组行为算法的样子 导入一个乌鸦模型  乌鸦模型 。。链接: https://pan.baidu.com/s/1kV9TPY3 密码: zg7u   using System.Collections; using System.Collections.Generic; using UnityEngine; public class Crow : MonoBeh...

什么风把您给吹来了 5329

Unity3D人工智能编程

Unity3D人工智能编程教程包含源代码经过调试完美运行的人工智能

unity加速传感器的应用

1、加速传感器 ??? 在塞车类游戏中,通过移动设备的左右倾斜来模拟游戏中的方向盘,这就用到了加速传感器。可以开发跑酷类游戏。 2、基础知识: 线性加速度三维向量x,y,z分别标识手机屏幕竖直、水平、垂直方向。通过手机重力传感器就能获取手机移动或旋转过程中的3个分量,使用时在代码中调用Input.acceleration方法即可。 3、案例介绍: 倾斜手机,移动小球,当小球到达光圈位置时,

马小宇的博客 6193

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 486

保姆级教程:用NFS把群晖NAS的文件夹挂到Ubuntu 22.04上,实现文件无缝共享

本文提供了一份详细的教程,指导用户如何通过NFS协议将群晖NAS的文件夹挂载到Ubuntu 22.04系统上,实现文件的无缝共享。文章对比了NFS与SMB协议的性能差异,并提供了群晖端和Ubuntu端的配置指南、高级参数优化、自动挂载方案以及生产环境中的实战技巧,帮助用户提升文件共享效率和系统稳定性。

weixin_29213827的博客 405

【Unity】【C#】《U3d人工智能编程精粹》学习心得--------操纵行为--追逐

增加Steering的派生类 ----SteeringForPursuit类    追逐行为类 追逐行为解读图: 本案例的条件判断,通过判断 ①物体朝向与目标朝向夹角的角度 ----------图中红色角度 ②物体朝向与物体到目标当前位置向量所成的角度  ----------图中蓝色角度       来让物体做出两种追逐行为: ①物体按靠近行为的方式追逐目标 ②物体按预测目标移...

Terrell21的博客 1117

发那科机器人Modbus通讯配置全攻略:从IP设置到信号调试

本文详细介绍了发那科机器人Modbus通讯的配置方法,从基础认知到IP设置、端口配置、信号调试及故障排查。重点讲解了UOP和DI/DO信号的配置技巧,帮助工程师快速实现机器人与PLC的稳定通讯,提升自动化系统效率。

weixin_27872611的博客 620

Unity游戏开发AI-感知系统

【Unity】【C#】《U3d人工智能编程精粹》学习心得--------AI角色的感知方式-视觉感知实现解读 https://blog.youkuaiyun.com/Terrell21/article/details/82628621 自己效果实现 using System.Collections; using System.Collections.Generic; using UnityEngine...

qq_35422344的博客 826

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑

本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。

weixin_30015371的博客 260

unity ui插件_“游戏开发入门指南——Unity+”的食用指南

虽然专栏的文章已在置顶中按内容分好类了(【置顶】游戏开发入门指南专栏目录),但不排除仍然有初学者面对繁杂的内容感觉无从下手。因此额外带来一篇食用指南,旨在给想要通过本专栏学习游戏开发的同学一条相对容易的阅读路线。第一阶段首先,我们切换一下视角。游戏需要代入感,那么我们现在也需要代入一个对游戏开发略感兴趣的萌新,他叫小明。小明友情出演小明偶然点开了本专栏,觉得虽然文章看起来有点意思,但是内容都不太看...

weixin_39620001的博客 197

QEMU+KVM实战:5分钟搞定Ubuntu 24.04虚拟机搭建(附性能优化技巧)

本文详细介绍了在Linux宿主机上使用QEMU和KVM快速搭建Ubuntu 24.04虚拟机的完整实战流程。内容涵盖从环境准备、核心组件解析到具体的安装命令,并重点分享了针对CPU、内存、存储I/O及网络性能的深度优化技巧,旨在帮助用户构建一个响应迅速、资源隔离良好的高性能虚拟化开发与测试环境。

j2k3l4的博客 753

Unity手机移动设备重力感应

一、引入 大家对重力感应应该都不陌生,之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念,根据手机的晃动来给实体进行晃动。下图的王者荣耀刚开始的界面其实就是使用的移动设备的重力感应。 二、介绍 Unity内部的重力感应其实已经写好了,这篇文章只是讲下如何使用。Unity内部有一个Input.acceleration这个属性。下面是官方的解释 Description 描述 我们看到这个函数返回的是Vector3,尔Vector3有三个方向分别为下x,y,z这三个float组成的..

Makenna's World 1709

CAN 通信测试工具 canutils

概述 CAN,Controller Area Network,控制器局域网,一种高可靠性的现场总线。广泛用于汽车电子、工业控制通信。 canutils 工具包内含 5 个独立的程序:canconfig、candump、canecho、cansend、cansequence。这几个程序的功能简述如下: canconfig:用于配置 CAN 总线接口的参数,主要是波特率和模式。 candump...

一个软件工程师的技术笔记 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

unity摄像机平滑移动旋转

Unity摄像机平滑移动并旋转,实现自动定位到目标的功能

weixin_46051151的博客 3231

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity3D平滑移动(用于摄像机跟随等)

【代码】Unity3D平滑移动(用于摄像机跟随等)

Tel17610887670的博客 1684

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Unity人工智能编程精粹学习笔记 AI角色的复杂决策——行为树

行为树技术原理 行为树主要采用4种节点(在行为树种,“节点”也称为“任务”)来描述行为逻辑,分别是顺序节点、选择节点 行为树基本术语

漫漫无期的博客 1772

Unity与C#

unity与C#探索

wukeyan的博客 4644

安卓传感器之加速度、线性加速度、重力传感器

前面说到,安卓的加速度可以用Sensor.TYPE_ACCELEROMETER获取。 但是由于重力的影响,得到的数据都是加上了重力加速度在三个轴的分量。即在平放在水平桌面上,静止情况下加速度计的数据应该为9.8m2/sm^{2}/s.等于当地的重力加速度。如何求得重力加速度? 安卓中可以使用Sensor.TYPE_GRAVITY来获取。其实这个重力也是通过加速度计计算得来的。 重力属于低频成分

落日之城 1万+

TYPE_LINEAR_ACCELERATION cannot be resolved or is not a field

在编写Android程序时,取得直线加速度传感器,mySensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)如果编译报错,提示TYPE_LINEAR_ACCELERATION cannot be resolved or is not a field,这主要是因为项目的SDK版本太低造成,Android2.3.1以上才支持TYP

黄俊东的专栏 2250

开发人 学习资源

非常优秀的资源,请珍惜 基础 游戏编程高级进阶书籍推荐:http://www.douban.com/doulist/522861/ Amit游戏编程:http://www-cs-students.stanford.edu/~amitp/gameprog.html 介绍游戏编程的多个方面,图形化教程赞 游戏物理和网络编程:http://gafferongames.com/networking-for-game-programmers/ GAD游戏开发社区:http://gad.qq.com

梦想是世界和平 355

U3D 一个不太懂程序的策划用ai去制作游戏,他将会遇到如下问题

挺好玩的一次总结

咩咩的博客 1184

【Unity】【C#】《U3d人工智能编程精粹》学习心得--------操纵行为--徘徊

增加Steering的派生类 ----SteeringForWander类    徘徊行为类 解读: ①初始化过程,通过半径确定圆周上的一个点。(案例中通过确定一个X=Y的点(x,y)). 通过圆心公式: 圆心为(0,0)半径为r 又因为X=Y 我们可以算出关系式      所以初始化点的坐标为  Vector3(,0,)     A) 案例生成随机点的公式,通过随机值以及...

Terrell21的博客 1359
上一篇: 【Unity】【C#】《U3d人工智能编程精粹》学习心得--------AI角色的感知方式(Trigger,Sensor,TriggerSystemManager)基类实现解读
下一篇: 《Unity Shader入门精要》冯乐乐著 书中彩图
Terrell21
博客等级 码龄9年 39粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值