/// <summary> /// Extends the functionality of the scene view so that the user can draw paths without having to create the /// objects in the inspector first then move them around /// </summary> private void OnSceneGUI() { TrackBehaviour t = target as TrackBehaviour; if (t == null) { return; } Event e = Event.current; switch (e.type) { case EventType.KeyDown: if (Event.current.keyCode == KeyCode.P) { Ray ray = UnityEditor.HandleUtility.GUIPointToWorldRay(e.mousePosition); if (t.Points.Count > 0) { if (Vector2.Distance(t.Points[t.Points.Count - 1].position, new Vector3(ray.origin.x, ray.origin.y, 0)) < 1.0f) { break; } } var newObj = GameObject.CreatePrimitive(PrimitiveType.Cube); newObj.name = t.name + "Point " + t.Points.Count; newObj.GetComponent <MeshRenderer>().enabled = false; newObj.transform.position = new Vector3(ray.origin.x, ray.origin.y, 0); t.Points.Add(newObj.transform); newObj.transform.parent = t.transform; } if (Event.current.keyCode == KeyCode.O) { if (t.Points.Count > 0) { DestroyImmediate(t.Points[t.Points.Count - 1].gameObject); t.Points.RemoveAt(t.Points.Count - 1); } } if (Event.current.keyCode == KeyCode.I) { foreach (var p in t.Points) { p.GetComponent <MeshRenderer>().enabled = !p.GetComponent <MeshRenderer>().enabled; } } if (Event.current.keyCode == KeyCode.U) { if (t.Points.Contains(UnityEditor.Selection.activeTransform)) { t.Points.Remove(UnityEditor.Selection.activeTransform); DestroyImmediate(UnityEditor.Selection.activeTransform.gameObject); } } break; } }
public TrackContext(TrackBehaviour track, ClipBehaviour[] clips, float frameRate, SequenceBehaviour sequence, IReadOnlyList <Blackboard> blackboards) { m_CurrentTime = -1f; m_Track = track; m_Track.OnCreate(sequence, blackboards); m_ClipContexts = new ClipContext[clips.Length]; for (int i = 0; i < m_ClipContexts.Length; i++) { m_ClipContexts[i] = clips[i].CreateContext(frameRate, sequence, blackboards); } }
/// <summary> /// Takes the points in the argument passed in and creates scene objects at that position for the user to /// visualize the track in the scene /// </summary> /// <param name="points">The positions of the points in the track</param> void AssignPoints(Vector3[] points) { TrackBehaviour t = target as TrackBehaviour; foreach (var point in points) { var newObj = GameObject.CreatePrimitive(PrimitiveType.Cube); newObj.name = t.name + "Point " + t.Points.Count; newObj.GetComponent <MeshRenderer>().enabled = false; newObj.transform.position = point; t.Points.Add(newObj.transform); t.TracksPoints.Add(new TrackPoint() { PositionOnTrack = t.Points.Count - 1, SpeedModifier = 1 }); newObj.transform.parent = t.transform; } }
void MergeTracks(TrackBehaviour[] SelectedTracks) { TrackBehaviour t = target as TrackBehaviour; if (SelectedTracks.Length <= 1) { return; } else { foreach (var track in SelectedTracks) { if (track != t) { t.IsLoop = false; track.IsLoop = false; t.Points.AddRange(track.Points); t.TracksPoints.AddRange(track.TracksPoints); track.transform.parent = t.transform; DestroyImmediate(track); } } } }
/// <summary> /// Overrides the way the component is drawn in the inspector /// </summary> public override void OnInspectorGUI() { TrackBehaviour t = target as TrackBehaviour; if (t.Points == null) { t.Points = new List <Transform>(); } if (t.TracksPoints == null) { t.TracksPoints = new List <TrackPoint>(); foreach (var p in t.Points) { t.TracksPoints.Add(new TrackPoint() { PositionOnTrack = t.Points.IndexOf(p), SpeedModifier = 1, HasBeenReached = false }); } } if (GUILayout.Button("Clear Path")) { t.ClearPath(); } t.VisualTrack = UnityEditor.EditorGUILayout.ToggleLeft("Show Tracks", t.VisualTrack); if (t.VisualTrack) { t.TrackWidth = UnityEditor.EditorGUILayout.FloatField("Track Width", t.TrackWidth); if (t.TrackWidth < 0.01f) { t.TrackWidth = 0.01f; } //t.HasZipperEffect = UnityEditor.EditorGUILayout.ToggleLeft("Has Zipper Effect", t.HasZipperEffect); } UnityEditor.EditorGUILayout.LabelField("Preset Tracks"); t.IsLoop = UnityEditor.EditorGUILayout.ToggleLeft("Is Looping", t.IsLoop); t.UsePreset = (TrackBehaviour.PresetTracks)UnityEditor.EditorGUILayout.EnumPopup(t.UsePreset); switch (t.UsePreset) { case TrackBehaviour.PresetTracks.none: break; case TrackBehaviour.PresetTracks.circle: t.Radius = UnityEditor.EditorGUILayout.FloatField("Circle Radius", t.Radius); if (GUILayout.Button("Generate Circle")) { t.IsLoop = true; t.ClearPath(); AssignPoints(GenerateRotationPoints(t.gameObject)); } break; case TrackBehaviour.PresetTracks.simi_circle: t.Radius = UnityEditor.EditorGUILayout.FloatField("Circle Radius", t.Radius); t.MaxAngle = UnityEditor.EditorGUILayout.FloatField("Simi-Circle Angle", t.MaxAngle); if (GUILayout.Button("Generate Simi-Circle")) { t.IsLoop = false; t.ClearPath(); AssignPoints(GenerateRotationPoints(t.gameObject, t.MaxAngle)); } break; case TrackBehaviour.PresetTracks.square: Width = UnityEditor.EditorGUILayout.FloatField("Width", Width); Height = UnityEditor.EditorGUILayout.FloatField("Height", Height); if (GUILayout.Button("Generate Square")) { t.IsLoop = true; t.ClearPath(); List <Vector3> points = new List <Vector3>() { new Vector3(t.transform.position.x - (Width / 2), t.transform.position.y + (Height / 2), 0), //tL new Vector3(t.transform.position.x - (Width / 2), t.transform.position.y - (Height / 2), 0), //bL new Vector3(t.transform.position.x + (Width / 2), t.transform.position.y - (Height / 2), 0), //bR new Vector3(t.transform.position.x + (Width / 2), t.transform.position.y + (Height / 2), 0) }; //tR AssignPoints(points.ToArray()); } break; } if (t.VisualTrack) { t.GetComponent <LineRenderer>().enabled = true; t.GetComponent <LineRenderer>().positionCount = t.Points.Count; for (int i = 0; i < t.Points.Count; i++) { t.GetComponent <LineRenderer>().SetPosition(i, t.Points[i].transform.position); if (i == t.Points.Count - 1 && t.IsLoop) { t.GetComponent <LineRenderer>().positionCount = t.Points.Count + 1; t.GetComponent <LineRenderer>().SetPosition(i + 1, t.Points[0].transform.position); } } t.GetComponent <LineRenderer>().startWidth = t.TrackWidth; t.GetComponent <LineRenderer>().endWidth = t.TrackWidth; } else { if (t != null) { t.GetComponent <LineRenderer>().enabled = false; } } var selectedObjects = UnityEditor.Selection.gameObjects; foreach (var obj in selectedObjects) { if (t.Points.Contains(obj.transform)) { GUILayout.Label(obj.name + "[Track Position: " + t.Points.IndexOf(obj.transform) + "]"); t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier = UnityEditor.EditorGUILayout.FloatField("Speed Modifier: ", t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier); t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier = GUILayout.HorizontalSlider(t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier, 0.1f, 2.0f); t.TracksPoints[t.Points.IndexOf(obj.transform)].IsStoppingPoints = GUILayout.Toggle(t.TracksPoints[t.Points.IndexOf(obj.transform)].IsStoppingPoints, "Is Stopping Point"); if (t.TracksPoints[t.Points.IndexOf(obj.transform)].IsStoppingPoints) { t.TracksPoints[t.Points.IndexOf(obj.transform)].StopDelay = UnityEditor.EditorGUILayout.FloatField("Stop Delay: ", t.TracksPoints[t.Points.IndexOf(obj.transform)].StopDelay); } if (t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier > 2) { t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier = 2; } else if (t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier < 0.1) { t.TracksPoints[t.Points.IndexOf(obj.transform)].SpeedModifier = 0.1f; } } } if (selectedObjects.Length > 1) { if (GUILayout.Button("Merge Tracks")) { var selectedTracks = new List <TrackBehaviour>(); foreach (var obj in selectedObjects) { if (obj.GetComponent <TrackBehaviour>()) { selectedTracks.Add(obj.GetComponent <TrackBehaviour>()); } } MergeTracks(selectedTracks.ToArray()); } } foreach (var obj in selectedObjects) { if (obj.GetComponent <TrackBehaviour>()) { if (obj.name != t.name) { GUILayout.Label(obj.name); } } } }