如何在Unity3D中的X&Z轴上拖放?

问题描述 投票:0回答:1

我一直试图在Unity 3D中拖放对象在移动设备上工作。我希望它是这样的,当您在屏幕上拖动时,对象在z轴上移动,如果您向上或向下拖动屏幕,对象将在z轴而不是y中移动。这是我目前的代码......

public class MovementController : MonoBehaviour
{
Vector3 dist;
Vector3 startPos;
float posX;
float posZ;
float posY;
void OnMouseDown()
{
    startPos = transform.position;
    dist = Camera.main.WorldToScreenPoint(transform.position);
    posX = Input.mousePosition.x - dist.x;
    posY = Input.mousePosition.y - dist.y;
    posZ = Input.mousePosition.z - dist.z;
}

void OnMouseDrag()
{
    float disX = Input.mousePosition.x - posX;
    float disY = Input.mousePosition.y - posY;
    float disZ = Input.mousePosition.z - posZ;
    Vector3 lastPos = Camera.main.ScreenToWorldPoint(new Vector3(disX, disY, disZ));
    transform.position = new Vector3(lastPos.x, startPos.y, lastPos.z);

}
}

然而,这使得物体仅在z轴上移动很小的量,我必须直接到屏幕的顶部才能移动一点。有没有更好的方法来做到这一点,因为我似乎无法找到一种方法来更改代码来解决这个问题。谢谢。

c# visual-studio unity3d
1个回答
1
投票

你混淆了变量的目的 - 他们没有包含他们的名字描述的值:)

用于XY平面:

public class MovementController : MonoBehaviour
{
    Vector3 startPos;
    Vector3 dist;

    void OnMouseDown()
    {
        startPos = Camera.main.WorldToScreenPoint(transform.position);
        dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z));
    }

    void OnMouseDrag()
    {
        Vector3 lastPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z);
        transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
    }
}

或者,如果您更喜欢XZ飞机:

public class MovementController : MonoBehaviour
{
    Vector3 startPos;
    Vector3 dist;

    void OnMouseDown()
    {
        startPos = Camera.main.WorldToScreenPoint(transform.position);
        dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y));
    }

    void OnMouseDrag()
    {
        Vector3 lastPos = new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y);
        transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
    }
}

编辑:

控制位置变化多少,改变:

transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;

至:

Vector3 targetPos = Camera.main.ScreenToWorldPoint(lastPos) + dist;
Vector3 dir = targetPos - transform.position;
float dist = dir.magnitude;
Vector3.Normalize(dir);
// change 1.0f to something else if you want:
transform.position += new Vector3(dir.x * dist * 1.0f, dir.y * dist * 1.0f, dir.z * dist * 1.0f);

如果你将dir.z * dist * 1.0f改为dir.z * dist * 2.0f,那么你将在Z方向上移动两倍。

© www.soinside.com 2019 - 2024. All rights reserved.