【问题标题】:Mouse events for Unity3D isometric tile mapUnity3D 等距平铺地图的鼠标事件
【发布时间】:2019-01-25 01:33:26
【问题描述】:

我一直在阅读 Unity3D 中的新平铺地图系统。我已经设法建立一个网格 - > 瓷砖地图并设置一个瓷砖调色板。但是现在我正在努力寻找最新的教程来处理这个新的瓦片地图系统的鼠标事件。

我试图在鼠标悬停在磁贴上时设置高亮,如果单击磁贴,我希望能够触发脚本和其他事件。然而,在线可用的教程并没有涉及瓷砖地图系统的鼠标事件,也很少谈论等距瓷砖地图。

是否有任何关于在等距平铺地图上处理鼠标事件的最新教程?即使是一个简单的教程,它显示了在磁贴上的悬停效果和单击磁贴时的“来自磁贴 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);
    }
}

【问题讨论】:

    标签: c# unity3d 2d tile isometric


    【解决方案1】:

    这应该让你开始:

    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);
    
               // Shows the name of the tile at the specified coordinates
               Debug.Log(tm.GetTile(posInt).name);
           }
       }
    }
    

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

    在这个例子中,我只是将上面的脚本附加到世界上一个空的 GameObject 上。相反,将它附加到网格可能是有意义的。尽管如此,一般逻辑仍然相同。

    【讨论】:

      【解决方案2】:

      这与 HumanWrites 的做法略有不同。它不需要对网格的引用,并且 mousePos 被声明为 Vector2,而不是 Vector3 - 这将避免在 2D 中工作时出现问题。

      using UnityEngine;
      using UnityEngine.Tilemaps;
      
      public class MouseManager : MonoBehaviour
      {
      
      private Tilemap tilemap;
      
      void Start()
      {
          tilemap = FindObjectOfType<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”是场景中的一个游戏对象。您可能已将其重命名为其他名称,但它将是“网格”对象的子对象。

      【讨论】:

      • 对于 .Find("Tilemap") 部分,这是在寻找组件的名称还是标签?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多