效果图
辅助理解代码的图解
u3d 2d纹理 uv坐标系
u3d Mathf.cos,sin三角函数的角度关系
u3d 三角面正反
材质中使用到的纹理(自己用PS画就OK了)
代码
public float sector_direction_degree = 90f;
public float sector_theta_degree = 160;
public int sector_segment = 15;
public float sector_radius = 2;
public float circle_radius = 2;
public int circle_segment = 30;
public float rect_side_len = 2;
public void OnCreateSectorBtnClick()
{
_CreatSector(sector_direction_degree, sector_theta_degree, sector_radius, sector_segment);
}
public void OnCreateCircileBtnClick()
{
_CreatSector(0, 360, circle_radius, circle_segment);
}
public void OnCreateRectBtnClick()
{
_CreatSector(0, 360, rect_side_len, 4);
}
private void _CreatSector(float dir_degree, float theta_degree, float radius, int segment)
{
var go = new GameObject("TestMesh");
var mf = go.AddComponent<MeshFilter>();
var mr = go.AddComponent<MeshRenderer>();
var m = new Mesh();
const float oneRadian = (Mathf.PI / 180);
var angle = oneRadian * dir_degree + oneRadian * (theta_degree * 0.5f);
var stepAngle = oneRadian * (theta_degree / segment);
var firstX = 0; var firstY = 0;
Vector3[] vertices = new Vector3[3 + segment - 1];
vertices[0] = new Vector3(firstX, firstY, 0);
for (int i = 1; i < vertices.Length; i++)
{
vertices[i] = new Vector3(
firstX + Mathf.Cos(angle) * radius,
firstY + Mathf.Sin(angle) * radius, 0);
angle -= stepAngle;
}
var triangles = new int[3 * segment];
for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++)
{
triangles[i] = 0;
triangles[i + 1] = vi;
triangles[i + 2] = vi + 1;
}
var uvs = new Vector2[vertices.Length];
uvs[0] = new Vector2(0.5f, 0);
var count = uvs.Length - 1;
for (int i = 1; i < uvs.Length; i++)
{
uvs[i] = new Vector2(i / count, 1);
}
m.vertices = vertices;
m.triangles = triangles;
m.uv = uvs;
m.name = "MyMesh";
mf.mesh = m;
mr.material = Resources.Load<Material>("Materials/TestMesh1");
go.transform.position = new Vector3(4, 4);
}
参考
Unity3D+moba+技能指示器(二)