国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity 的射線檢測

這篇具有很好參考價值的文章主要介紹了Unity 的射線檢測。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Unity版本2020.3.32f1c1

目錄

Ray

RaycastHit

Physics.Raycast()

RaycastHit[]

??Layer

應用

1.對Bad層級的物體進行著色

2.從相機發(fā)射射線與地面進行射線交互

3.運動的物體在場景中進行避障

總結(jié)

參考資料


Ray

原理是發(fā)射一條射線,傳入起始點和起始方向當做射線的起點和方向。

 Ray ray = new Ray(transform.position, transform.forward);

在OnDrawGizmos()函數(shù)中畫出來

  private void OnDrawGizmos()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        Gizmos.color = Color.blue;

        Gizmos.DrawRay(ray);

    }    

RaycastHit

之后我們在場景中添加兩個包含Collider的物體,我希望其中一個物體發(fā)出射線可以感知到另一個物體。Unity中通過RaycastHit結(jié)構(gòu)體來存儲射線的交互信息,結(jié)構(gòu)如下所示:

unity 射線檢測,unity,游戲引擎,游戲程序

Physics.Raycast()

Physics.Raycast()返回true,可以用它來表示射線是否與游戲?qū)ο蟀l(fā)生交互.Physics.Raycast一共有16個重載方法,可以按需選擇。

public static bool Raycast(Ray ray, out RaycastHit hitInfo, [Internal.DefaultValue("Mathf.Infinity")] float maxDistance, [Internal.DefaultValue("DefaultRaycastLayers")] int layerMask, [Internal.DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction);?

上面的參數(shù)分別是射線,射線交互結(jié)構(gòu)體,檢測的最大距離(默認最大),層模板(默認所有),查詢觸發(fā)器交互(默認全局)。

如果設置了LayerMask參數(shù)的話,射線只會和游戲?qū)ο笫沁@個Layer的交互,其他的游戲?qū)ο蟛粫c射線發(fā)生交互;QueryTriggerInteraction默認參數(shù)表示查詢使用全局 Physics.queriesHitTriggers 設置,還有兩個可選值,Ignore表示忽略,當游戲?qū)ο蟮腃ollider組件下的Is Trigger被勾選后,射線檢測也將不會與其交互;Collider參數(shù)表示始終報告觸發(fā)器命中。

if (Physics.Raycast(ray, out hit,Mathf.Infinity,badMask,QueryTriggerInteraction.Ignore))
        {
            Gizmos.color = Color.green; 
            Gizmos.DrawLine(transform.position, hit.point);
        }

RaycastHit[]

除了聲明單個RaycastHit外,還可以設置RaycastHit[]數(shù)組,Physcis.RaycastAll可以獲得所有的與射線交互的信息,這里我傳入了第三個參數(shù)LayerMask,將下圖中紅框內(nèi)的物體的層級設置為了badMask,這樣射線檢測只會與這個層級的物體發(fā)生交互,最后打印出了三個物體的名稱,以及RaycastHit[]數(shù)組的大小。

        RaycastHit[] hits;

        hits = Physics.RaycastAll(ray,Mathf.Infinity,badMask);
        for (int i = 0; i < hits.Length; i++)
        {
            Debug.Log(hits[i].collider.gameObject.name);
        }
        Debug.Log(hits.Length);

unity 射線檢測,unity,游戲引擎,游戲程序

unity 射線檢測,unity,游戲引擎,游戲程序

?Layer

?在寫的時候發(fā)現(xiàn)從不同地方獲取到的LayerMask的int值不同。

[SerializeField] private LayerMask badMask這樣通過面板獲得的值是2^value ,value是在Unity面板中Layer的數(shù)值,插一嘴Layer中用四個字節(jié)也就是32位來表示,每一個Layer占據(jù)其中一位,如此來說badMask.value返回的就是十進制表示的數(shù);通過結(jié)構(gòu)體hit.collider.gameObject.layer獲得的就是上文中說的value,也就是占據(jù)哪一位的數(shù)值。

