Unity之射线检测

这篇具有很好参考价值的文章主要介绍了Unity之射线检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

📕一、射线检测原理

📕1.2、实现实例 

📕二、导航

📕2.1 导航网格的使用

📕2.2 创建角色,在地形上移动

📕2.3 动态障碍物 

📕2.4 网格链接 

📕2.5 自定义网格链接 

📕2.6 区域


不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时候就开始玩了,这款游戏控制单位角色移动是通过鼠标的点击来实现。

同样的操作方法还有英雄联盟等很多游戏,那本篇文章小编就通过简单小实例来讲解这种操作在Unity中是如何实现的。

Unity之射线检测,unity,游戏引擎

小编先展示一下实例的演示动图:红色球体表示我们控制的角色,鼠标左键点击小球就会到相应的坐标位置并打印坐标。

Unity之射线检测,unity,游戏引擎

进阶版:添加了导航功能

Unity之射线检测,unity,游戏引擎

一、射线检测原理

先来讲一下这种操作方式的原理:它其实是从摄像机发射出的一条射线。当鼠标点击的时候,射线就从摄像机发射打到你点击的位置,通过检测射线获取到位置坐标,角色就向这个坐标移动。

Unity之射线检测,unity,游戏引擎

 注:射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到,演示动图中点击平面区域以外的地方是没有任何反应的。

1.2、实现实例 

创建射线的两种方法:该实例是通过摄像机创建射线

//创建射线的两种方法:
//方式一 通过向量创建
Ray ray1 = new Ray(Vector3.zero , Vector3.up);
//方式二 通过摄像机创建
Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);

新建一个平面一个球体,球体挂载上红色的材质方便我们观察,新建RayTest脚本用来检测射线并挂载到球体上。

public class RayTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //当点击鼠标左键时执行
        if(Input.GetMouseButtonDown(0))
        {
            //按下鼠标左键发射射线  射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //声明一个碰撞信息类
            RaycastHit hit;
            //碰撞检测用布尔类型表示
            bool res = Physics.Raycast(ray,out hit);
            //如果碰撞到的情况下,hit就有内容了
            if (res == true)
            {
                //打印出碰撞信息的坐标
                Debug.Log(hit.point);
                //把坐标赋值给球体,球体位置就会直接闪现到射线检测点
                transform.position = hit.point;
            }
            
            //多检测
            //RaycastHit[] hits = Physics.RaycastAll(ray, 100, 1 << 10);
        }
    }
}

点击运行就是动图的演示效果了,很简单的一个实例,接下来我们升级点难度来讲导航

二、导航

2.1 导航网格的使用

依然拿红色警戒来举例:我们都知道普通士兵只能在陆地上行走不能下水;而海豹突击队既可以在陆地上行走也可以下水游泳。

这是通过导航来区分的,导航的作用就是实现按照最优路线移动、哪些地方可以移动、哪些地方不能移动。


我们来看看怎么生成导航网格,先手动搭建一个类似城墙的障碍物,不过有斜坡和楼梯可以上去,如下图所示:就是拿立方体来搭积木嘛,相信大家都可以。把立方体都放进平面里形成一个整体。

Unity之射线检测,unity,游戏引擎

给这个地形设置一个静态导航 :

设置为静态导航意思是告诉Unity的导航系统可以通过这些物体计算来生成导航网格

Unity之射线检测,unity,游戏引擎

然后我们把导航窗口打开: 选中平面  ——> 窗口  ——> ai  ——> 导航

Unity之射线检测,unity,游戏引擎

打开导航窗口后进入到烘焙,这里面有很多属性。 

代理半径代理高度,可以把它想象成一个人的胖瘦和身高。比如一个人要钻进桥洞,导航系统就会根据这个人的胖瘦和身高和桥洞大小做对比判断他能不能钻进去。

最大坡度步高就是一个人能爬坡度的大小和台阶的高度 ,比如我说我能爬90°的坡和三米高的台阶(doge.jpg)

了解了这几个简单属性我们点击Bake按钮生成导航网格,然后我们来看一下:

Unity之射线检测,unity,游戏引擎

图中生成的蓝色区域就是导航系统判断可以移动的地方。那为什么边界是灰色的不能走呢?

