U3d 射线Ray

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

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

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

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

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

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

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

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

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):这个只是画一条线,方便进行观察,实际开发中并不需要,这是画一条从射线发射点到碰撞点的红色线段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡...
    壹米玖坤阅读 24,619评论 0 17
  • 知识点:1、可以通过 Physics.RaycastAll获取全部,然后通过tag或者name或者layer遍历再...
    罗斯基阅读 393评论 0 0
  • 本文来源于两年前我的一篇CSDN博客。CSDN博客本来就没写多少,现在也基本是到简书上混了。所以各位大大请自觉绕过...
    晓梦蝉君阅读 42,691评论 5 12
  • Unity3D塔防开发流程 配置环境及场景搭建 编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG Mo...
    Grape_葡萄阅读 3,001评论 1 3
  • 之所以称我家公公为"太上皇",是因为他是位传统的封建家长,在家里有着绝对的权威,是位"老子说了算"的老人。当...
    开颜_ca57阅读 510评论 2 4