如果想要比較二者是否相同,需要進行轉(zhuǎn)換:

if (Mathf.Pow(2,(hit.collider.gameObject.layer)) == badMask.value)

unity 射線檢測,unity,游戲引擎,游戲程序

應用

1.對Bad層級的物體進行著色

看效果圖,有的沒有被著色,是因為被前面的對象遮住了,一個解決辦法是順帶更改前面對象的層級,讓它不再被射線交互。

unity 射線檢測,unity,游戲引擎,游戲程序

public class Sphere : MonoBehaviour
{
    [SerializeField] private Material recordBad;
    [SerializeField] private Material originBad;
    [SerializeField] private LayerMask badMask;

    private void OnDrawGizmos()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        Gizmos.color = Color.blue;

        //Gizmos.DrawRay(ray);

        RaycastHit hit;
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(transform.position, transform.TransformPoint(Vector3.forward * 10));
        //Gizmos.color = Color.black;
        //Gizmos.DrawLine(transform.position, Vector3.forward);

        RaycastHit[] hits;

        hits = Physics.RaycastAll(ray,Mathf.Infinity,badMask);
        for (int i = 0; i < hits.Length; i++)
        {
            Debug.Log(hits[i].collider.gameObject.name);
        }
        Debug.Log(hits.Length);

        if (Physics.Raycast(ray, out hit,Mathf.Infinity,badMask,QueryTriggerInteraction.Ignore))
        {
            Gizmos.color = Color.green; 
            Gizmos.DrawLine(transform.position, hit.point);
            hit.collider.gameObject.GetComponent<Renderer>().material = recordBad;
        }
    }
}

2.從相機發(fā)射射線與地面進行射線交互

        Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, ground))
        {
            Vector3 point =  hit.point;
            controller.LookAt(point);
        }
        public void LookAt(Vector3 lookPoint)
    {
        Vector3 heightCorrectedPoint = new Vector3(lookPoint.x, transform.position.y, lookPoint.z);
        transform.LookAt(heightCorrectedPoint);
    }

還有一種方式是通過Plane來接收射線,返回的distance表示沿射線與平面相交的距離。如果射線平行于平面,函數(shù)返回false并設置enter為零。如果射線指向與平面相反的方向,則函數(shù)返回false并設置enter為沿射線的距離(負值)。

        Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
        float distance;
        Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
        if (groundPlane.Raycast(ray, out distance))
        {
            Vector3 point = ray.GetPoint(distance);
            //Debug.DrawLine(ray.origin, point, Color.red);
            controller.LookAt(point);
        }

射線檢測

3.運動的物體在場景中進行避障

unity 射線檢測,unity,游戲引擎,游戲程序

以物體為圓心,規(guī)定半徑和生成的點的數(shù)量,近似以點來近似球表面

public static class BoidHelper {

    const int numViewDirections = 300;
    public static readonly Vector3[] directions;

