unity雷达图(附带拖拽)

在unity中雷达图的用法通常都是显示角色的属性等,通过读取配置文件使用unity中自带的MaskableGraphic组件实现,该组件读者可以自行查阅,笔者主要使用该组件的图像渲染功能,雷达图效果图如下图所示:

常规雷达图都是将一个圆分割成需要的份数,然后求出圆上位置的坐标

依次使用mesh从圆形点、圆上位置、圆上相邻位置绘制三角形,圆上位置如图所示:

下面是实现效果的代码

protected override void OnPopulateMesh(VertexHelper vh)
{
    base.OnPopulateMesh(vh);
    vh.Clear(); // 清空当前的顶点数据

    rad = 2 * Mathf.PI / s.Count; // 计算每个扇形的角度

    vh.AddVert(Vector3.zero, color, Vector2.zero); // 添加顶点,代表雷达图的中心点

    for (int i = 0; i < s.Count; i++)
    {
        float x = Mathf.Cos(rad * i + Mathf.PI / 2) * s[i] * size; // 根据角度和半径计算顶点的 x 坐标
        float y = Mathf.Sin(rad * i + Mathf.PI / 2) * s[i] * size; // 根据角度和半径计算顶点的 y 坐标

        vh.AddVert(new Vector3(x, y, 0), color, Vector2.zero); // 添加顶点

        if (RadarMgr.radarMgr.imgs[i] != null)
        {
            RadarMgr.radarMgr.imgs[i].transform.localPosition = new Vector3(x, y, 0); // 设置雷达图上的图像的位置
        }

        if (i == 0)
        {
            vh.AddTriangle(0, s.Count, 1); // 添加三角形,连接中心点和第一个顶点
        }
        else
        {
            vh.AddTriangle(0, i, i + 1); // 添加三角形,连接中心点和相邻的两个顶点
        }
    }
}

此处为可实现拖拽的雷达图的附加脚本

// 尝试将屏幕坐标转换为相对于父 RectTransform 的本地坐标
bool flag = RectTransformUtility.ScreenPointToLocalPointInRectangle(
    transform.parent.transform as RectTransform,  // 目标 RectTransform 的父级 RectTransform
    new Vector2(Input.mousePosition.x, Input.mousePosition.y),  // 屏幕坐标
    Camera.main,  // 使用的相机
    out Vector2 point);  // 转换后的本地坐标

// 如果转换成功
if (flag)
{
    // 设置当前对象的本地坐标为转换后的坐标
    transform.localPosition = new Vector3(point.x, point.y, 0);

    // 查找 Canvas 下的 Image 下的 GameObject 对象,并调用其 RadarMap 组件的 OnDrag 方法,传入 index 参数
    GameObject.Find("Canvas/Image/GameObject").GetComponent<RadarMap>().OnDrag(index);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值