Re: [請益] LayerMask+raycast問題

作者: Foremanytz (Foreman)   2016-10-25 13:15:41
你這邊遭遇的問題, 恐怕會需要你重新審視對Unity各種變數型態的認知
建議你多使用線上文件. 看懂它, 才能駕馭它.
以下分幾個部分說明你的狀況
Vector3 是 (x,y,z) 三個 float 的數值, 但是它可以是純量(座標)或向量(速度/方向)
甚至也可能是一組旋轉角.
Input.MousePosition 雖然回傳的格式 Vector3,
但它實際上只使用到 (x, y), z 經常是零, 而 (x,y) 是滑鼠位置在畫面的像素座標
假設你鏡頭設定是 720x480 全螢幕畫面, 則 x 在視窗內範圍是 0~719, y 是 0~479
滑鼠在畫面中間的話這個回傳的Vector3會變成 (359,239,0)
可是這並不代表你場景中 x=359, y=239, z=0 處有任何東西, 它只是個回傳值
Ray 是在3D空間中的一道光, 你需要給它起點終點座標, 例如:
Ray ray = new Ray(transform.position, transform.forward);
因為 forward 是該物件local的 +z 方向一公尺長的向量, 例子這道光只會長一公尺
把 Input.MousePosition 當作3D空間作標用 或者誤認 Ray 的運作方式都會錯
方向錯或者座標錯的話自然都偵測不到要點選的物件
除了空間座標的認知外, layer mask 的判斷方式也需要再確認
你的 wallLayer 除了需要參考 Unity 的 layer 列表, 需要
1. 在layer表內新增,
2. 也需要把場景內所有希望被這麼偵測到的物件都設定到該 Layer
3. wallLayer 是你自訂的 layer id, 因此通常是列表上第#8個, 像這張圖
https://docs.unity3d.com/uploads/Main/Layer-CreateNewLayer.png
假設你的 raycast 只要偵測#8的 layer, 那麼 wallLayer 要設為 256 (即2^8)
另例: 只偵測 #4 Water 的 layermask 要設定成 16 (即2^4)
同時要偵測任何與 #1 和 #3 兩層的layer碰撞, mask 要設定成 2^1+2^3 = 2+8 = 10
作者: yongb (火系見習魔法師 )   2016-10-25 22:54:00
感謝大大,我會重新思考ray+input.mouse的問題

Links booklink

Contact Us: admin [ a t ] ucptt.com