Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在X&;上进行拖放;Unity3D中的Z轴?_C#_Visual Studio_Unity3d - Fatal编程技术网

C# 如何在X&;上进行拖放;Unity3D中的Z轴?

C# 如何在X&;上进行拖放;Unity3D中的Z轴?,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我一直在尝试在手机上实现Unity 3D中对象的拖放。我希望这样,当你在屏幕上拖动时,对象在z轴上移动,如果你在屏幕上向上或向下拖动,对象将在z轴而不是y轴上移动。 这是我目前拥有的代码 public class MovementController : MonoBehaviour { Vector3 dist; Vector3 startPos; float posX; float posZ; float posY; void OnMouseDown() { startPos = tr

我一直在尝试在手机上实现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轴上只移动了很小的一部分,我必须向右移动到屏幕的顶部,它才能移动一点。有没有更好的方法来解决这个问题,因为我似乎找不到一种方法来修改代码来解决这个问题。
谢谢。

您有点混淆了变量的用途-它们没有包含名称所描述的值:)

对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;
致:


如果将
dir.z*dist*1.0f
更改为
dir.z*dist*2.0f
,则在z方向上的移动量将是原来的两倍。

您有点混淆了变量的用途-它们没有包含其名称所描述的值:)

对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;
致:


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

谢谢,此代码将对象上下左右移动(在y轴和x轴上)。如果可能,我希望它在z轴和x轴上移动?感谢您的回复。第二种解决方案应该将其移动到X和Z上-请参阅使用
输入的位置。mousePosition.y
(第一种情况下为y,第二种情况下为Z)Ok Cool,有没有办法减少其在Z轴上的移动量?因为我移动鼠标一点点,它就会移动好几英里。谢谢Hanks,这段代码将对象上下左右移动(在y轴和x轴上)我希望它在Z轴和x轴上移动,如果可能的话?感谢您的回复。第二种解决方案应该将其移动到X和Z上-请参阅使用
输入的位置。mousePosition.y
(第一种情况下为y,第二种情况下为Z)Ok Cool,有没有办法减少其在Z轴上的移动量?因为我移动鼠标一点点,它就会移动好几英里。谢谢