Unity射線檢測的用法總結


RayCast 射線檢測


本文提供全流程,中文翻譯。

Chinar 堅持將簡單的生活方式,帶給世人!

(擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例)



Chinar —— 心分享、心創新!

助力快速理解 Unity 中射線檢測的基本用法

為新手節省寶貴的時間,避免采坑!


Chinar 教程效果:
這里寫圖片描述



全文高清圖片,點擊即可放大觀看 (很多人竟然不知道)


1

Raycast —— 射線檢測


Unity 中提供了一種控制方案,用以檢測鼠標點在屏幕上后

具體點在了 Unity 場景中,三維世界的哪個點上

用法上多種多樣,在這里就不一一列舉了,盡以檢測到的點來做一個總結

這種解決方案,就是射線檢測

通過鼠標點擊屏幕,由屏幕點,向Unity三維直接發射一條無限長的射線

當檢測到碰撞物體后,會返回被碰撞物體的所有信息,以及交點信息等等….
舉個栗子黑白88
這里我用簡單的划線來方便理解
這里寫圖片描述


2

Scritps —— 腳本


創建一個地板,和一個小球,作為簡單的場景用於測試

講腳本掛載空物體上,並在 Inspector 面板將小球拖進Ball

具體代碼如下
舉個栗子黑白88

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;
    }
}

3

Effect —— 效果


通過郵件點擊,可以查看最終效果
舉個栗子黑白88
這里寫圖片描述


4

Extend —— 擴展


射線檢測的牛逼之處在於,只要發出的射線與 帶有碰撞盒 的物體,都會發生碰撞

並可以返回各種信息,例如被碰撞物體的 位置、名稱、法線 等等一系列的數據

另外可以 自定義發出射線的 距離、影響到的圖層 等等
舉個栗子黑白88

/// <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);//等等
        }
    }
}

支持

May Be —— 搞開發,總有一天要做的事!


擁有自己的服務器,無需再找攻略!

Chinar 提供一站式教程,閉眼式創建!

為新手節省寶貴時間,避免采坑!


先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)


1 —— 雲服務器超全購買流程 (新手必備!)

2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)

3—— Windows 服務器配置、運行、建站一條龍 !

4 —— Linux 服務器配置、運行、建站一條龍 !





技術交流群:806091680 ! Chinar 歡迎你的加入


END

本博客為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究

對於需要復制、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯系,留言,Email: ichinar@icloud.com

對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM