【问题标题】:How to do Drag and Drop on X & Z Axis in Unity3D?如何在 Unity3D 中的 X 轴和 Z 轴上进行拖放?
【发布时间】:2018-09-01 16:31:31
【问题描述】:

我一直在尝试让 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】:

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

    将此用于 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 方向移动两倍。

    【讨论】:

    • 谢谢,此代码上下左右移动对象(在 y 轴和 x 上)我希望它在 Z 轴和 X 上移动,如果可能的话?感谢您的回复。
    • 第二种解决方案应将其移动到 X 和 Z 上 - 查看 Input.mousePosition.y 的使用位置(在第一种情况下为 Y,在第二种情况下为 Z)
    • 好的酷,有没有办法减少它在 Z 轴上的移动量?因为我移动鼠标一点点,它就会走几英里。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多