原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/17270107.html 加工的泛型類如下: using System; using System.Collections.Generic; using System.IO; using Syst ...
上面方塊分別添加
綠色 BoxCollider2D Rigidbody2D
黑色 BoxCollider Rigidbody
黃色 Rigidbody2D
藍色 無
紅色 BoxCollider2D
然後我們通過以下代碼設置一條2d射線用來測試
private LineRenderer line; Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z)); Ray2D ray = new Ray2D(screenToWorld, Vector2.up); Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f); RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f); if (info.collider != null)//如果發生了碰撞 { GameObject obj = info.collider.gameObject; Debug.Log(obj.name); }
結果是只有綠色和紅色可以接收到碰撞
然後我們重新寫一段3d射線用來新的測試
Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z - 0.5f)); RaycastHit hit; Ray ray = new Ray(screenToWorld, Vector3.forward); Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f); if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.gameObject.name); }
結果只有黑色可以檢測到
特性1:2d射線只能檢測2d碰撞體,同樣3d射線只能檢測3d碰撞體,射線只能對有對應有碰撞體的對象產生反饋
把複製一個3d黑色方塊把z軸減小1個單位,然後把原3d黑色方塊放大2.5倍,使得小方塊在後方
將綠色的2d方塊放大2倍置於紅色2d方塊之上
重覆上面的射線操作
小的黑色方塊無法被檢測到, 紅色方塊無法被檢測到
然後我們給大小黑色方塊,綠色紅色方塊分別添加mask 8, 9
// 2d部分 RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f, 1<<9); // 3d部分 if (Physics.Raycast(ray, out hit, 10f, 1<<9))
再去重覆上面的動作,小的黑色方塊可以被檢測到,紅色方塊也可以被檢測到
如果不設置長度,那麼射線是一條可以無限延長,任意穿透的線,在不設置指定圖層的情況下,只對離得最近的碰撞體優先反饋,當設置mask情況下,對指定mask的圖層進行反饋
有時候2d游戲可能需要針對滑鼠進行檢測,必然道具,或者人物,這個時候如果用3d射線指向外進行2d檢測是無法進行檢測的
因此,唯一辦法是隨時給滑鼠一個做的非常短比如0.05f的檢測射線,然後指向上,來替代,之後再通過mask來判斷需要檢測的範圍,ui還是物體,還是其他對象