Unity3DAI行为------避开障碍物简单实现

2023-11-08

  public float speed = 20.0f;
    public float mass = 5.0f;
    public float force = 50.0f;
    public float minimumDistToAvoid = 20.0f;

    private float curSpeed;
    private Vector3 targetPoint;


	// Use this for initialization
	void Start () {
        targetPoint = Vector3.zero;
        mass = 5.0f;
	}

     在Update方法中,我们基于AvoidObstacles方法返回的方向向量更新agent实体的位置并对其进行旋转。我们在update方法中所做的第一件事就是获取鼠标点击的位置,以移动我们的AI实体,我们向它正在观察的方向发出一条射线,然后获取这条射线

     与地平面的交点,作为目标位置,一旦获取到了目标位置向量,就可以用目标位置向量减去当前位置的向量来计算出目标向量。最后调用AvoidObstacles方法,并将这个目标向量作为参数传入。
 void Update () {
        RaycastHit hit;
        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray,out hit,100.0f))
        {
            targetPoint = hit.point;
        }

        Vector3 dir = targetPoint - transform.position;
        dir.Normalize();
        AvoidObstacles(ref dir);

        if (Vector3.Distance(targetPoint,transform.position) <3.0f)
        {
            return;
        }

        curSpeed = speed * Time.deltaTime;
        var rot = Quaternion.LookRotation(dir);
        transform.rotation = Quaternion.Slerp(transform.rotation, rot, 5.0f * Time.deltaTime);
        transform.position += transform.forward * curSpeed;
	}

        AvoidObstacles方法也非常简单,这里唯一需要注意的技巧就是光线投射会选择性的与障碍物所在的图层相互作用,这个图层已经在Unity3D的标签管理器中标记为User Layer8,Raycast方法接收一个图层掩码参数,
        Unity3D使用一个32位的整数来代表这个图层掩码参数,例如,以下表示32位全是零:
        0000 0000 0000 0000 0000 0000 0000 0000
        默认情况下Unity使用前8层作为内置的图层。所以,当你不使用任何图层掩码参数的情况下调用光线投射方法时,它会对所有默认的这8层进行光线投射,可以用如下位掩码表示:
        0000 0000 0000 0000 0000 0000 1111 1111
        我们的障碍物所在的层被设置为第8层(下标为9),我们只希望对这个层进行光线投射,所以我们将位掩码设置为:
        0000 0000 0000 0000 0000 0001 0000 0000
        设置这个位掩码最简单的办法是使用位移操作,我们只需要将下标为9的位置设置为1,这意味着我们只需左移8位即可:
        int layerMask = 1<<8;
        一旦设置好了图层掩码,我们就可以调用Physics.Raycast方法,从当前实体的位置的方向投射一条射线。射线的长度使用变量minimumDistToAvoid,这样我们就可以只避开在这个距离内射线遇到的障碍。
        然后我们获取到射线的法向量,用其乘以力的向量,再把它与当前实体方向的向量相加,得出合成方向向量,并将其从方法中返回。

        接着在Update方法中,在避开障碍物之后,我们使用这个新的方向对AI实体进行旋转并根据速度值更新位置。

 public void AvoidObstacles(ref Vector3 dir)
    {
        RaycastHit hit;
        int layerMask = 1 << 8;
        if (Physics.Raycast(transform.position,transform.forward,out hit, minimumDistToAvoid, layerMask))
        {
            Vector3 hitNormal = hit.normal;
            hitNormal.y = 0;
            dir = transform.forward + hitNormal * force;
        }
    }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3DAI行为------避开障碍物简单实现 的相关文章

