zoukankan      html  css  js  c++  java
  • Unity 射线检测(RayCast)

    Raycast 射线检测

     Unity 中提供了一种控制方案,用来检测鼠标点在屏幕上后,具体点在 Unity 场景中,三维世界的哪个点上

     这种解决方案,就是射线检测:

     通过鼠标点击屏幕,由屏幕上的点向Unity三维直接发射一条无限长的射线

     当检测到碰撞物体后,便会返回被碰撞物体的所有信息,以及交点信息等等... ...

    常用射线检测方法

    1. 普通射线检测(一般用于检测某一个物体)

    1    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    2    Debug.DrawRay(ray.origin, ray.direction, Color.red);
    3    RaycastHit hit;
    4    if (Physics.Raycast(ray, out hit, int.MaxValue, 1 << LayerMask.NameToLayer("layerName")))
    5    {
    6       Debug.Log("检测到物体!");
    7    }

    2. 直线射线检测多个物体

     1    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
     2    Debug.DrawRay(ray.origin, ray.direction, Color.red);
     3    RaycastHit[] hit = Physics.RaycastAll(ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("layerName"));
     4    if (hit.Length > 0)
     5    {
     6        for (int i = 0; i < hit.Length; i++)
     7        {
     8            Debug.Log("检测到物体:" + hit[i].collider.name);
     9        }
    10    }

    3. 球形射线检测(一般用于检测周边物体)

    1    int radius = 5;
    2    Collider[] cols = Physics.OverlapSphere(this.transform.position, radius, LayerMask.NameToLayer("layerName"));
    3    if (cols.Length > 0)
    4    {
    5        for (int i = 0; i < cols.Length; i++)
    6        {
    7            Debug.Log("检测到物体:" + cols[i].name);
    8        }
    9    }

    画出球形检测范围的方法:

    1     private void OnDrawGizmos()
    2     {
    3         Gizmos.DrawWireSphere(this.transform.position, 5);
    4     }

    简单的实例

     创建地板和小球,构建简单的测试场景

     将脚本挂载到空物体上,并在 Inspector 面板上对 Ball 进行赋值

     1 using UnityEngine;
     2 
     3 public class RayCast : MonoBehaviour
     4 {
     5     public Transform Ball; //小球
     6 
     7     //设置射线在Plane上的目标点target
     8     private Vector3 target;
     9 
    10     void Update()
    11     {
    12         if (Input.GetMouseButton(1))
    13         {
    14             object ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    15             RaycastHit hit;
    16             bool isHit = Physics.Raycast((Ray)ray, out hit);
    17             Debug.DrawLine(Input.mousePosition, hit.point, Color.red);
    18             if (isHit)
    19             {
    20                 Debug.Log("坐标为:" + hit.point);
    21                 target = hit.point;
    22             }
    23         }
    24         //如果检测到小球的坐标 与 碰撞的点坐标 距离大于0.1f,就移动小球的位置到碰撞的点
    25         Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target;
    26     }
    27 
    28     /// <summary>
    29     /// 移动方法
    30     /// </summary>
    31     /// <param name="target"></param>
    32     void Move(Vector3 target)
    33     {
    34         if (Vector3.Distance(Ball.position, target) > 0.1f)
    35         {
    36             Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime);
    37         }
    38         else
    39             Ball.position = target;
    40     }
    41 }

     测试效果:

     射线检测的好处在于,发出的射线与带有Collider 组件的物体都会发生碰撞,并且可以返回各种信息

     例如:被碰撞物体的位置、名称、法线等等一系列的数据

     另外还可以自定义发出射线的距离、影响到的图层等等

    *** |  以上内容仅为学习参考、学习笔记使用  | ***

  • 相关阅读:
    01-SCOTT-SQL建表语句
    面试小题
    Swagger2使用API
    Elasticsearch单机安装_集群搭建_索引基本操作_Head插件安装与基本操作_ik分词器配置_logstash实现数据同步_教程
    45个非常有用的 Oracle 查询语句小结
    oracle获取定时时间段
    彻底理解webservice SOAP WSDL
    MySQL 1045登录失败
    quartz定时任务时间设置
    map 遍历的四种方式
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13272109.html
Copyright © 2011-2022 走看看