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

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

    • 介绍
    • 射线的创建和显示
    • 程序(Game中不可见,Scence中可见)
    • 程序(Game中可见,Scence中可见)

介绍

       在游戏开发过程中,很多地方要用到射线碰撞检测。比如:射击游戏中子弹是否击中敌人,在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);
        }
	}
}

你可能感兴趣的:(Unity基础及API学习)