像鼠标位置的移动一样在x轴上移动一个对象(Unity3d)
Move an object on x axis like the movement of the mouse position (Unity3d)
当我在屏幕上的任意位置单击时,我希望能够像鼠标位置一样在 x 轴上移动我的对象。这样我就可以拖动对象,而不是跳到点击位置只是为了跟随移动。
所以我做了两个脚本。在第一个脚本中,问题是对象直接跳转到我单击的位置。第二个脚本工作正常,但单击后,对象总是从我可以拖动它的相同位置开始。
//1st script
public Vector3 screenPoint;
private float? mousePoint;
private float mousePoint2;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePoint = Input.mousePosition.x;
mousePoint2 = Input.mousePosition.x;
screenPoint = Camera.main.WorldToScreenPoint(transform.position);
}
else if (Input.GetMouseButtonUp(0))
mousePoint = null;
if (mousePoint != null)
{
Vector3 curScreenPoint = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
transform.position = new Vector3(curScreenPoint.x, transform.position.y, transform.position.z);
}
}
}
//2nd script
private float difference;
private float? mousePoint;
private float mouseDistance1, mouseDistance2;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePoint = Input.mousePosition.x;
mouseDistance1 = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0))
mousePoint = null;
if (mousePoint != null)
{
float mouseDistance2 = Input.mousePosition.x;
difference = mouseDistance2 - mouseDistance1;
transform.position = new Vector3((transform.position.x + difference) / 188, transform.position.y, transform.position.z);
}
}
}
您在脚本 #2 中的想法是正确的,但实现起来似乎有点不对劲。每一帧,当按住鼠标(和 mousePoint != null
)时,您减去鼠标原始 x
位置与其当前点之间的差异。然后,将该差异添加到对象的位置。这意味着,即使鼠标在移动后保持在一个位置,对象将继续移动,因为鼠标增量没有改变。
要解决此问题,您应该每帧重置鼠标增量,而不是让位置更改为 "compound." 此外,您应该删除 mouseDistance2
的私有声明 - 您已经定义了它两次。因此,您的代码应如下所示(省略未使用的变量):
private float? lastMousePoint = null;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
lastMousePoint = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0)) {
lastMousePoint = null;
}
if (lastMousePoint != null)
{
float difference = Input.mousePosition.x - lastMousePoint.Value;
transform.position = new Vector3(transform.position.x + (difference / 188) * Time.deltaTime, transform.position.y, transform.position.z);
lastMousePoint = Input.mousePosition.x;
}
}
通过存储最后一个鼠标位置,您可以计算鼠标在最后一帧和当前帧之间移动的距离,然后将其添加到对象的位置。另外,请确保包含 Time.deltaTime
以便您的代码不依赖于帧率。希望对您有所帮助 - 如果您有任何其他问题,请告诉我。
最好从最后一条语句中删除 Time.deltatime 以便玩家可以顺利移动
private float? lastMousePoint = null;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
lastMousePoint = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0))
{
lastMousePoint = null;
}
if (lastMousePoint != null)
{
float difference = Input.mousePosition.x - lastMousePoint.Value;
transform.position = new Vector3(transform.position.x + (difference / 188) , transform.position.y, transform.position.z);
lastMousePoint = Input.mousePosition.x;
}
}
当我在屏幕上的任意位置单击时,我希望能够像鼠标位置一样在 x 轴上移动我的对象。这样我就可以拖动对象,而不是跳到点击位置只是为了跟随移动。
所以我做了两个脚本。在第一个脚本中,问题是对象直接跳转到我单击的位置。第二个脚本工作正常,但单击后,对象总是从我可以拖动它的相同位置开始。
//1st script
public Vector3 screenPoint;
private float? mousePoint;
private float mousePoint2;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePoint = Input.mousePosition.x;
mousePoint2 = Input.mousePosition.x;
screenPoint = Camera.main.WorldToScreenPoint(transform.position);
}
else if (Input.GetMouseButtonUp(0))
mousePoint = null;
if (mousePoint != null)
{
Vector3 curScreenPoint = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
transform.position = new Vector3(curScreenPoint.x, transform.position.y, transform.position.z);
}
}
}
//2nd script
private float difference;
private float? mousePoint;
private float mouseDistance1, mouseDistance2;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePoint = Input.mousePosition.x;
mouseDistance1 = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0))
mousePoint = null;
if (mousePoint != null)
{
float mouseDistance2 = Input.mousePosition.x;
difference = mouseDistance2 - mouseDistance1;
transform.position = new Vector3((transform.position.x + difference) / 188, transform.position.y, transform.position.z);
}
}
}
您在脚本 #2 中的想法是正确的,但实现起来似乎有点不对劲。每一帧,当按住鼠标(和 mousePoint != null
)时,您减去鼠标原始 x
位置与其当前点之间的差异。然后,将该差异添加到对象的位置。这意味着,即使鼠标在移动后保持在一个位置,对象将继续移动,因为鼠标增量没有改变。
要解决此问题,您应该每帧重置鼠标增量,而不是让位置更改为 "compound." 此外,您应该删除 mouseDistance2
的私有声明 - 您已经定义了它两次。因此,您的代码应如下所示(省略未使用的变量):
private float? lastMousePoint = null;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
lastMousePoint = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0)) {
lastMousePoint = null;
}
if (lastMousePoint != null)
{
float difference = Input.mousePosition.x - lastMousePoint.Value;
transform.position = new Vector3(transform.position.x + (difference / 188) * Time.deltaTime, transform.position.y, transform.position.z);
lastMousePoint = Input.mousePosition.x;
}
}
通过存储最后一个鼠标位置,您可以计算鼠标在最后一帧和当前帧之间移动的距离,然后将其添加到对象的位置。另外,请确保包含 Time.deltaTime
以便您的代码不依赖于帧率。希望对您有所帮助 - 如果您有任何其他问题,请告诉我。
最好从最后一条语句中删除 Time.deltatime 以便玩家可以顺利移动
private float? lastMousePoint = null;
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
lastMousePoint = Input.mousePosition.x;
}
else if (Input.GetMouseButtonUp(0))
{
lastMousePoint = null;
}
if (lastMousePoint != null)
{
float difference = Input.mousePosition.x - lastMousePoint.Value;
transform.position = new Vector3(transform.position.x + (difference / 188) , transform.position.y, transform.position.z);
lastMousePoint = Input.mousePosition.x;
}
}