stonstad 发表于 2022-12-1 11:03

unity 2D 六边形瓦片地图鼠标(世界坐标均可)选中单个 ...

做这个功能最开始我想到的是射线检测,但是实际实现后发现瓦片的碰撞体积是一个整体,射线去检测的话只能检测到瓦片容器(Tilemap),锁定不到单个瓦片(TileBase)。
所以方法只有一种了就是坐标转换,把鼠标在世界地图的上的坐标转换成瓦片地图的坐标。

conversion(参数1:世界坐标(v2),参数2:瓦片像素宽度,参数3:瓦片像素高度 , 参数4:是否为尖顶六边形地图)
private Vector2 conversion(Vector2 mouseWorldPos, double Xpixel_Width, double Ypixel_high,bool bool_spire) {
      //判断是否为尖顶
      if (!bool_spire) {
            //如果不是对调坐标,转换为平顶坐标
            mouseWorldPos = new Vector2(mouseWorldPos.y, mouseWorldPos.x);
      }

      double x = 0.00;
      double y = 0.00;
      double xl = Xpixel_Width;//图片像素x
      double yl = Ypixel_high;//图片像素y
      double ysl = yl * 0.75;

      x = Math.Ceiling((mouseWorldPos.x - (xl / 2.0)) / xl);
      y = Math.Ceiling((mouseWorldPos.y - (ysl / 2.0)) / ysl);
      if (y%2 != 0) {
            x = Math.Ceiling((mouseWorldPos.x - (xl)) / xl);
      }
      Vector2 position = new Vector2( (float)x, (float)y);
      Debug.Log(position);
      return position;
}Xpixel_Width,Ypixel_high记得除以设置瓦片网格时的每单位像素数量,比如一般默认是每单位100像素
(该函数只适合正六边形瓦片地图计算,默认尖顶 )


那么代入时Xpixel_Width / 100,Ypixel_high / 100.
public Tilemap tilemap;
private void Start(){
    tilemap = GameObject.Find("Tilemap").GetComponent<Tilemap>();//找到瓦片地图集
}
private void Update(){
    mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);//获取鼠标的坐标
    Vector3 position = conversion(mouseWorldPos,1.2,1.4,true);//转换为六边形瓦片地图坐标系统,返回值赋值position
    Vector3Int positionint = new Vector3Int((int)position .x, (int)position .y, (int)position .z); //转换为int类型三维向量
    TileBase tileBase1 = tilemap.GetTile(positionint);//在瓦片集中按坐标查找瓦片
    Debug.Log(tileBase1);//控制台输出找到的瓦片对象
}

private Vector2 conversion(Vector2 mouseWorldPos, double Xpixel_Width, double Ypixel_high,bool bool_spire) {
      //判断是否为尖顶
      if (!bool_spire) {
            //如果不是对调坐标
            mouseWorldPos = new Vector2(mouseWorldPos.y, mouseWorldPos.x);
      }

      double x = 0.00;
      double y = 0.00;
      double xl = Xpixel_Width;//图片像素x
      double yl = Ypixel_high;//图片像素y
      double ysl = yl * 0.75;

      x = Math.Ceiling((mouseWorldPos.x - (xl / 2.0)) / xl);
      y = Math.Ceiling((mouseWorldPos.y - (ysl / 2.0)) / ysl);
      if (y%2 != 0) {
            x = Math.Ceiling((mouseWorldPos.x - (xl)) / xl);
      }
      Vector2 position = new Vector2( (float)x, (float)y);
      Debug.Log(position);
      return position;
}以上方法可以初步把二维世界坐标 转换为 六边形瓦片地图二维坐标,进一步把二维坐标转换成三维坐标的方法可以看六角形网格 (redblobgames.com)网站。
页: [1]
查看完整版本: unity 2D 六边形瓦片地图鼠标(世界坐标均可)选中单个 ...