随机推荐

  • 鼠标悬停(点击)出现文本提示框

    下面的是鼠标点击出现文字 如果想要鼠标移动上去出现 移出消失的话 UI可以使用OnPointerEnter跟OnPointerExit方法 命名空间是UnityEngine EventSystems 如果是3D物体的话可以用OnMouseE
  • centos7 使用mount -t cifs 挂载windows共享目录方法与问题解决

    使用 域 账号 密码 访问 10 100 xx Android 的windows 共享 mount t cifs o domain test com username administrator password test123 192 1
  • ctf.show web7,8,10

    web7 查看列表文章发现 id 判断为sql注入 当有空格时会报错 用 绕过 得到注入点 盲猜flag from flag web8 测试发现过滤了空格 逗号 and 当url判断为真时有回显 数据库视角 进行盲注 substr data
  • HTTP协议——缓存

    缓存的概念 缓存这个东西真的是无处不在 有浏览器端的缓存 有服务器端的缓存 有代理服务器的缓存 有ASP NET页面缓存 对象缓存 数据库也有缓存 等等 http中具有缓存功能的是浏览器缓存 以及缓存代理服务器 http缓存的是指 当Web
  • C++的volatile

    在C 中 编译器为了提高代码的执行效率 常常会对变量进行反向优化 比如将变量缓存在寄存器中 这样可以减少对内存的访问次数 提高访问速度 然而 在某些情况下 我们希望确保每次访问变量时都能从内存中读取最新值 而不是使用缓存中的旧值 volat
  • colmap论文学习

    Structure from Motion Revisited 该文章是colmap对应的稀疏重建论文 主要讲了稀疏重建的几个步骤 特征提取与匹配 colmap利用SIFT算子进行特征提取与匹配 匹配完之后就获得了两两图像之间的匹配对 但是
  • swift 中的标记关键字

    1 MARK 我们知道 在OC中我们可以使用pragma mark添加一些说明 能够快速定位到相应的代码 例如 pragma mark 说明文字 那么在swift中怎么实现类似的功能呢 其实也很简单 只要在需要添加说明的地方加上如下格式的注
  • Linux如何查看目录占用空间大小?

    在Linux操作系统中 查看目录占用空间的大小可以使用du命令来完成 那么Linux du命令是什么 如何使用 常用参数有哪些 本文为大家详细介绍一下 在Linux中 可以使用du命令来查看目录占用空间大小 Linux du命令 du是统计
  • 运维常用的shell命令.md

    1 后台启动脚本 nohup start sh gt dev null 2 gt 1 dev null代表linux的空设备文件 所有往这个文件里面写入的内容都会丢失 俗称 黑洞 2 gt 1错误输出2重定向到标准输出1 意思是标准输出和错
  • 这10种赚钱方法,用手机就可以做,看看哪种适合你?

    现在很多人都想着做第二职业 也就是兼职赚钱 即使能够赚个零花钱也不错 今天给大家分享10个可以利用自己的空闲时间 可以赚到钱的办法 一部手机就能操作的赚钱方式 看看哪一种适合你 只要你有网络主播这一方面的才能 很多网络直播平台都会按照主播的
  • matlab坐标污染物浓度,基于MATLAB城市空气质量评价体系.doc

    基于MATLAB城市空气质量评价体系 基于MATLAB城市空气质量评价体系 本文针对大气污染问题 采用动态加权综合评价方法建立了合理的空气质量评价模型 同时 采用灰色关联度分析方法和BP神经网络模型较好地研究了空气质量和气象参数之间的关系
  • 深度解密Go语言之context

    Go 语言的 context 包短小精悍 非常适合新手学习 不论是它的源码还是实际使用 都值得投入时间去学习 这篇文章依然想尝试全面 深入地去研究 文章相比往期而言 整体不长 希望你看完可以有所收获 什么是 context Go 1 7 标
  • IDEA如何搭建Maven(安装&下载&配置)

    https www cnblogs com xihehua p 9639045 html 1 下载 Maven 压缩包 https maven apache org Use Download gt Files Binary zip arch
  • Linux 递归修改文件时间日期

    在操作 Linux 系统时 发现文件时间总是出现错误 在文件时间超越系统时间时 在执行文件时 就有可能出现错误 查看文件时间 stat test txt 修改一个文件的时间 touch d 2020 11 11 11 00 00 test
  • 【Bugs】解决报错CondaValueError- prefix already exists

    Bugs CondaValueError prefix already exists 1 问题情景 在conda create n ur env name python 3 7的时候报错 WARNING A directory alread
  • Unity游戏性能分析最终指南 02

    设置每帧时间预算 帧率 fps 并不是衡量游戏稳定体验的理想指标 考虑以下情况 在运行时的前0 75s内渲染了59帧 然后接下来的1帧需要0 25s才能渲染完毕 虽然是60fps 但实际上会让玩家感觉卡顿 这是需要设置帧时间预算的重要原因之
  • 数据分析师从业必问的5个问题~

    写在前面 经常有小伙伴问船长一些数据分析从业的问题 类似如何转行 毕业如何择业 如何学习成为数据分析师 今天就抽空总结了一下大家入行数据分析的问题 基本囊括在以下5个问题中 下面5个问题将解答你的困惑 也可能在后续的面试中问到 另外我为你准
  • 23062QTday2

    完善登录框 点击登录按钮后 判断账号 admin 和密码 123456 是否一致 如果匹配失败 则弹出错误对话框 文本内容 账号密码不匹配 是否重新登录 给定两个按钮ok和cancel 点击ok后 会清除密码框中的内容 继续进行登录 如果点
  • CondaValueError: Malformed version string ‘~‘: invalid character(s)

    创建python3 6环境 conda create n py36 python 3 6 anaconda和 升级conda环境 conda update conda和conda upgrade n base c defaults over
  • Unity3DAI行为------避开障碍物简单实现

    public float speed 20 0f public float mass 5 0f public float force 50 0f public float minimumDistToAvoid 20 0f private f