public static GameObject CreateCompass(float Radius = 5f, float Thickness = 0.5f, float ArrowSize = 2f, int NCirclePoints = 40) { GameObject go = new GameObject("Compass"); MeshFilter mf = go.AddComponent <MeshFilter>(); MeshRenderer mr = go.AddComponent <MeshRenderer>(); List <Vector3> outerCirclePoints = Enumerable.Range(0, NCirclePoints + 1) .Select(i => new Vector3(Mathf.Sin(2 * Mathf.PI * i / NCirclePoints), 0f, Mathf.Cos(2 * Mathf.PI * i / NCirclePoints))) .Select(v => (.5f * Thickness + Radius) * v) .ToList(); List <Vector3> innerCirclePoints = Enumerable.Range(0, NCirclePoints + 1) .Select(i => new Vector3(Mathf.Sin(2 * Mathf.PI * i / NCirclePoints), 0f, Mathf.Cos(2 * Mathf.PI * i / NCirclePoints))) .Select(v => (-0.5f * Thickness + Radius) * v) .ToList(); MeshGenerator mg = new MeshGenerator(); for (int i = 0; i < NCirclePoints; i++) { mg.AddRectangle(outerCirclePoints[i + 1], outerCirclePoints[i], innerCirclePoints[i], innerCirclePoints[i + 1]); mg.AddRectangle(outerCirclePoints[i], outerCirclePoints[i + 1], innerCirclePoints[i + 1], innerCirclePoints[i]); } float[] Sizes = new float[] { 3f / 2, 1f / 3, 1f / 2, 1f / 3, 1f / 2, 1f / 3, 1f / 2, 1f / 3 }; for (int i = 0; i < Sizes.Length; i++) { float angle = 2 * Mathf.PI * i / Sizes.Length; float something = Mathf.PI * 2 / 40; Vector3 center = Radius * new Vector3(Mathf.Sin(angle), 0f, Mathf.Cos(angle)); Vector3 tip = ((Radius + Sizes[i] * ArrowSize) / Radius) * center; Vector3 left = Radius * new Vector3(Mathf.Sin(angle + something), 0f, Mathf.Cos(angle + something)); Vector3 right = Radius * new Vector3(Mathf.Sin(angle - something), 0f, Mathf.Cos(angle - something)); mg.AddTriangle(left, tip, right); mg.AddTriangle(left, right, tip); } mf.mesh = mg.GetMesh(); return(go); }
void Awake() { MeshFilter mf = gameObject.AddComponent <MeshFilter> (); MeshRenderer mr = gameObject.AddComponent <MeshRenderer> (); float halfsize = size / 2; MeshGenerator mg = new MeshGenerator(); //mg.AddRectangle (CornerPoints [1].position, CornerPoints [2].position, CornerPoints [3].position, CornerPoints [0].position); // TODO calc the actual borders; CornerPoints.Add(CornerPoints.First()); for (int i = 0; i < CornerPoints.Count - 1; i++) { Vector3 forward = CornerPoints [i + 1].position - CornerPoints [i].position; Vector3 normal = new Vector3(forward.z, 0, -forward.x).normalized *size; Vector3 start = CornerPoints [i].position; mg.AddRectangle(start, start + forward, start + forward + normal, start + normal); } CornerPoints.Remove(CornerPoints.Last()); mf.mesh = mg.GetMesh(); mr.material = material; }
public static void MeshGenTest() { GameObject go = new GameObject("Test"); MeshFilter mf = go.AddComponent <MeshFilter>(); MeshRenderer mr = go.AddComponent <MeshRenderer>(); MeshGenerator mg = new MeshGenerator(); mg.AddRectangle(Vector3.zero, Vector3.right, Vector3.one, Vector3.forward); mf.mesh = mg.GetMesh(); }
// This is bullshit as shape does not register as convex... GameObject CreatePlayFieldCollider() { Func <float, float, Vector3> GetHitPoint = (x, y) => { Ray ray = mainCamera.ScreenPointToRay(new Vector3(x, y, 0f)); float LenghtToHitOcean = -ray.origin.y / ray.direction.y; return(ray.origin + LenghtToHitOcean * ray.direction); }; Vector3[] corners = new Vector3[] { GetHitPoint(0f, 0f), GetHitPoint(Screen.width, 0f), GetHitPoint(Screen.width, Screen.height), GetHitPoint(0f, Screen.height) }; MeshGenerator mg = new MeshGenerator(); mg.AddRectangle(corners.Select(v => v + new Vector3(0f, 0.5f, 0f)).ToArray()); GameObject newGO = new GameObject("PlayFieldCollider"); MeshFilter mf = newGO.AddComponent <MeshFilter> (); //MeshRenderer mr = newGO.AddComponent<MeshRenderer> (); mf.mesh = mg.GetMesh(); newGO.tag = "PlayField"; MeshCollider mc = newGO.AddComponent <MeshCollider> (); mc.sharedMesh = mf.mesh; mc.convex = true; mc.inflateMesh = true; mc.isTrigger = true; return(newGO); }