/*******************************************************************************
* 版本声明:v1.0.0
* 类 名 称:RayController
* 创建日期:8/16/2019 11:33:21 AM
* 作者名称:末零
* 功能描述:射线检测功能
******************************************************************************/
using System;
using UnityEngine;
namespace LastZero.Utility
{
public class RayController {
/// <summary>
/// 开使射线检测
/// </summary>
/// <param name="cam"></param>
/// <param name="OnHitEvent"></param>
/// <param name="layer"></param>
public static void StartRay(Camera cam, bool requirement, Action OnHitEvent, string layer = "", float maxDistance = 1000, bool ifStop = true)
{
MyRay myRay = (new GameObject("Ray")).AddComponent<MyRay>();
myRay.cam = cam;
myRay.requirement = requirement;
myRay.OnHitEvent = OnHitEvent;
myRay.layer = layer;
myRay.maxDistance = maxDistance;
myRay.OpenRay();
}
/// <summary>
/// 射线检测
/// </summary>
/// <param name="cam"></param>
/// <param name="layerName"></param>
/// <returns></returns>
public static RaycastHit GetRayHit(Camera cam, string layer = "", float maxDistance = 1000)
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (layer == "")
Physics.Raycast(ray, out hit);
else
Physics.Raycast(ray, out hit, maxDistance, 1 << LayerMask.NameToLayer(layer));
Debug.DrawRay(cam.transform.position, hit.point);
return hit;
}
/// <summary>
/// 射线检测
/// </summary>
/// <param name="cam"></param>
/// <param name="layerName"></param>
/// <returns></returns>
public static RaycastHit GetRayHit(Camera cam, Vector3 direction, string layer = "", float maxDistance = 1000)
{
Ray ray = cam.ViewportPointToRay(direction);
RaycastHit hit;
if (layer == "")
Physics.Raycast(ray, out hit);
else
Physics.Raycast(ray, out hit, maxDistance, 1 << LayerMask.NameToLayer(layer));
Debug.DrawRay(cam.transform.position, hit.point);
return hit;
}
/// <summary>
/// 射线检测内部类
/// </summary>
private class MyRay : MonoBehaviour
{
public Camera cam;//检测用的摄像机
public bool requirement;//开启条件
public Action OnHitEvent;//要执行的事件
public string layer;//要检测的层
public float maxDistance;
public bool ifStop;//是否停止检测
private bool isRay;
private void Update()
{
if (isRay && requirement)
{
RaycastHit hit = GetRayHit(cam, layer, maxDistance);
if (OnHitEvent != null)
{
OnHitEvent();
if(ifStop == true)
Destroy(gameObject);
}
}
}
/// <summary>
/// 开启检测
/// </summary>
public void OpenRay()
{
isRay = true;
}
}
}
}
Unity射线检测功能
最新推荐文章于 2024-07-08 20:25:41 发布