我们要知道导航系统是根据物体中心判断的,假如说中心是我们的心脏的话那我们就算贴紧墙面心脏也贴紧不了,就是这个道理。

2.2 创建角色,在地形上移动

创建一个胶囊来表示我们控制的玩家,给它挂载上导航代理组件Nav Mesh Agent

上边说过代理半径代理高度可以看成一个人,如果游戏中有体型不同的人呢?比如有胖子、正常体型、瘦子,那就到代理类型发挥它的作用了:

Unity之射线检测,unity,游戏引擎

这样我们就可以创建不同的类型给它归类了

Unity之射线检测,unity,游戏引擎

另外添加上导航代理组件后我们胶囊就会多出一个绿色圆柱体线框,这个是代理半径和高度产生的和胶囊本身的碰撞器是不一样的

接下来我们编写脚本控制胶囊的移动 ,并把脚本挂载到胶囊上

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

public class PlayerControl3 : MonoBehaviour
{
    //声明导航代理组件
    private NavMeshAgent agent;
    // Start is called before the first frame update
    void Start()
    {
        //获取代理组件
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        //如果按下鼠标
        if (Input.GetMouseButtonDown(0))
        {
            //通过射线获取点击位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //判断射线是否碰到物体
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                //拿到射线点击位置
                Vector3 point = hit.point;
                //设置该位置为导航目标点
                agent.SetDestination(point);
            }
        }
    }
}

选中胶囊,改成局部,蓝色箭头就会是胶囊移动的方向了,我们来运行一下

Unity之射线检测,unity,游戏引擎

Unity之射线检测,unity,游戏引擎

2.3 动态障碍物 

接下来介绍另外一个导航组件NavMeshObstacle,这个组件一般用在动态的障碍物上比如说自动开关门。门打开了我们导航就可以通过,门关闭就通过不了。

我们这里给动图中的立方体看做门取名为Door、把它的静态导航关掉并挂载NavMeshObstacle组件。

Unity之射线检测,unity,游戏引擎

Unity之射线检测,unity,游戏引擎

注意看蓝色导航区域,当我们移动门的时候蓝色导航区域也会进行动态的改变,这就是NavMeshObstacle组件的作用

Unity之射线检测,unity,游戏引擎

2.4 网格链接 

上面我们在看烘焙那一栏时除了代理半径代理高度等属性外还有一个生成分离网格链接,我们通过实例来看看网格链接是干嘛的。

网格链接下面还有两个属性值为掉落高度跳跃距离

 掉落高度是指从一个高度为xxx的地方落下去,跳跃距离是在xxx范围内从一个地方跳到另一个地方。


 我们来设置一下,点击选中两个立方体(是两个)并给红框中的属性画上勾,网络链接就可以使用了。我们给掉落高度跳跃距离都赋值为10,重新烘焙运行看一下:

Unity之射线检测,unity,游戏引擎

 效果一目了然

Unity之射线检测,unity,游戏引擎

2.5 自定义网格链接 

哆啦A梦o((=゚♀゚=))o的传送门大家都知道吧,我们来做个简陋版的。胶囊可以通过这两个立方体来回传送越过城墙:

Unity之射线检测,unity,游戏引擎

我们创建两个立方体放在上图中你想传送的位置,其中一个立方体挂载OffMeshLink组件

Unity之射线检测,unity,游戏引擎

起始和结束位置把两个立方体放进去,双向就是可以双向传送,我们看下效果:

Unity之射线检测,unity,游戏引擎 可以看到胶囊通过链接随便游走在城墙两边了

2.6 区域

Unity的导航并不是按照最短距离来计算的

假如小编要去一个地方,但是我和目的地中间隔了一座小山,直线走的话就需要爬山了。假如走爬山的路线一共要消耗5点体力,绕路走一共要消耗3点体力,那小编肯定要绕路走。


 对应到Unity中这叫区域。小编新添一个区域叫做Mountain来模仿山,后边的数值就相当于要消耗的体力点。

Unity之射线检测,unity,游戏引擎

新建一个立方体Mountain,把它设置为Mountain区域。

Unity之射线检测,unity,游戏引擎

