CylinderMeshCreator.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System.Collections.Generic;
  2. using PathCreation.Utility;
  3. using UnityEngine;
  4. namespace PathCreation.Examples {
  5. public class CylinderMeshCreator : PathSceneTool {
  6. public float thickness = .15f;
  7. [Range (3, 30)]
  8. public int resolutionU = 10;
  9. [Min (0)]
  10. public float resolutionV = 20;
  11. public Material material;
  12. [SerializeField, HideInInspector]
  13. GameObject meshHolder;
  14. MeshFilter meshFilter;
  15. MeshRenderer meshRenderer;
  16. Mesh mesh;
  17. protected override void PathUpdated () {
  18. if (pathCreator != null) {
  19. AssignMeshComponents ();
  20. AssignMaterials ();
  21. CreateMesh ();
  22. }
  23. }
  24. void CreateMesh () {
  25. List<Vector3> verts = new List<Vector3> ();
  26. List<int> triangles = new List<int> ();
  27. int numCircles = Mathf.Max (2, Mathf.RoundToInt (path.length * resolutionV) + 1);
  28. var pathInstruction = PathCreation.EndOfPathInstruction.Stop;
  29. for (int s = 0; s < numCircles; s++) {
  30. float segmentPercent = s / (numCircles - 1f);
  31. Vector3 centerPos = path.GetPointAtTime (segmentPercent, pathInstruction);
  32. Vector3 norm = path.GetNormal (segmentPercent, pathInstruction);
  33. Vector3 forward = path.GetDirection (segmentPercent, pathInstruction);
  34. Vector3 tangentOrWhatEver = Vector3.Cross (norm, forward);
  35. for (int currentRes = 0; currentRes < resolutionU; currentRes++) {
  36. var angle = ((float) currentRes / resolutionU) * (Mathf.PI * 2.0f);
  37. var xVal = Mathf.Sin (angle) * thickness;
  38. var yVal = Mathf.Cos (angle) * thickness;
  39. var point = (norm * xVal) + (tangentOrWhatEver * yVal) + centerPos;
  40. verts.Add (point);
  41. //! Adding the triangles
  42. if (s < numCircles - 1) {
  43. int startIndex = resolutionU * s;
  44. triangles.Add (startIndex + currentRes);
  45. triangles.Add (startIndex + (currentRes + 1) % resolutionU);
  46. triangles.Add (startIndex + currentRes + resolutionU);
  47. triangles.Add (startIndex + (currentRes + 1) % resolutionU);
  48. triangles.Add (startIndex + (currentRes + 1) % resolutionU + resolutionU);
  49. triangles.Add (startIndex + currentRes + resolutionU);
  50. }
  51. }
  52. }
  53. if (mesh == null) {
  54. mesh = new Mesh ();
  55. } else {
  56. mesh.Clear ();
  57. }
  58. mesh.SetVertices (verts);
  59. mesh.SetTriangles (triangles, 0);
  60. mesh.RecalculateNormals ();
  61. }
  62. // Add MeshRenderer and MeshFilter components to this gameobject if not already attached
  63. void AssignMeshComponents () {
  64. if (meshHolder == null) {
  65. meshHolder = new GameObject ("Mesh Holder");
  66. }
  67. meshHolder.transform.rotation = Quaternion.identity;
  68. meshHolder.transform.position = Vector3.zero;
  69. meshHolder.transform.localScale = Vector3.one;
  70. // Ensure mesh renderer and filter components are assigned
  71. if (!meshHolder.gameObject.GetComponent<MeshFilter> ()) {
  72. meshHolder.gameObject.AddComponent<MeshFilter> ();
  73. }
  74. if (!meshHolder.GetComponent<MeshRenderer> ()) {
  75. meshHolder.gameObject.AddComponent<MeshRenderer> ();
  76. }
  77. meshRenderer = meshHolder.GetComponent<MeshRenderer> ();
  78. meshFilter = meshHolder.GetComponent<MeshFilter> ();
  79. if (mesh == null) {
  80. mesh = new Mesh ();
  81. }
  82. meshFilter.sharedMesh = mesh;
  83. }
  84. void AssignMaterials () {
  85. if (material != null) {
  86. meshRenderer.sharedMaterial = material;
  87. }
  88. }
  89. }
  90. }