MegaTracksEditor.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using UnityEngine;
  2. using UnityEditor;
  3. [CanEditMultipleObjects, CustomEditor(typeof(MegaTracks))]
  4. public class MegaTracksEditor : Editor
  5. {
  6. [MenuItem("GameObject/Create Other/MegaShape/Tracks")]
  7. static void CreateTracks()
  8. {
  9. Vector3 pos = Vector3.zero;
  10. if ( UnityEditor.SceneView.lastActiveSceneView )
  11. pos = UnityEditor.SceneView.lastActiveSceneView.pivot;
  12. GameObject go = new GameObject("Tracks Control");
  13. go.AddComponent<MegaTracks>();
  14. go.transform.position = pos;
  15. Selection.activeObject = go;
  16. }
  17. public override void OnInspectorGUI()
  18. {
  19. MegaTracks mod = (MegaTracks)target;
  20. #if !UNITY_5 && !UNITY_2017 && !UNITY_2018 && !UNITY_2019 && !UNITY_2020
  21. EditorGUIUtility.LookLikeControls();
  22. #endif
  23. //DrawDefaultInspector();
  24. mod.shape = (MegaShape)EditorGUILayout.ObjectField("Shape", mod.shape, typeof(MegaShape), true);
  25. if ( mod.shape != null )
  26. {
  27. if ( mod.shape.splines.Count > 1 )
  28. mod.curve = EditorGUILayout.IntSlider("Curve", mod.curve, 0, mod.shape.splines.Count - 1);
  29. }
  30. mod.LinkObj = (GameObject)EditorGUILayout.ObjectField("Link Object", mod.LinkObj, typeof(GameObject), true);
  31. mod.start = EditorGUILayout.FloatField("Start", mod.start);
  32. mod.linkOff = EditorGUILayout.Vector3Field("Link Off Start", mod.linkOff);
  33. mod.linkOff1 = EditorGUILayout.Vector3Field("Link Off End", mod.linkOff1);
  34. mod.linkPivot = EditorGUILayout.Vector3Field("Link Pivot", mod.linkPivot);
  35. mod.rotate = EditorGUILayout.Vector3Field("Rotate", mod.rotate);
  36. mod.linkRot = EditorGUILayout.Vector3Field("Link Rot", mod.linkRot);
  37. mod.randRot = EditorGUILayout.BeginToggleGroup("Rand Rot", mod.randRot);
  38. mod.seed = EditorGUILayout.IntField("Seed", mod.seed);
  39. EditorGUILayout.EndToggleGroup();
  40. mod.linkScale = EditorGUILayout.Vector3Field("Scale", mod.linkScale);
  41. mod.LinkSize = EditorGUILayout.FloatField("Link Size", mod.LinkSize);
  42. mod.trackup = EditorGUILayout.Vector3Field("Track Up", mod.trackup);
  43. mod.animate = EditorGUILayout.BeginToggleGroup("Animate", mod.animate);
  44. mod.speed = EditorGUILayout.FloatField("Speed", mod.speed);
  45. EditorGUILayout.EndToggleGroup();
  46. mod.dolateupdate = EditorGUILayout.Toggle("Do LateUpdate", mod.dolateupdate);
  47. mod.InvisibleUpdate = EditorGUILayout.Toggle("Invisible Update", mod.InvisibleUpdate);
  48. mod.displayspline = EditorGUILayout.Toggle("Display Spline", mod.displayspline);
  49. if ( GUI.changed )
  50. {
  51. mod.rebuild = true;
  52. EditorUtility.SetDirty(target);
  53. mod.Rebuild();
  54. }
  55. }
  56. #if UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_2017 || UNITY_2018 || UNITY_2019 || UNITY_2020
  57. [DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Pickable | GizmoType.InSelectionHierarchy)]
  58. #else
  59. [DrawGizmo(GizmoType.NotSelected | GizmoType.Pickable | GizmoType.SelectedOrChild)]
  60. #endif
  61. static void RenderGizmo(MegaTracks track, GizmoType gizmoType)
  62. {
  63. if ( (gizmoType & GizmoType.Active) != 0 && Selection.activeObject == track.gameObject )
  64. {
  65. if ( !track.displayspline )
  66. return;
  67. DrawGizmos(track, new Color(1.0f, 1.0f, 1.0f, 1.0f));
  68. Color col = Color.yellow;
  69. col.a = 0.5f; //0.75f;
  70. Gizmos.color = col; //Color.yellow;
  71. Matrix4x4 RingTM = Matrix4x4.identity;
  72. RingTM = track.transform.localToWorldMatrix * RingTM;
  73. float gsize = 0.1f;
  74. gsize *= 0.1f;
  75. if ( track.shape != null )
  76. {
  77. MegaSpline spl = track.shape.splines[track.curve];
  78. for ( int p = 0; p < spl.knots.Count; p++ )
  79. {
  80. Vector3 p1 = RingTM.MultiplyPoint(spl.knots[p].p);
  81. Gizmos.color = Color.green;
  82. Gizmos.DrawSphere(p1, gsize);
  83. }
  84. }
  85. }
  86. }
  87. static void DrawGizmos(MegaTracks track, Color modcol1)
  88. {
  89. Matrix4x4 RingTM = Matrix4x4.identity;
  90. Matrix4x4 tm = track.transform.localToWorldMatrix;
  91. if ( track.shape == null )
  92. return;
  93. MegaSpline spl = track.shape.splines[track.curve];
  94. float ldist = 1.0f * 0.1f;
  95. if ( ldist < 0.01f )
  96. ldist = 0.01f;
  97. Color modcol = modcol1;
  98. if ( spl.length / ldist > 500.0f )
  99. ldist = spl.length / 500.0f;
  100. float ds = spl.length / (spl.length / ldist);
  101. if ( ds > spl.length )
  102. ds = spl.length;
  103. int c = 0;
  104. int k = -1;
  105. int lk = -1;
  106. Vector3 first = spl.Interpolate(0.0f, true, ref lk);
  107. RingTM = tm * RingTM;
  108. for ( float dist = ds; dist < spl.length; dist += ds )
  109. {
  110. float alpha = dist / spl.length;
  111. Vector3 pos = spl.Interpolate(alpha, true, ref k);
  112. if ( (c & 1) == 1 )
  113. Gizmos.color = Color.black * modcol;
  114. else
  115. Gizmos.color = Color.yellow * modcol;
  116. if ( k != lk )
  117. {
  118. for ( lk = lk + 1; lk <= k; lk++ )
  119. {
  120. Gizmos.DrawLine(RingTM.MultiplyPoint(first), RingTM.MultiplyPoint(spl.knots[lk].p));
  121. first = spl.knots[lk].p;
  122. }
  123. }
  124. lk = k;
  125. Gizmos.DrawLine(RingTM.MultiplyPoint(first), RingTM.MultiplyPoint(pos));
  126. c++;
  127. first = pos;
  128. }
  129. if ( (c & 1) == 1 )
  130. Gizmos.color = Color.blue * modcol;
  131. else
  132. Gizmos.color = Color.yellow * modcol;
  133. Vector3 lastpos;
  134. if ( spl.closed )
  135. lastpos = spl.Interpolate(0.0f, true, ref k);
  136. else
  137. lastpos = spl.Interpolate(1.0f, true, ref k);
  138. Gizmos.DrawLine(RingTM.MultiplyPoint(first), RingTM.MultiplyPoint(lastpos));
  139. }
  140. }