我们来运行一下看看胶囊是怎么走的: 有一段可以发现它绕路了

Unity之射线检测,unity,游戏引擎

可以看到加上“山”区域胶囊就开始“权衡利弊”了(doge.jpg),它会选择最优路线来走 。

回头再来说红色警戒中普通士兵不能游泳和海豹突击队可以游泳,他们之间导航的区别。

点击选中胶囊,在胶囊的组件中我们之前挂载了NavMeshAgent,组件中有一个属性叫区域遮罩,下拉菜单里罗列了我们的导航区域(包括我们自定义的),取消勾选的区域胶囊无论怎样都不可以涉足了。

Unity之射线检测,unity,游戏引擎

这样大家就知道普通士兵和海豹突击队他们的导航是怎么区分的了吧,拜拜┏(^0^)┛ 文章来源地址https://www.toymoban.com/news/detail-808822.html

到了这里,关于Unity之射线检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity中的射线碰撞检测

    在Unity中,射线碰撞检测是一种常用的技术,通常用于确定射线与场景中的物体是否相交,并获取相交点的信息。 1.创建射线: 使用 Ray 类或 RaycastHit 结构体创建射线。 Ray 表示射线的起点和方向,而 RaycastHit 用于存储射线与物体相交的信息,如相交点、法线等。 2.发射射线:

    2024年03月17日
    浏览(42)
  • 【超级入门】Unity如何实现画射线+射线检测+NavMeshAgent结合

           “射线检测 是在3D数字世界里选择某个特定物体常用的一种技术,如在3D、VR游戏中检测子弹命中敌人情况或者从地上捡起一支枪,这都要用到 射线检测 , 射线检测 是在3D数字空间中选择虚拟物体的最基本方法。 ” 效果: 我们先创建一个物体,挂脚本 RayTest ,代码

    2024年02月15日
    浏览(38)
  • 第二十八章 Unity射线检测

    本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线,在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标;又可以判断鼠标是否指向游戏物体。射线的创建方式,一般使用代码来实现。接下来,我

    2024年02月11日
    浏览(62)
  • Unity3d 射线检测

    射线碰撞单个物体: 方式1:从摄像机向世界发射一条射线,通常用于检测鼠标指针有没有选择物体 方式2:创建从一个点到一个方向的射线 声明一个射线碰撞信息类 //进行碰撞检测并返回结果,检测信息会写入碰撞信息类 射线碰撞多个物体: 例:可以用射线检测人物与地面

    2024年02月08日
    浏览(41)
  • Unity 射线与碰撞范围检测【踩坑记录】

    射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider, Physics.Raycast 是不会检测到Collider 2D的(这个让我有一次debug了好久才发现) 对应API如下 可以使用 Debug.DrawLine(Vector3 origin,Vector3 destination,Color color) 和 Debug.DrawRay(Vector3 origin,Vector3 dir

    2023年04月08日
    浏览(38)
  • Unity 之`Physics.Raycast()`方法,射线检测

    当你在Unity中使用 Physics.Raycast() 方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击命中检测等。以下是 Physics.Raycast() 方法的详细介绍: 参数解释: origin :射线的起点(3D世界坐标

    2024年02月11日
    浏览(42)
  • Unity 中检测射线穿过的所有的物体

     在开发中 有个需求,射线要检测所有穿过的物体。 代码如下:   运行结果  

    2024年02月14日
    浏览(39)
  • Unity在物体内部发射射线检测不到物体的解决方式

    在Unity2018.1.18上不大好用。

    2024年02月15日
    浏览(36)
  • Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

    PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。 PhysicsRaycaster通过发射一条射线来检测UI元素。当射线与UI元素相交时,PhysicsRaycaster会将事件传递给相应的UI元素。 Event

    2024年02月15日
    浏览(46)
  • 【游戏开发实战】Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)

    一、前言 嗨,大家伙,我是新发。 好久不见,这是2022年第一篇博客,今天有同学私信我,问我在 Unity 中如何实现这种地球辐射线的效果, 这一看,我就想到了 GitHub 主页的地球射线, 那么,今天就来讲讲如何实现这个效果吧~ 本文最终效果如下: 本文工程源码见文章末尾

    2024年02月06日
    浏览(96)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包