Physics.Raycast?簡介? ? ▼
Physics.Raycast?官方文檔中提供的參數(shù)如下??
?Physics.Raycast?從指定的位置發(fā)射一條射線,如果射線與物體發(fā)生碰撞返回true否則返回false
其中射線的起點(diǎn),方向是不可以省略的,其他參數(shù)可以省略
案例▼
- 第1,2個參數(shù)定義了一條射線的起點(diǎn)與方向
- 第3個參數(shù)為RaycastHi用以從射線獲取參數(shù)
RaycastHit hit;
void Update()
{
//如果檢測到物體
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
Debug.Log(hit.collider);//命中的 Collider。
//打印一條從物體到碰撞點(diǎn)的紅色射線,hit.point世界空間中射線命中碰撞體的撞擊點(diǎn)
Debug.DrawLine(transform.position, hit.point, Color.red);
}
else //沒有檢測到物體
{
//打印一條從物體出發(fā)的黃色射線
Debug.DrawRay(transform.position, transform.position + transform.forward * 100, Color.yellow);
}
}
運(yùn)行效果如下 可以看到射線與其他物體碰撞變成紅色 ▼?
也可以直接定義一條射線ray替換1,2條參數(shù)。下面的代碼與上面的代碼功能相同
Ray ray;
RaycastHit hit;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果檢測到物體
if (Physics.Raycast(ray, out hit))
{
Debug.Log(hit.collider);//輸出命中的 Collider。
//打印一條從物體到碰撞點(diǎn)的射線,hit.point世界空間中射線命中碰撞體的撞擊點(diǎn)
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //沒有檢測到物體
{
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
給射線設(shè)置一個檢測距離之后,射線距離之外的物體不會發(fā)生碰撞
?Physics.Raycast(ray, out hit,3)(可以看到射線碰撞到第一個方塊之后變?yōu)榧t色,碰撞到第二個方塊后沒有改變,這是因為第二個方塊超出了射線檢測范圍)▼
?給Physics.Raycast設(shè)置一個遮罩參數(shù)之后可以有選擇的忽略碰撞體。
(Physics.Raycast(ray, out hit, 10, mask)
這里我們給正方體Layer設(shè)置為Default,球形Layer設(shè)置為Sphere。之后選定Mask為Sphere
Ray ray;
RaycastHit hit;
public LayerMask mask;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果檢測到物體
if (Physics.Raycast(ray, out hit, 10, mask))
{
Debug.Log(hit.collider);//輸出命中的 Collider。
//打印一條從物體到碰撞點(diǎn)的射線,hit.point世界空間中射線命中碰撞體的撞擊點(diǎn)
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //沒有檢測到物體
{Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
?運(yùn)行效果如下,射線在接觸到正方體是沒有發(fā)生改變,接觸到球形時變?yōu)榧t色▼
為Physics.Raycast設(shè)置一個QueryTriggerInteraction.Ignore參數(shù)之后,射線不在檢測觸發(fā)器
?▼操作如下▼
為紅色方塊選擇Is Triggr屬性。藍(lán)色方塊不選。
- ?QueryTriggerInteraction.Collide 檢測觸發(fā)器
- ?QueryTriggerInteraction.Ignore 不檢測觸發(fā)器
Ray ray;
RaycastHit hit;
public LayerMask mask;
void Update()
{
ray = new Ray(transform.position, transform.forward);
//如果檢測到物體
//QueryTriggerInteraction.Collide 檢測觸發(fā)器
//QueryTriggerInteraction.Ignore 不檢測觸發(fā)器
if (Physics.Raycast(ray, out hit, 10, mask, QueryTriggerInteraction.Ignore))
{
Debug.Log(hit.collider);//輸出命中的 Collider。
//打印一條從物體到碰撞點(diǎn)的射線,hit.point世界空間中射線命中碰撞體的撞擊點(diǎn)
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100,Color.red);
}
else //沒有檢測到物體
{
Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.yellow);
}
}
運(yùn)行效果如下▼ (射線碰撞到紅色方塊時沒有發(fā)生改變,碰撞到藍(lán)色方塊變?yōu)榧t色)
Physics.Raycast?的使用? ?▼
- 配合尋路導(dǎo)航系統(tǒng),做移動到鼠標(biāo)點(diǎn)擊位置功能
---Unity中尋路導(dǎo)航的基本使用文章來源:http://www.zghlxwxcb.cn/news/detail-716177.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-716177.html
using UnityEngine;
using UnityEngine.AI;
public class MoveToClickPoint : MonoBehaviour {
NavMeshAgent agent;
void Start() {
agent = GetComponent<NavMeshAgent>();
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
RaycastHit hit;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
agent.destination = hit.point;
}
}
}
}
到了這里,關(guān)于Unity中Physics.Raycast 的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!