如何使用鼠标位置在Unity中的2D网格上放置切片?

时间:2016-05-19 22:16:27

标签: c# math input grid rounding

我正在尝试将关卡编辑器设置为用户可以在其中放置切片的位置。这是代码:

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的公式似乎过于复杂,我认为有更好的方法。请帮我解决这两个问题

1 个答案:

答案 0 :(得分:2)

您是否使用正交相机进行2D工作?在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);
    }
}

我创建一个与默认网格平放的 Plane 。然后我对它做一个光线投射,从世界空间的鼠标屏幕位置找到命中点。我还将每个单元格的大小设置为单位,这样我就可以舍入到int来获取索引位置,这也可以作为世界变换位置。

如果您想保存光线投射并且不需要3D摄像机视角,您可以简单地获得您已经在做的鼠标世界位置。如果你将每个tile设置为一个单位,那么当舍入到int时,一切都会正常工作。