簡體   English   中英

Unity3d沿平面移動對象(僅限X和Z軸)

[英]Unity3d move object along plane (X and Z axis only)

我有一個Unity3D項目。 這個項目有一個我創建的預制件(桌面),平面作為能量的頂部。 飛機有一個箱子colider和剛體。 在桌面上,我有另一個對象。 我想僅在桌面(X和Z軸)周圍移動此對象。 永遠不要將物體抬高到桌面上方。 我將此代碼附加到我的對象:

void OnMouseDown()
{
    Debug.Log("mouse down");
    screenPoint = Camera.main.WorldToScreenPoint(transform.position);
    offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}

void OnMouseDrag()
{
    Debug.Log("mouse drag");
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}

這會移動對象,但它也會將對象移動到桌面上方。 有沒有辦法將對象保持在桌面上?

聽起來你正在尋找的是將mousePosition投影到表格上。 mousePosition最初位於屏幕空間(看起來您已經使用ScreenToWorldPoint識別),並且您需要找到它從屏幕位置點擊的表的位置。

查看Physics.Raycast

獲得該點之后,您可以將對象的變換設置為該變換,但您可能希望將垂直分量設置為該對象的常量值而不是結果值。

為此,您可能需要將表設置為碰撞層(如果尚未設置)並確保僅查找該表。 請注意,對於Raycast,layerMask是一個寄存器,由int(即[0 1 2..31])表示,因此您使用按位運算來選擇您的圖層,例如

layerMask = (1<<LayerMask.NameToLayer("Table"))

希望這可以幫助!

您可以利用現有的Unity代碼進行鼠標按下。 您可以在單擊時進行這些方法,而不是單擊鼠標按鈕,這可能是一個更簡單的路徑。

在確保它只在x和Z軸方面,如果你不想擔心碰撞方面(如果表是一個剛體,鼠標對象不應該通過),你可以隨時凍結Y在Inspector中的位置,以便鎖定到您設置的任何級別。

暫無
暫無

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

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