效果图
总结为:三角面在投影坐标下的顶点连接顺序为顺时针为正面,逆时针为反面。 当然指定顺时针、或逆时针为正,在底层是可以设置的。
///
/// author : Jave.Lin
/// date : 2018-05-03
///
// sector
public float sector_direction_degree = 90f;
public float sector_theta_degree = 160;
public int sector_segment = 15;
public float sector_radius = 2;
// circle
public float circle_radius = 2;
public int circle_segment = 30;
// rect
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();
var mr = go.AddComponent();
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("Materials/TestMesh1");
go.transform.position = new Vector3(4, 4);
}
// 上面的顶点vertices,与三角索引组合triangles都会影响生成的三角面对于镜头来说,是正,还是反面
// 如果开启了背面剔除,导致网格看不见,大家需要注意这点就OK了
// 目前这种材质、与UV的设置,是控制不了类似王者荣耀的技能提示边缘的
// 下次有时间,才实现两种方式来达效果:shader 以一个固定长度,直接设置颜色(RGBA),或是采样纹理(RGBA)
参考
Unity3D+moba+技能指示器(二)