    static BoidHelper () {
        directions = new Vector3[BoidHelper.numViewDirections];

        float goldenRatio = (1 + Mathf.Sqrt (5)) / 2;
        float angleIncrement = Mathf.PI * 2 * goldenRatio;

        for (int i = 0; i < numViewDirections; i++) {
            float t = (float) i / numViewDirections;
            //對應二維的半徑R
            float inclination = Mathf.Acos (1 - 2 * t);
            float azimuth = angleIncrement * i;

            //球坐標轉(zhuǎn)直角坐標
            float x = Mathf.Sin (inclination) * Mathf.Cos (azimuth);
            float y = Mathf.Sin (inclination) * Mathf.Sin (azimuth);
            float z = Mathf.Cos (inclination);
            directions[i] = new Vector3 (x, y, z);
        }
    }

}
 Vector3 ObstacleRays()
    {
        rayDirections = BoidHelper.directions;
        if (rayDirections != null)
        {
            flag = true;
        }

        for (int i = 0; i < rayDirections.Length; i++)
        {
            Vector3 dir = cachedTransform.TransformDirection(rayDirections[i]);
            Ray ray = new Ray(position, dir);
            if (!Physics.SphereCast(ray, settings.boundsRadius, settings.collisionAvoidDst, settings.obstacleMask))
            {
                return dir;
            }
        }

        return forward;
    }
 void OnDrawGizmosSelected()
    {
        if (flag)
        {
            DrawGizmos();
        }
    }

    void DrawGizmos()
    {
        Debug.LogFormat("進入DraGizmos");
        Debug.LogFormat("進入DraGizmos Flag");
        Gizmos.color = Color.red;
        foreach (var go in rayDirections)
            Gizmos.DrawSphere(position + go, 0.02f);
        Gizmos.color = Color.green;
        foreach (var go in rayDirections)
        {
            Vector3 dir = cachedTransform.TransformDirection(go) * SpherePointsRadius;
            Gizmos.DrawSphere(position + dir, radius);
        }


    }

總結(jié)

  • 想要一個物體被射線檢測到,就必須加上Collider組件,Is Trigger并不影響射線檢測
  • 生成一個射線需要五個參數(shù),起始點,方向,碰撞信息結(jié)構(gòu)體,范圍距離,檢測層
    • 起始點一般使用transform.position來表示
    • 方向一般使用transform.forward,表示當前物體正前方
    • 碰撞信息使用RaycastHit結(jié)構(gòu)體來存貯,需要事先聲明
    • 檢測范圍是float型,可不寫,默認無限長
    • 檢測層可不寫,默認全檢測
  • 如果你使用Debug.DrawLine()畫了一條線而沒有顯示出來,不妨看看Gizmos有沒有被關(guān)閉
  • Raycast返回值是Bool,而RaycastAll返回值則是RaycastHit結(jié)構(gòu)體數(shù)組
  • 混淆點
    • Ray是一個類,表示射線
    • RaycastHit是一個結(jié)構(gòu)體,記錄射線的碰撞信息
    • Raycast和RaycastAll是函數(shù),使用射線來檢測碰撞,通過Physics來調(diào)用

參考資料

夢小天幼:詳解Unity中的射線與射線檢測

Coding Adventure: Boids文章來源地址http://www.zghlxwxcb.cn/news/detail-725477.html

