c#-Unity3d沿平面移动对象(仅X和Z轴)

我有一个Unity3D项目.该项目具有我创建的预制件(桌面),并以飞机作为顶部.这架飞机有一个箱大肠菌和刚体.在桌面上,我还有另一个对象.我只想围绕桌面(X和Z轴)移动该对象.切勿将物体抬高到桌面上方.我将以下代码附加到我的对象上:

void onm ouseDown()
{
    Debug.Log("mouse down");
    screenPoint = Camera.main.WorldToScreenPoint(transform.position);
    offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}

void onm ouseDrag()
{
    Debug.Log("mouse drag");
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}

这样可以移动对象,但也可以将对象移动到桌面上方.有没有办法将物体放在桌子上?

解决方法:

听起来您正在寻找的是将mousePosition投影到表上. mousePosition最初位于屏幕空间(看起来就像您已被ScreenToWorldPoint识别),并且您需要从屏幕位置查找它命中的表的位置.

签出Physics.Raycast

有了这一点之后,就可以将对象的变换设置为该值,尽管您可能希望将该对象的垂直分量设置为一个恒定值,而不是结果值.

为此,您可能需要将表设置为碰撞层(如果尚未设置),并确保仅在查找该层.请注意,在Raycast中,layerMask是一个寄存器,由一个int表示(即[0 1 2..31]),因此您可以使用按位运算来选择图层,例如

layerMask = (1<<LayerMask.NametoLayer("Table"))

希望这可以帮助!

相关文章

前言 本文记录unity3D开发环境的搭建 unity安装 unity有中文...
前言 有时候我们希望公告牌跟随镜头旋转永远平行面向屏幕,同...
前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行...
前言 在unity中我们常用的获取鼠标点击的方法有: 1、在3D场...
前言 在之前的例子中,我们都没有用到unity的精髓,例如地形...
这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...