Unity3d开发基础篇之射线碰撞检测

Unity基础及API学习 专栏收录该内容
6 篇文章 0 订阅

介绍

       在游戏开发过程中,很多地方要用到射线碰撞检测。比如:射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备,无人驾驶车辆的雷达检测等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函数接口。本文将对射线的使用进行一个总结。
       射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。我们可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。

射线的创建和显示

  • Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。
  • public Ray(Vector3 origin, Vector3 direction),创建一条射线需要指明射线的起点(origin)和射线的方向(direction)。
  • Physics.Raycast静态函数用于在场景中发射一条可以和碰撞器碰撞的射线。

程序(Game中不可见,Scence中可见)

  • 本示例中想做车辆激光雷达的检测,所以只做了一根线先练练手。
  • transform.forward为车辆坐标系,Vector3.forward为世界坐标系。
using UnityEngine;
using System.Collections;
public class lasermaster : MonoBehaviour {
    public Vector3 originPos;//射线起始位置
    public Vector3 direction;//射线方向
    public float maxDistance;//射线最大检测距离
	// Use this for initialization
	void Start () {
        maxDistance = 10.0f;
	}
	// Update is called once per frame
	void Update () {
        originPos = transform.position + transform.up * 2.2f;//射线起始位置
        direction = transform.forward;//射线方向
        Vector3 targetPos = originPos + transform.forward * maxDistance;//射线最大检测距离处的点位置,找到起始点与终点,方便画线
        Ray ray = new Ray(originPos, direction);//创建名为ray的射线
        RaycastHit hit;//碰撞检测信息存储
        if (Physics.Raycast(ray, out hit, maxDistance)){//碰撞检测
            Debug.DrawLine(originPos,hit.point);//画线显示
			Debug.Log (hit.collider.name);//打印检测到的碰撞体名称
        }
        else {
            Debug.DrawLine(originPos, targetPos);//没检测到碰撞体,则以最大检测距离画线
        }
	}
}

程序(Game中可见,Scence中可见)

using UnityEngine;
using System.Collections;
public class lasermaster : MonoBehaviour {
    public Vector3 originPos;
    public Vector3 direction;
    public float maxDistance;
	public LineRenderer line;//添加LineRenderer组件
	// Use this for initialization
	void Start () {
        maxDistance = 10.0f;
		line.enabled=true;//初始使能该组件
		line.SetColors (Color.green,Color.green);//设置颜色
		line.SetWidth (0.1f,0.1f);//线大小
	}
	// Update is called once per frame
	void Update () {
        originPos = transform.position + transform.up * 2.2f;
        direction = transform.forward;
        Vector3 targetPos = originPos + transform.forward * maxDistance;
        Ray ray = new Ray(originPos, direction);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, maxDistance)){
			Debug.DrawLine(originPos,hit.point);
			line.SetPosition(0,originPos);
			line.SetPosition(1,hit.point);
			//Debug.Log (hit.collider.name);
        }
        else {
            Debug.DrawLine(originPos, targetPos);
			line.SetPosition(0,originPos);
			line.SetPosition(1,targetPos);
        }
	}
}
  • 4
    点赞
  • 0
    评论
  • 23
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

未知艺术家爸爸

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值