U3d 射线Ray

现在想要实现这样一个需求:当鼠标放到物体上的时候,让物体的大小发生改变,并且不停的旋转,当鼠标点击进行拖动的时候,让物体随着鼠标进行拖动。

1.首先呢,大小和旋转其实很好做,只不过是改变缩放度大小,还有让它随着时间改变rotation而已。

U3d 射线Ray_第1张图片

OnMouseEnter():当鼠标进入的时候,当鼠标进入显示物体边缘的一瞬间,只执行一次。

OnMouseExit():当鼠标退出的时候,当鼠标退出显示物体边缘的一瞬间执行,只执行一次。

OnMouseOver():当鼠标覆盖在物体上的时候,只要鼠标还覆盖在物体上,就会不停的执行,多次执行。

如此就能实现旋转和缩放。

2.旋转和缩放完成了,那么接下来就该让物体随着拖动鼠标进行移动了。

在这里,使用射线可以实现。从摄像机直接发射出一条射线,打到屏幕内物体上,就能检测到对应鼠标的点应该在3d世界中具体在哪个位置。

U3d 射线Ray_第2张图片

OnMouseDrag():当鼠标拖动的时候执行,单机鼠标左键,拖动物体的时候触发,会一直执行,多次执行。

Input.mousePosition:鼠标所在位置,鼠标在屏幕上的位置。

Ray ray = camera.ScreenPointToRay(Input.mousePosition);从照相机射出来的射线

if (Physics.Raycast(ray, out hit, 1000f, 1<<8))当成功发出射线,一些碰撞信息都会保存在hit中,在这里射线的长度是1000,检测和射线碰撞的层是第八层。

LayerMask.NameToLayer("Terrain")我这里自定义第八层layer为Terrain,所以打印出来的信息也是8,之前想要将这个放到Physics.Raycast最后一个参数,发现并不好使。试验后才发现最后一个参数是通过位移得来的。

当发生射线和地面碰撞的时候,就把改变物体的位置,这样就能够让物体随着鼠标进行拖动了。

Debug.DrawLine(ray.origin, hit.point, Color.red):这个只是画一条线,方便进行观察,实际开发中并不需要,这是画一条从射线发射点到碰撞点的红色线段。

你可能感兴趣的:(U3d 射线Ray)