Unity中射线Ray和RaycastHit的简单介绍

射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。我们可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。

1.Physics.Raycast

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
括弧里分别对着,射线的发射点,射线的方向,射线的最大距离,检测带不带碰撞器,无碰撞器打不着另一个物体

官方文本:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        if (Physics.Raycast(transform.position, fwd, 10)) {    //检测是否射线接触物体
            print("There is something in front of the object!");
        }
    }
}


关于Physics.Raycast()

API文档中只给出这几个方法:

public static bool Raycast(Ray ray, RaycastHit hitInfo, float distance, int layerMask);

public static bool Raycast(Ray ray, float distance, int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, RaycastHit , float distance ,int layerMask );


2.RaycastHit类用于存储发射射线后产生的碰撞信息。常用的成员变量如下:collider与射线发生碰撞的碰撞器
distance 从射线起点到射线与碰撞器的交点的距离
normal 射线射入平面的法向量
point 射线与碰撞器交点的坐标(Vector3对象)

Ray ray = new Ray(transform.position, transform.forward * 100);
        Debug.DrawLine(transform.position, transform.position + transform.forward * 100, Color.red);

        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 10)) {
            print(hit.point);
            print(hit.transform.position);
            print(hit.collider.gameObject);
        }

来看看RaycastHit是什么鬼吧。

先申明了一个RaycastHit类型的hit变量,在Physics.Raycast()方法后,hit这个变量就携带了射线碰撞到那个物体的一些信息

这包括哪些信息呢?如图:

(不知道的概念,自己写一些简单代码去试试,会受益匪浅!)

而这里就用hit得到了transform信息,有了cube的transform,我们不就可以控制它的移动了吗。


总结:

Ray:在程序中可以理解为射线,就是以某个位置(origin)朝某个方向(direction)的一条射线;

RaycastHit,它是用于存储射线碰撞到的第一个物体的信息,所以需要提前创建这个对象,用于信息的碰撞信息的存储;

接下来Physics.Raycast,下面是它的结构体:

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance);  

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance);
ray:射线结构体的信息,包括起点,方向;也就是一条射线

hitinfo:这条射线所碰撞物体的相关信息;

maxDistance:这条射线的最大距离;

这个函数的意思就是:以射线ray经过的maxDistance长度之内,与第一个对象进行的物理碰撞的信息,存储在hitInfo中;如果有碰撞物体,返回true, 反之false;




  • 54
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值