网上找了下没啥好的代码,自己结合资料优化了下,支持创建任意边数的雷达图

原理是采用CanvasRender创建Mesh

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

[RequireComponent(typeof(CanvasRenderer))]

public class UGUI_Radar : MonoBehaviour

{

[SerializeField] private Material mat;//材质球,自行创建,shader选择 UI/Default

[SerializeField] private Texture _tex;//贴图,可选

private CanvasRenderer _render;

public List dataList = new List(10);//每个点的数据

[SerializeField] private float radarSize = 10f;//雷达图的长度

// Start is called before the first frame update

void Start()

{

_render = GetComponent();

UpdateRadarVisualData();

}

// Update is called once per frame

void Update()

{

}

///

/// 生成雷达图

///

public void UpdateRadarVisualData()

{

int _length = dataList.Count;

if (_length < 3)

{

Debug.LogError("边数不能小于3");

return;

}

Mesh mesh = new Mesh();

Vector3[] vertices = new Vector3[_length + 1];

Vector2[] uv = new Vector2[_length + 1];

int[] triangles = new int[3 * _length];//一个三角形,三个点,5个图形,乘以5

float angleIncrement = 360f / _length;//度数

vertices[0] = Vector3.zero;

for (int i = 1; i <= _length; i++)

{

vertices[i] = Quaternion.Euler(0, 0, -angleIncrement * (i - 1)) * Vector3.up * radarSize * dataList[i-1];

}

uv[0] = Vector2.zero;

for (int i = 1; i <= _length; i++)

{

uv[i] = Vector2.one;

}

/*

triangles[0] = 0;

triangles[1] = 1;

triangles[2] = 2;

triangles[3] = 0;

triangles[4] = 2;

triangles[5] = 3;

triangles[6] = 0;

triangles[7] = 3;

triangles[8] = 4;

triangles[9] = 0;

triangles[10] = 4;

triangles[11] = 5;

triangles[12] = 0;

triangles[13] = 5;

triangles[14] = 1;

*/

//注释规律总结

for (int i = 0; i < _length * 3; i++)

{

if (i%3 == 0)

{

triangles[i] = 0;

}

else

{

if ((i-1)%3 == 0)

{

triangles[i] = (i - 1) / 3 + 1;

}

else

{

triangles[i] = (i - 2) / 3 + 2;

}

}

//最终值为1

if (i == _length * 3 - 1)

{

triangles[i] = 1;

}

}

mesh.vertices = vertices;

mesh.uv = uv;

mesh.triangles = triangles;

_render.SetMesh(mesh);

_render.SetMaterial(mat, _tex);

}

}

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。