c# - 使用鼠标光标在特定轴上拖动 3D 对象

标签 c# unity3d math draggable

我正在尝试构建一个简单的游戏,用户可以在其中放置一些元素并四处移动它们。

我想要的是让用户可以根据自己的决定在特定轴上移动对象。

非常类似于 unity 中的移动小工具。

我知道如何使用鼠标拖动世界中的对象,但我如何在特定轴(例如 Z 轴)上移动。

我尝试读取“鼠标 X”值,但它只适用于特定视角,如果我从不同角度看对象,对象将无法正确移动。

我做的是这样的:

private void OnMouseDrag()
{
   transform.Translate(moveAxis * Input.GetAxis("Mouse X");
}

其中 moveAxis 是代表轴的 Vector3,脚本附加到箭头 gizmo。

最佳答案

这是一种方法:

转换 moveAxis从本地空间到屏幕空间的方向。确保你有一个缓存 Camera字段/变量,因为调用 Camera.main和/或 GetComponent<Camera>是一个缓慢的操作:

// Get world direction from moveAxis
Vector3 worldDirection = transform.TransformDirection(moveAxis);

Vector2 screenDirection =   camera.WorldToScreenPoint(worldDirection + transform.position) 
                          - camera.WorldToScreenPoint(transform.position);

// optionally, normalize the vector in screen space.
// screenDirection.Normalize();

如果您不希望屏幕上轴的角度影响拖动的速度,您可以标准化屏幕方向。您可能不想对其进行标准化,但如果您想要不同的感觉,请尝试一下。

然后,计算坐标轴方向与鼠标移动的点积,计算出一个量级:

Vector2 mouseMovement = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));

float translateMagnitude = Vector2.Dot(mouseMovement, screenDirection);

mouseMovement.x左边必须为负,右边必须为正,mouseMovement.y向下必须为负,向上必须为正。如果任一轴反转,则将该轴的值乘以 -1f .

这边,translateMagnitude如果鼠标沿屏幕空间中的轴方向移动,则为正,如果向其移动则为负。

然后,将幅度乘以一些可配置的灵敏度因子,然后乘以 Translate 的轴向量调用:

public float translateSensitivity; 

...

transform.Translate(moveAxis * translateSensitivity * translateMagnitude);

关于c# - 使用鼠标光标在特定轴上拖动 3D 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380013/

相关文章:

python - 2 个地 block 的交集(鼠尾草)

c# - 使用 C# 访问 Excel 电子表格有时会为某些单元格返回空白值

c# - 如何修复 IIS 上的 ASP.Net Core 404 错误?

c# - 即使鼠标未移动,PictureBox 中的 MouseMove 事件也会连续触发

c# - 无法重新实例化/重生我在 Unity3D 中销毁的对象

c# - 使用 RegEx 解析和编辑统一动画剪辑

unity3d - 无法发布我的 Android Unity 应用程序 : APK in debug mode

c# - ASP.NET MVC - 在部分或主体的布局模板中设置变量

Python:快速范围求和()

javascript - 将两个变量加在一起