Chinar 堅持將簡單的生活方式,帶給世人! (擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例) |
助力快速理解 Unity 中射線檢測的基本用法 爲新手節省寶貴的時間,避免採坑! |
Chinar 教程效果:
html
Unity 中提供了一種控制方案,用以檢測鼠標點在屏幕上後服務器
具體點在了 Unity 場景中,三維世界的哪一個點上ide
用法上多種多樣,在這裏就不一一列舉了,盡以檢測到的點來作一個總結函數
這種解決方案,就是射線檢測測試
經過鼠標點擊屏幕,由屏幕點,向Unity三維直接發射一條無限長的射線 spa
當檢測到碰撞物體後,會返回被碰撞物體的全部信息,以及交點信息等等….
這裏我用簡單的劃線來方便理解
.net
建立一個地板,和一個小球,做爲簡單的場景用於測試翻譯
講腳本掛載空物體上,並在 Inspector 面板將小球拖進Ball3d
具體代碼以下
code
using UnityEngine;
using UnityEngine.AI;
/// <summary>
/// 射線檢測類
/// </summary>
public class ChinarRayCast : MonoBehaviour
{
public Transform Ball; //小球(用來標記座標)
//設置射線在Plane上的目標點target
private Vector3 target;
void Update()
{
if (Input.GetMouseButton(1)) //點擊鼠標右鍵
{
object ray = Camera.main.ScreenPointToRay(Input.mousePosition); //屏幕座標轉射線
RaycastHit hit; //射線對象是:結構體類型(存儲了相關信息)
bool isHit = Physics.Raycast((Ray) ray, out hit); //發出射線檢測到了碰撞 isHit返回的是 一個bool值
if (isHit)
{
Debug.Log("座標爲:" + hit.point);
target = hit.point; //檢測到碰撞,就把檢測到的點記錄下來
}
}
//若是檢測到小球的座標 與 碰撞的點座標 距離大於0.1f,就移動小球的位置到 碰撞的點 :target
Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target;
//Move(target);//以上是Move函數的簡寫,此函數可不調用
}
/// <summary>
/// 移動方法
/// </summary>
/// <param name="target"></param>
void Move(Vector3 target)
{
if (Vector3.Distance(Ball.position, target) > 0.1f)
{
Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime);
}
//若是物體的位置和目標點的位置距離小於 0.1時直接等於目標點
else
Ball.position = target;
}
}
經過郵件點擊,能夠查看最終效果
射線檢測的牛逼之處在於,只要發出的射線與 帶有碰撞盒 的物體,都會發生碰撞
並能夠返回各類信息,例如被碰撞物體的 位置、名稱、法線 等等一系列的數據
另外能夠 自定義發出射線的 距離、影響到的圖層 等等
/// <summary>
/// 射線檢測
/// </summary>
public class ChinarRay : MonoBehaviour
{
void Update()
{
Ray ray = new Ray(transform.position, Vector3.down); //建立一條射線對象
RaycastHit hit; //碰撞信息對象結構體
bool isRaycast = Physics.Raycast(ray, out hit);
if (isRaycast)
{
Debug.DrawLine(ray.origin, hit.point, Color.green);
print("座標" + hit.transform.position);
print("點" + hit.point);
print("重心座標" + hit.barycentricCoordinate);
print("碰撞盒" + hit.collider);
print("距離" + hit.distance);
print("光線地圖座標" + hit.lightmapCoord);
print("法線" + hit.normal);
print("剛體" + hit.rigidbody);
print("紋理座標" + hit.textureCoord);
print("三角指數" + hit.triangleIndex);//等等
}
}
}
Chinar 提供一站式教程,閉眼式建立! 爲新手節省寶貴時間,避免採坑! |
先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)
1 —— 雲服務器超全購買流程 (新手必備!)
2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)
3—— Windows 服務器配置、運行、建站一條龍 !
4 —— Linux 服務器配置、運行、建站一條龍 !
本博客爲非營利性我的原創,除部分有明確署名的做品外,所刊登的全部做品的著做權均爲本人所擁有,本人保留全部法定權利。違者必究 對於須要複製、轉載、連接和傳播博客文章或內容的,請及時和本博主進行聯繫,留言,Email: ichinar@icloud.com 對於經本博主明確受權和許可以使用文章及內容的,使用時請註明文章或內容出處並註明網址