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

标签 c# unity3d

我有一个 Unity3D 项目。这个项目有一个我创建的预制件(一个桌面),它的顶部是一个平面。这架飞机有一个箱式对撞机和刚体。在桌面上,我还有另一个对象。我只想围绕桌面移动此对象(X 和 Z 轴)。不得将物体升高到桌面以上。我将此代码附加到我的对象:

void OnMouseDown()
{
    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 OnMouseDrag()
{
    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;
}

这会四处移动对象,但也会将对象移动到桌面上方。有没有办法让物体保持在 table 上?

最佳答案

听起来您正在寻找的是将 mousePosition 投影到 table 上。 mousePosition 最初在屏幕空间中(看起来你已经用 ScreenToWorldPoint 识别了),你需要从屏幕位置找到它击中的表格的位置。

查看 Physics.Raycast

一旦有了那个点,您就可以将对象的变换设置为该点,尽管您可能希望将垂直分量设置为该对象的常量值而不是结果值。

为此,您可能需要将表格设置为碰撞层(如果您还没有设置的话)并确保您只是在寻找它。请注意,对于 Raycast,layerMask 是一个寄存器,由一个 int 表示(即 [0 1 2..31]),因此您可以使用按位操作来选择图层,例如

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

希望这对您有所帮助!

关于c# - Unity3d 沿平面移动对象(仅限 X 和 Z 轴),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949826/

相关文章:

c# - 升级到 Excel 2007 - 应用程序仍使用 2003 互操作

c# - 在同一行 2 上对齐 html 输入

ios - 在 iOS 和 Android 上使用 Unity3D 读取 AppLink 数据

unity3d - Unity 在新计算机上因 DirectX 而崩溃

c# - 如何阻止游戏对象在每一帧重生?

Unity3D 中的旋转

c# - 为什么这个赋值不是线程安全的?

c# - 已经有一个打开的 DataReader 与此命令关联,必须先在 C# 中将其关闭

unity3d - 在 Unity3D C# 中签署 AWS Api 网关请求

c# - 比较这两个列表的最有效方法是什么?