实现目标

使用组件:一个场地、导航代理、摄像机

实现:进入游戏,鼠标左键点击场景的任意位置,导航代理将自动前往指向位置

步骤

首先我们需要一个场景,新建一平面作为场景地面(如果需要额外的障碍物则自己设置,这里不额外添加)

然后在平面上放置一胶囊体,用作角色(导航代理)

=

给角色挂上两个组件:刚体和导航网格代理

进入窗口 -> AI -> 导航,打开导航配置面板,此时选中我们的地面,在右侧面板进入“对象”,看到有以下三个可更改项:

  • navigation static 将物体设置为静态
  • generate offmeshlinks 一般用作跳跃或下坡,目前可直接勾选,具体作用后期会有详细解释
  • navigation area 里面有三个可选项目,因为是地面所以必须要选择walkable

我们勾选前两项,因为导航代理需要在一个静态的表面上行走,所以必须设置地面为static(此时地面就默认具有碰撞属性了,不需要额外添加刚体)

然后导航区域(navigation area)设置为walkable

=

选择胶囊体(下文简称角色),同样的在导航配置面板中选中“烘焙”,里面的参数我们维持默认不用更改,直接点击右下角的bake进行导航路径烘焙

烘焙完毕,地面出现淡蓝色网格,该网格就是角色可行走的区域

=

最后安排摄像机对准场景,并确保视角足够宽敞

脚本编写

在资源管理器中新建脚本文件NavigationScript.cs,并把该脚本文件直接拖放到角色身上,使脚本的作用对象为角色,之后双击编辑脚本

=

由于我们使用了导航代理组件,就需要在脚本的头部添加有关AI的库,这里导入以下的AI库即可!

using UnityEngine.AI;

=

在主类中添加变量,两个变量分别存储摄像机和导航网格代理

public Camera c;    // 获取摄像机
public NavMeshAgent agent;  // 获取导航网格代理(就是我们要操纵的人物)

=

我们需要在start方法里面初始化agent变量

因为脚本是挂载角色上的,而角色自带导航网格组件,所以我们使用以下脚本获取该组件(代码中的this就是指代角色本身)

agent=this.GetComponent<NavMeshAgent>();

=

下面进入最关键的部分!!!

注意:因为需要持续监测,所以以下代码放在update方法里面

  1. ray 记录一个从摄像机为起点,射线射到的位置为终点的射线,ScreenPointToRay传入一个参数,为鼠标在屏幕上点击的位置
  2. raycasthit记录的是射线射到的点所存储的信息
  3. 我们检测鼠标左键按下(鼠标左键的数字代码是0),随即使用physics里面的发射射线函数,两个参数分别填入ray类型变量和raycasthit类型变量,这里都是固定形式
  4. 此时我们只需要把角色的目的地设置为射线射到的点的位置就大功告成了!
 Ray r = c.ScreenPointToRay(Input.mousePosition);RaycastHit rh;if(Input.GetMouseButtonDown(0)){if(Physics.Raycast(r,out rh)){agent.SetDestination(rh.point);}}

=

其他TIPS

这里我们还应该考虑这么一点,如果射线射中的场景对象并非可以行走的表面,或者我们希望角色仅可以在指定表面行走,而让某些特定区域设置为禁行区,那么我们如何做到呢?

事实上,我们可以为禁行区和可行区分别设置不同的名称,当射线发射后,立即监测射中的物体名称,若为可行区则执行设置目的地任务,反之置之不理

END 完整代码示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;// 务必记得导入AI库,否则无法使用导航组件相关操作
using UnityEngine.AI;// 实现鼠标左键点击来引导角色前往指定位置
// 这里需要事先烘焙导航场地,且本脚本被赋予的对象角色必须要带有导航网格代理组件public class FindWay : MonoBehaviour
{public Camera c;    // 获取摄像机public NavMeshAgent agent;  // 获取导航网格代理(就是我们要操纵的人物)void Start(){// 因为本脚本是赋予人物的,所以从该人物(this)上获取导航网格代理这个组件agent=this.GetComponent<NavMeshAgent>();}// Update is called once per framevoid Update(){// ray是从摄像机处发射一条射线,射线碰到物体后自动停止并返回他的位置// raycasthit存储着射线碰撞对象的位置// 以下代码为固定格式,GetMouseButtonDown(0)表示检测鼠标左键按下时发射射线// agent.SetDestination(rh.point);在射线落下的位置设置为导航代理的目标Ray r = c.ScreenPointToRay(Input.mousePosition);RaycastHit rh;if(Input.GetMouseButtonDown(0)){if(Physics.Raycast(r,out rh)){agent.SetDestination(rh.point);}}}
}