到了這里,關(guān)于Unity 的射線檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • unity中的射線碰撞檢測

    在Unity中,射線碰撞檢測是一種常用的技術(shù),通常用于確定射線與場景中的物體是否相交,并獲取相交點的信息。 1.創(chuàng)建射線: 使用 Ray 類或 RaycastHit 結(jié)構(gòu)體創(chuàng)建射線。 Ray 表示射線的起點和方向,而 RaycastHit 用于存儲射線與物體相交的信息,如相交點、法線等。 2.發(fā)射射線:

    2024年03月17日
    瀏覽(22)
  • 【超級入門】Unity如何實現(xiàn)畫射線+射線檢測+NavMeshAgent結(jié)合

    【超級入門】Unity如何實現(xiàn)畫射線+射線檢測+NavMeshAgent結(jié)合

    ? ? ? ?“射線檢測 是在3D數(shù)字世界里選擇某個特定物體常用的一種技術(shù),如在3D、VR游戲中檢測子彈命中敵人情況或者從地上撿起一支槍,這都要用到 射線檢測 , 射線檢測 是在3D數(shù)字空間中選擇虛擬物體的最基本方法。 ” 效果: 我們先創(chuàng)建一個物體,掛腳本 RayTest ,代碼

    2024年02月15日
    瀏覽(21)
  • 第二十八章 Unity射線檢測

    第二十八章 Unity射線檢測

    本章節(jié)我們介紹一下射線。射線就是從一個固定點向一個方向發(fā)射出一條直線,在發(fā)射過程中需要判斷該射線有沒有與游戲物體發(fā)送碰撞。射線既可以用來檢測射擊游戲中武器指向目標;又可以判斷鼠標是否指向游戲物體。射線的創(chuàng)建方式,一般使用代碼來實現(xiàn)。接下來,我

    2024年02月11日
    瀏覽(35)
  • Unity3d 射線檢測

    Unity3d 射線檢測

    射線碰撞單個物體: 方式1:從攝像機向世界發(fā)射一條射線,通常用于檢測鼠標指針有沒有選擇物體 方式2:創(chuàng)建從一個點到一個方向的射線 聲明一個射線碰撞信息類 //進行碰撞檢測并返回結(jié)果,檢測信息會寫入碰撞信息類 射線碰撞多個物體: 例:可以用射線檢測人物與地面

    2024年02月08日
    瀏覽(23)
  • Unity 射線與碰撞范圍檢測【踩坑記錄】

    Unity 射線與碰撞范圍檢測【踩坑記錄】

    射線檢測在2D和3D的區(qū)別比較大 一定要加上對應的Collider組件 對應的函數(shù)只檢測對應的Collider, Physics.Raycast 是不會檢測到Collider 2D的(這個讓我有一次debug了好久才發(fā)現(xiàn)) 對應API如下 可以使用 Debug.DrawLine(Vector3 origin,Vector3 destination,Color color) 和 Debug.DrawRay(Vector3 origin,Vector3 dir

    2023年04月08日
    瀏覽(24)
  • Unity 之`Physics.Raycast()`方法,射線檢測

    Unity 之`Physics.Raycast()`方法,射線檢測

    當你在Unity中使用 Physics.Raycast() 方法時,你實際上是在進行一種射線檢測,以查看一條射線是否與場景中的碰撞體相交。這可以用來實現(xiàn)很多不同的功能,如點擊選擇物體、射擊命中檢測等。以下是 Physics.Raycast() 方法的詳細介紹: 參數(shù)解釋: origin :射線的起點(3D世界坐標

    2024年02月11日
    瀏覽(34)
  • Unity 中檢測射線穿過的所有的物體

    Unity 中檢測射線穿過的所有的物體

    ?在開發(fā)中 有個需求,射線要檢測所有穿過的物體。 代碼如下: ? 運行結(jié)果 ?

    2024年02月14日
    瀏覽(22)
  • Unity在物體內(nèi)部發(fā)射射線檢測不到物體的解決方式

    Unity在物體內(nèi)部發(fā)射射線檢測不到物體的解決方式

    在Unity2018.1.18上不大好用。

    2024年02月15日
    瀏覽(19)
  • Unity UGUI的PhysicsRaycaster (物理射線檢測)組件的介紹及使用

    PhysicsRaycaster是Unity UGUI中的一個組件,用于在UI元素上進行物理射線檢測。它可以檢測鼠標或觸摸事件是否發(fā)生在UI元素上,并將事件傳遞給相應的UI元素。 PhysicsRaycaster通過發(fā)射一條射線來檢測UI元素。當射線與UI元素相交時,PhysicsRaycaster會將事件傳遞給相應的UI元素。 Event

    2024年02月15日
    瀏覽(24)
  • 【游戲開發(fā)實戰(zhàn)】Unity實現(xiàn)類似GitHub地球射線的效果(LineRenderer | 貝塞爾曲線)

    【游戲開發(fā)實戰(zhàn)】Unity實現(xiàn)類似GitHub地球射線的效果(LineRenderer | 貝塞爾曲線)

    一、前言 嗨,大家伙,我是新發(fā)。 好久不見,這是2022年第一篇博客,今天有同學私信我,問我在 Unity 中如何實現(xiàn)這種地球輻射線的效果, 這一看,我就想到了 GitHub 主頁的地球射線, 那么,今天就來講講如何實現(xiàn)這個效果吧~ 本文最終效果如下: 本文工程源碼見文章末尾

    2024年02月06日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包