2016-05-19 14 views
1

Ich versuche einen Level-Editor zu erstellen, wo der Benutzer klicken kann, wo er eine Kachel platzieren möchte. Hier ist der Code:Wie platziere ich Kacheln mit der Mausposition in Unity?

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; 
     } 
    } 
} 

Dieser Code funktioniert für Fliesen platzieren, aber der Benutzer hat in der unteren linken Ecke einer Fliese und die Formel für die Änderung clickPos klicken scheint zu kompliziert und ich denke, es gibt einen besseren Weg TU es. Bitte helfen Sie mir, diese beiden Probleme zu beheben

Antwort

2

Arbeiten Sie in 2D mit einer orthographischen Kamera? In 3D würde ich das so machen, was auch für 2D-Ebenen funktioniert.

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); 
    } 
} 

ich ein Flugzeug, das mit dem Standardraster flach liegt. Dann mache ich einen Raycast, um den Trefferpunkt von der Position des Mausbildschirms im Weltbereich zu finden. Ich habe auch jede Zelle eine Einheit groß gemacht, so dass ich mich auf Int konzentrieren kann, um die Indexposition zu erhalten, die auch als Welt-Transformation-Position funktioniert.

Wenn Sie den Raycast speichern und keine 3D-Kameraperspektive benötigen, können Sie einfach die Mausposition erreichen, wie Sie es bereits tun. Wenn du jede Kachel eine Einheit groß machst, wird alles funktionieren, wenn du auf int gerundet bist.

+0

Ich mache es in 2D mit ortho-Kamera, aber das Problem ist, meine Objekte sind 10, 10, 1 im Maßstab, aber sie sind 3,2 Einheiten breit wegen ihrer Pixelzahl –

+0

Ich glaube, es am bequemsten sein, wenn Sie sie machen würden alle Maßstäbe 1, 1, 1 und dann ändern Sie die Pixel pro Unity in den Importeinstellungen, damit sie zu einer Einheit passen. Wenn dein Sprite also 32 x 32 Pixel groß ist, setze Pixels Per Unity auf 32 und skaliere auf 1 und sie passen perfekt in eine Unity-Gitterzelle. Dies vereinfacht Ihre Berechnungen, wenn Sie Probleme beim Konvertieren zwischen verschiedenen Skalen haben. – Xarbrough

+0

Vielen Dank für Ihre Antwort! –