2016-05-19 72 views
1

我正在嘗試製作關卡編輯器,以便用戶可以在其中放置要放置拼貼的位置。下面是代碼:如何在Unity中使用鼠標位置在2D網格上放置圖塊?

using UnityEngine; 
using System.Collections; 

public class TilePlacement : MonoBehaviour { 

    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 
     if (Input.GetMouseButtonDown (0)) { 
      var clickPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f); 
      clickPos = Camera.main.ScreenToWorldPoint (clickPos); 

      clickPos.z = 0f; 
      clickPos.x = Mathf.FloorToInt (clickPos.x); 
      clickPos.y = Mathf.FloorToInt (clickPos.y); 
      clickPos.x /= 3.2f; 
      clickPos.y /= 3.2f; 
      clickPos.x = Mathf.Round (clickPos.x); 
      clickPos.y = Mathf.Round (clickPos.y); 
      clickPos.x *= 3.2f; 
      clickPos.y *= 3.2f; 

      var go = new GameObject(); 
      go.AddComponent<SpriteRenderer>(); 
      go.GetComponent<SpriteRenderer>().sprite = Sprite.Create(new Texture2D(32, 32), new Rect(0, 0, 32, 32), new Vector2(0, 0)); 
      go.transform.localScale = new Vector3 (10f, 10f, 0f); 
      go.transform.position = clickPos; 
     } 
    } 
} 

此代碼放置磚,但是用戶必須在瓷磚和改變clickPos公式的左下角點擊似乎過於複雜,我認爲這是一個更好的辦法做到這一點。請幫我解決這兩個問題

回答

2

你是否在二維正交相機?在3D中,我會這樣做,這也適用於2D平面。

Plane _groundPlane; 

void Start() 
{ 
    _groundPlane = new Plane(Vector3.up, Vector3.zero); 
} 

void Update() 
{ 
    if (Input.GetMouseButtonDown(0) == false) 
     return; 


    int x = 0; 
    int z = 0; 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
    float distance; 
    if (_groundPlane.Raycast(ray, out distance)) 
    { 
     Vector3 worldPosition = ray.GetPoint(distance); 
     x = Mathf.RoundToInt(worldPosition.x); 
     z = Mathf.RoundToInt(worldPosition.z); 

     Debug.DrawLine(Camera.main.transform.position, worldPosition); 
     Debug.LogFormat("Clicked positions: {0} | {1}", x, z); 
    } 
} 

我創建了一個平面是平放使用默認的網格。然後我對它進行光線投射,從世界空間的鼠標屏幕位置找到命中點。我也讓每個單元格的大小都是一個單位,這樣我就可以輪到int來獲得索引位置,這也是世界變換位置。

如果您想要保存raycast並且不需要3D相機透視圖,那麼您可以像您已經在做的那樣簡單地獲取鼠標世界的位置。如果你將每個瓦片放大一個單位,當四捨五入到整數時,所有東西都可以工作。

+0

即時通訊使用正交相機在2D中,但問題是我的對象是10,10,1的規模,但他們是3.2單位寬因爲他們的像素數 –

+0

我相信這是最方便的,如果你想讓他們所有比例爲1,1,1,然後在導入設置中更改像素每個單位以使它們適合統一。因此,如果您的精靈是32 x 32像素,將像素每個單位設置爲32,並縮放到1,他們將完美適合一個Unity網格單元格。如果您在不同尺度之間轉換時遇到問題,這隻會讓您的數學變得更容易。 – Xarbrough

+0

謝謝你的回答! –