Unity实现鼠标点击指定位置导航角色相关推荐

  1. 利用WPF建立自己的3d gis软件(非axhost方式)(五)在鼠标点击的位置增加UI

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(五)在鼠标点击的位置增加UI 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bP ...

  2. js鼠标移动到指定位置_Python: pyautogui模块之鼠标控制

    文章背景:PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务.pyautogui模块中包含了一些函数,可以模拟鼠标移动.按键和 ...

  3. Unity通过鼠标点击生成网格模型

    Unity通过鼠标点击生成网格模型 由于项目需要,制作了一个通过鼠标点击平面,根据点击的点首先生成一个面,再根据这个面生成一个背面,最后根据两个面来构成一个模型. 点击模型平面,划定外围轮廓 通过点击 ...

  4. php微信地图定位导航,微信小程序实现定位及到指定位置导航的示例代码

    一:实现定位及到指定位置导航所需组件及API 1:组件:map(地图组件) 2:API:wx.getLocation(Object object)(获取当前的地理位置.速度),wx.openLocat ...

  5. 微信小程序实现定位及到指定位置导航

    一:实现定位及到指定位置导航所需组件及API 1:组件:map(地图组件) 2:API:wx.getLocation(Object object)(获取当前的地理位置.速度),wx.openLocat ...

  6. 页面滚动到指定位置导航栏固定顶部

    做一个网页时经常会用到导航栏,导航栏对于一个网站来说,地位是举足轻重的,在用到导航栏时,我们经常会用到一个效果,就是当页面滑动到一定的位置时,导航栏需要固定在页面的顶部,这是怎么实现的呢? 下面的代码 ...

  7. js鼠标滚动到某个位置导航菜单显示

    js鼠标滚动到某个位置导航菜单显示: <script> $(function(){ var pcontent_right_height = $(".pcontent_right& ...

  8. vue鼠标点击指定区域创建dom元素与编辑删除元素的思路

    vue鼠标点击指定区域创建dom元素与编辑删除元素的思路 话不多说有思路直接干 一. 鼠标点击页面灰色背景创建红色元素 二. 点击已经创建的红色元素则是编辑或者删除 根据点击元素的类名来判断是属于创建 ...

  9. Unity 获取鼠标点击图片时 获取点击位置的像素

    脚本要求: 需要获取颜色的图片以走下角为起点建立空物体 右上角建立空物体(两个空物体均设置为图片的子物体,设置好锚点,将坐标改为0即可).建立好碰撞体(BoxCollider).用2DBoxColli ...

  10. Unity 模拟鼠标点击操作

    有个奇奇怪怪的BUG,需要定时模拟鼠标点击 就想到了这个骚操作. C#本身带的类库中没有关于鼠标操作的函数库,需要引用微软的dll. 重点需要引入user32.dll,可以在C:\Windows\Sy ...

最新文章

  1. php json_encode中提示的中文总是返回\u767b\u5f55\u6210\u529f\uff01的解决办法
  2. 企业中如何避免因网卡硬件问题产生的损失
  3. linux 压缩和解压缩(zip/unzip)
  4. require与include+php,PHP中include与require有什么区别
  5. 用Java编写约分最简公式,2013年Java方向C组第五题
  6. mysql n 识别_mysql – 不能有“不识别”的N:M关系吗?
  7. 动态分页《查看更多》
  8. $CH0201$ 费解的开关
  9. win 7-8-10 下 删除我的电脑下多余的设备和驱动器,腾讯视频,酷我音乐,手机
  10. (十一)洞悉linux下的Netfilteriptables:iptables命令行工具源码解析【上】
  11. Hybrid App实现原理
  12. 扫描全能王完美版,纸质文件一键识别电子文档
  13. ensp三层交换机配置实验
  14. 火车票能不能选座_电话订火车票可以自己选座位吗
  15. 时间维度表-数仓中最重要的维度之日期维度
  16. 自定义审批流程表设计
  17. 使用TeamViewer远程连接Android手机并控制
  18. [XUPT]2020寒假训练---比赛专题
  19. ROS通信机制:话题、服务、参数
  20. centos7查看udp端口_linux7-netstat命令查看开放了那些端口

热门文章

  1. 入门大数据基础知识了解
  2. 电商项目整体介绍-尚硅谷大数据培训
  3. 在tomcat下配置jdbc连接池
  4. 常用类 String,Stringbuffer,Stringbuilder 包装类 日期类
  5. scratch python_自动生成scratch2或scratch3作品核心代码
  6. 计算机基础17秋在线作业3,西南大学17秋1056《计算机基础》在线作业(参考资料)...
  7. Mysql可视化工具安装及使用说明
  8. 简单 黑苹果dsdt教程_DSDT完美睡眠教程
  9. python基础(12):Standard Library标准库(包含正则)
  10. 如何为自己的在线办公软件 ONLYOFFICE Docs 服务器的字体库添加字体