效果圖
輔助理解代碼的圖解
u3d 2d紋理 uv座標系
u3d Mathf.cos,sin三角函數的角度關係
u3d 三角面正反
總結爲:三角面在投影座標下的頂點連接順序爲順時針爲正面,逆時針爲反面。
當然指定順時針、或逆時針爲正,在底層是可以設置的。
材質中使用到的紋理(自己用PS畫就OK了)
代碼
/// <summary>
/// author : Jave.Lin
/// date : 2018-05-03
/// </summary>
// 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<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);
}
// 上面的頂點vertices,與三角索引組合triangles都會影響生成的三角面對於鏡頭來說,是正,還是反面
// 如果開啓了背面剔除,導致網格看不見,大家需要注意這點就OK了
// 目前這種材質、與UV的設置,是控制不了類似王者榮耀的技能提示邊緣的
// 下次有時間,才實現兩種方式來達效果:shader 以一個固定長度,直接設置顏色(RGBA),或是採樣紋理(RGBA)