Unity OnMouseDrag()拖放

时间:2014-07-10 17:17:59

标签: c# user-interface unity3d

尝试在x轴和y轴上拖放游戏对象。由于某种原因,即使鼠标不移动,x,y和z的值也会随着时间的推移而变小。任何人都可以解释为什么会这样吗?

using UnityEngine;
using System.Collections;

public class Drag : MonoBehaviour {

    Vector3 point;
    float x;
    float y;
    float z;

    void Update () {

    }

    void OnMouseDrag()
    {
        x = Input.mousePosition.x;
        y = Input.mousePosition.y;
        z = gameObject.transform.position.z;

        point = Camera.main.ScreenToWorldPoint (new Vector3 (x, y, z));
        gameObject.transform.position = point;

        Debug.Log ("x: " + point.x + "   y: " + point.y + "   z: " + point.z);
    }
}

1 个答案:

答案 0 :(得分:0)

您的z应与相机保持距离:z=(Camera.main.transform.position-gameObject.transform.position).magnitude。即使这样,由于浮动精度问题(取决于规模和运气),您可能会遇到一些漂移。

如果您有漂移问题,请尝试缓存z值。

此外,如果您使用Camera.main.ScreenPointToRay并针对Plane进行了广播,您将获得更多控制权(并且没有浮动漂移问题):

Vector3 ScreenPosToWorldPosByPlane(Vector2 screenPos, Plane plane) {
    Ray ray=Camera.main.ScreenPointToRay(new Vector3(screenPos.x, screenPos.y, 1f));
    float distance;
    if(!plane.Raycast(ray, out distance))
        throw new UnityException("did not hit plane", this);
    return ray.GetPoint(distance);
}

使用的Plane应该是这样的:

Plane plane=new Plane(Vector3.up, Vector3.zero);

它位于Vector3.zero位置,面朝上(Vector3.up)。