找回密码
 立即注册
查看: 151|回复: 0

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

[复制链接]
发表于 2022-12-1 11:03 | 显示全部楼层 |阅读模式
做这个功能最开始我想到的是射线检测,但是实际实现后发现瓦片的碰撞体积是一个整体,射线去检测的话只能检测到瓦片容器(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)网站。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-21 01:39 , Processed in 0.104457 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表