簡體   English   中英

在Unity3D中如何在X和Z軸上拖放?

[英]How to do Drag and Drop on X & Z Axis in Unity3D?

我一直在嘗試使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;

至:

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方向上移動兩倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM