Unity3D等距图块地图的鼠标事件

时间:2019-01-25 01:33:27

标签: c# unity3d 2d tile isometric

我一直在学习Unity3D中新的图块地图系统。我已经设法建立一个网格-> tile-map并设置了tile调色板。但是,现在我正在努力寻找有关此新切片地图系统处理鼠标事件的最新教程。

我试图在鼠标悬停在图块上方并且单击图块时设置突出显示,我希望能够触发脚本和其他事件。但是,在线可用教程并不涉及平铺地图系统的鼠标事件,很少有关于等距平铺地图的讨论。

是否有用于处理等距图块地图上鼠标事件的最新教程?即使是一个简单的教程,它显示了在磁贴上的悬停效果以及单击磁贴时的“来自磁贴x.y的世界,您好”。

这是我到目前为止所拥有的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseManager : MonoBehaviour
{
    void Update()
    {
        Vector3 clickPosition = Vector3.one;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            clickPosition = hit.point;
        }
        Debug.Log(clickPosition);
    }
}

2 个答案:

答案 0 :(得分:0)

这应该使您入门:

using UnityEngine;
using UnityEngine.Tilemaps;

public class test : MonoBehaviour {

   //You need references to to the Grid and the Tilemap
   Tilemap tm;
   Grid gd;

   void Start() {
       //This is probably not the best way to get references to
       //these objects but it works for this example
       gd = FindObjectOfType<Grid>();
       tm = FindObjectOfType<Tilemap>();
   }

   void Update() {

       if (Input.GetMouseButtonDown(0)) {
           Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
           Vector3Int posInt = gd.LocalToCell(pos);

           //Shows the cell reference for the grid
           Debug.Log(posInt);

           Debug.Log(tm.GetTile(posInt).name);
       }
   }
}

简而言之,获取对网格和图块的引用。使用ScreenToWorldPoint(Input.mousePosition)查找本地坐标。调用网格对象的LocalToCell方法将本地坐标(Vector3)转换为单元坐标(Vector3Int)。将单元格线传递到Tilemap对象的GetTile方法以获取Tile(然后使用与Tile类关联的方法进行您想要进行的任何更改)。

在此示例中,我只是将上面的脚本附加到了世界上一个空的GameObject上。相反,将其附加到Grid可能很有意义。尽管如此,一般逻辑还是一样。

答案 1 :(得分:0)

这与HumanWrites的执行方式稍有不同。它不需要引用网格,并且mousePos被声明为Vector2而不是Vector3;这样可以避免在2D模式下工作时出现问题。

using UnityEngine;
using UnityEngine.Tilemaps;

public class MouseManager : MonoBehaviour
{

private Tilemap tilemap;

void Start()
{
    //You can serialize this and assign it in the editor instead
    tilemap = GameObject.Find("Tilemap").GetComponent<Tilemap>();
}

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3Int gridPos = tilemap.WorldToCell(mousePos);

        if (tilemap.HasTile(gridPos))
            Debug.Log("Hello World from " + gridPos);
    }
}

}

我们要引用的“ tilemap”是您场景中的一个gameObject。您可能已将其重命名为其他名称,但这将是“ Grid”对象的子级。 enter image description here