メッシュをスクリプトで変更できるようなので円弧と筒を作るスクリプトを作成した。
色はRGBAで指定してるけどアルファ値は反映されない。
シェーダを変えてもうまくいかないので SpriteRender とかの設定をしてないと意味がないのかもしれない。
完全な透明にしたければ MeshRenderer を削除すれば同じことだと思う。
手順
- 3Dオブジェクト(Emptyでいい)を作成する
- スクリプトを追加する
- パラメータ設定
円弧(Arc)
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshCollider))] public class MakeArc : MonoBehaviour { public int areaAngle = 90; //作成する角度 public int startAngle = 0; //スタート地点の角度 public int quality = 100; //360degのときのtriangle数 public Color color = new Color(1, 0, 0, 0); //RGBA public Vector3 scale = new Vector3(10,1,10); //大きさ private Vector3[] vertices; //頂点 private int[] triangles; //index private void makeParams(){ List<Vector3> vertList = new List<Vector3>(); List<int> triList = new List<int>(); vertList.Add(new Vector3(0,0,0)); //原点 float th,v1,v2; int max=(int)quality*areaAngle/360; for (int i=0;i<=max;i++){ th=i*areaAngle/max + startAngle; v1=Mathf.Sin(th * Mathf.Deg2Rad); v2=Mathf.Cos(th * Mathf.Deg2Rad); vertList.Add(new Vector3(v1,0,v2)); if(i<=max-1){ triList.Add(0);triList.Add(i+1);triList.Add(i+2); } } vertices = vertList.ToArray(); triangles = triList.ToArray(); } private void setParams(){ Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; // 法線とバウンディングの計算 mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.name = "arcMesh"; transform.localScale = scale; GetComponent<MeshFilter>().sharedMesh = mesh; GetComponent<MeshCollider>().sharedMesh = mesh; // 色指定 GetComponent<MeshRenderer>().material.color = color; } void Start(){ makeParams(); setParams(); } } |
筒(Tube)
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshCollider))] public class MakeTube : MonoBehaviour { public int areaAngle = 360; //作成する角度 public int startAngle = 0; //スタート地点の角度 public int height = 10; //高さ public int quality = 100; //360degのときのtriangle数/2 public bool isOutward = false; //内向きか外向きか public Color color = new Color(0, 1, 0, 0); //RGBA public Vector3 scale = new Vector3(10,1,10); //大きさ private Vector3[] vertices; //頂点 private int[] triangles; //index private void makeParams(){ List<Vector3> vertList = new List<Vector3>(); List<int> triList = new List<int>(); float th,v1,v2; int max=(int)quality*areaAngle/360; for (int i=0;i<=max;i++){ th=i*areaAngle/max + startAngle; v1=Mathf.Sin(th * Mathf.Deg2Rad); v2=Mathf.Cos(th * Mathf.Deg2Rad); vertList.Add(new Vector3(v1,0,v2)); vertList.Add(new Vector3(v1,height,v2)); if(i<=max-1){ if(isOutward){ triList.Add(2*i);triList.Add(2*i+3);triList.Add(2*i+1); triList.Add(2*i);triList.Add(2*i+2);triList.Add(2*i+3); }else{ triList.Add(2*i);triList.Add(2*i+1);triList.Add(2*i+3); triList.Add(2*i);triList.Add(2*i+3);triList.Add(2*i+2); } } } vertices = vertList.ToArray(); triangles = triList.ToArray(); } private void setParams(){ Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; // 法線とバウンディングの計算 mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.name = "tubeMesh"; transform.localScale = scale; GetComponent<MeshFilter>().sharedMesh = mesh; GetComponent<MeshCollider>().sharedMesh = mesh; // 色指定 GetComponent<MeshRenderer>().material.color = color; } void Start(){ makeParams(); setParams(); } } |
感想
[SerializeField] を使うと Private でも Unity 上で設定可能になるみたいだけど、GameControllerのような他スクリプトから追加することを考えてPublicにした。もしかしたらコンストラスタを作ったり Getter / Setter を作るべきかも知れない。
また [RequireComponent(typeof(Xxxxx))] は今まで知らない書き方だったので今後は AddComponent と使い分けたい。
ただUnityのプログラムってどうしても動けば良いじゃんという考えになる。