先用射线检测获取地上的一个点,再做范围检测。用到2个方法:
Physics.RaycastAll() // 穿透射线检测
Physics.OverlapSphere() // 球形范围检测
测试场景包含一个地面"Plane"和多个立方体:
快速阅读代码学习射线检测和范围检测:
using UnityEngine;
public class TestRangeSearch : MonoBehaviour
{
private void Update()
{
// 射线检测
if (Input.GetMouseButtonDown(0))
{
// 只检测到1个物体的射线检测
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, Mathf.Infinity, 1 << LayerMask.NameToLayer("Default")))
{
Debug.Log("射线检测:" + hitInfo.transform.name);
}
// 穿透射线检测,检测到射线所触碰到的所有物体
RaycastHit[] hitInfoArray = Physics.RaycastAll(ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("Default"));
if (hitInfoArray != null)
{
foreach (var item in hitInfoArray)
{
Debug.Log("射线检测(穿透):" + item.transform.name);
}
}
}
// 范围检测(穿透射到地面,取地面的点做范围检测)
if (Input.GetMouseButtonDown(1))
{
// 获得射线与地面相交的点
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hitInfoArray = Physics.RaycastAll(ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("Default"));
RaycastHit hitInfo = new RaycastHit();
foreach (var item in hitInfoArray)
{
if (item.transform.name == "Plane")
{
hitInfo = item;
break;
}
}
if (hitInfo.transform == null) { return; }
// 球形范围检测,获取3米内属于Default层的所有物体
Collider[] colliderArray = Physics.OverlapSphere(hitInfo.point, 3f, 1 << LayerMask.NameToLayer("Default"));
foreach (var item in colliderArray)
{
Debug.Log("范围检测:" + item.name);
}
}
}
}
吐槽一下CSDN的C#代码片不好看 ┑( ̄Д  ̄)┍