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