多角形の描画は微妙だった。
そこで多角形のメッシュを使ってレーダーチャートのようなものを作ってみる。
まず多角形のメッシュを持ったオブジェクトを作る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Vector3[] vertices; //頂点 int[] triangles; //index int nPoly; //頂点数 float max; //最大値 //多角形メッシュ void makeParams(float[] values){ List<Vector3> vertList = new List<Vector3>(); List<int> triList = new List<int>(); vertList.Add(new Vector3(0,0,0)); //原点 for(int n=0; n<nPoly; n++){ float _x = values[n]/max*Mathf.Cos(n*2*Mathf.PI/nPoly); float _y = values[n]/max*Mathf.Sin(n*2*Mathf.PI/nPoly); vertList.Add(new Vector3(_x,_y)); if(n!=nPoly-1) { triList.Add(0);triList.Add(n+2);triList.Add(n+1); } else {//last triList.Add(0);triList.Add(1);triList.Add(n+1); } } vertices = vertList.ToArray(); triangles = triList.ToArray(); } //GameObjectにメッシュを適用 void setParams(GameObject t,Color color,int order){ Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; mesh.RecalculateNormals(); mesh.RecalculateBounds(); t.GetComponent<MeshFilter>().sharedMesh = mesh; t.GetComponent<MeshCollider>().sharedMesh = mesh; t.GetComponent<MeshRenderer>().material.shader = Shader.Find( "Sprites/Default" ); t.GetComponent<MeshRenderer>().material.color = color; t.transform.localScale = new Vector3(2.8f,2.8f,1); t.transform.position = new Vector3(0,2f,order); t.transform.rotation = Quaternion.Euler(0,0,90); } |
マジックナンバーは2Dの新規プロジェクトにあわせた大きさに設定した。
こんな感じで自由に多角形を作れる。
1 2 3 4 |
max = 6; nPoly = 5; makeParams(new float[]{4,5,3,5,5}); setParams(GameObject.CreatePrimitive(PrimitiveType.Quad), new Color(1,0,0,0.5f),0); |
レーダーチャートっぽくするために、画面奥から多角形を重ねることで線を表現する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
float[] getArray(float f){ float[] fa = new float[nPoly]; for(int i=0;i<nPoly;i++) fa[i] = f; return fa; } void makeBack(Color line,Color back){ if(max>(int)max){ makeParams(getArray(max)); setParams(GameObject.CreatePrimitive(PrimitiveType.Quad),back,99); } for(int i=(int)max; i>0; i--){ float _f1 = i; float _f2 = _f1-0.1f; makeParams(getArray(_f1)); setParams(GameObject.CreatePrimitive(PrimitiveType.Quad),line,i*2+1); makeParams(getArray(_f2)); setParams(GameObject.CreatePrimitive(PrimitiveType.Quad),back,i*2); } } |
この上に半透明の多角形を重ねると、
こんな感じになる。
今回は背景もQuadで作ったけど、画像で用意したらもう少しいい感じになると思う。
ゲームのパラメータ表示なんかに使えるかも。