/// <summary>The primary method for drawing a Rail component on the scene view</summary> /// <param name="rail">The rail to draw</param> /// <param name="handleSize">Handle size</param> /// <param name="snapSize">Snap Size</param> /// <param name="snapActive">Indicates whether positioning should snap to a grid</param> /// <param name="nodeRemovalActive">Indicates whether nodes are able to be removed</param> /// <param name="drawEditorHandles">Indicates whether interactive handles should be drawn</param> public static void DrawRailOnScene(Rail rail, float handleSize, Vector3 snapSize, bool snapActive = false, bool nodeRemovalActive = false, bool drawEditorHandles = false) { Handles.color = EditorPreferences.GetColor32(EditorPreferences.RailColorKey, EditorPreferences.RailColorValue); var nodes = rail.Nodes; // Editor Handles if (drawEditorHandles) { if (nodeRemovalActive && nodes.Count > 2) { DrawRailNodeRemoveButtons(rail, handleSize); Handles.color = EditorPreferences.GetColor32(EditorPreferences.RailColorKey, EditorPreferences.RailColorValue); } else { DrawRailNodeInsertButtons(rail, handleSize); DrawRailNodeAddButton(rail, snapActive, handleSize, snapSize.x); DrawRailNodeInsertAtStartButton(rail, snapActive, handleSize, snapSize.x); DrawRailNodeFreeMoveHandles(rail, handleSize, snapSize); } } // Node Index Labels Vector2 nodeIndexLabelOffset = new Vector2(-handleSize * 0.2f, handleSize * 1.2f); for (int j = 0; j < nodes.Count; j++) { DrawTextAtPosition(j.ToString(), nodes[j].Position + nodeIndexLabelOffset, Handles.color, false); } // Rail Name Label DrawTextAtPosition(rail.gameObject.name, nodes[0].Position, Handles.color, true); }
/// <summary>Draws a line that represents a rail's path</summary> /// <param name="rail">The rail whose path to draw</param> private void DrawRailPath() { if (LeadIn > 0f || TrailOut > 0f) { // Calculate end positions of Rail that camera can reach var trailOutMidPoint = Nodes[Nodes.Count - 1].Position; var leadInMidPoint = Nodes[0].Position; if (TrailOut > 0f) { trailOutMidPoint = Vector2.Lerp(Nodes[Nodes.Count - 2].Position, Nodes[Nodes.Count - 1].Position, 1f - TrailOut); } if (LeadIn > 0f) { if (Nodes.Count == 2) { leadInMidPoint = Vector2.Lerp(Nodes[0].Position, trailOutMidPoint, LeadIn); } else { leadInMidPoint = Vector2.Lerp(Nodes[0].Position, Nodes[1].Position, LeadIn); } } // Create list of positions including new ends of Rail var newPositions = new List <Vector2>(); newPositions.Add(leadInMidPoint); for (int i = 1; i < Nodes.Count - 1; i++) { newPositions.Add(Nodes[i].Position); } newPositions.Add(trailOutMidPoint); // Draw Rail for (int i = 0; i < newPositions.Count - 1; i++) { Gizmos.DrawLine(newPositions[i], newPositions[i + 1]); } // Draw LeadIn and TrailOut out of bounds parts of Rail Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.RailFXColorKey, EditorPreferences.RailFXColorValue); if (LeadIn > 0f) { Gizmos.DrawLine(Nodes[0].Position, leadInMidPoint); } if (TrailOut > 0f) { Gizmos.DrawLine(trailOutMidPoint, Nodes[Nodes.Count - 1].Position); } } else { for (int i = 0; i < Nodes.Count - 1; i++) { Gizmos.DrawLine(Nodes[i].Position, Nodes[i + 1].Position); } } }
/// <summary>Draws Free Move Handles for the specified trigger</summary> /// <param name="trigger">The trigger to draw handles for</param> /// <param name="handleSize">Handle size</param> /// <param name="snapSize">Snap size</param> public static void DrawTriggerFreeMoveHandles(Trigger trigger, float handleSize, Vector3 snapSize) { Handles.color = EditorPreferences.GetColor32(EditorPreferences.TriggerColorKey, EditorPreferences.TriggerColorValue); var moveHandleSize = 0.5f * handleSize; Vector2 newPosition = Handles.FreeMoveHandle(trigger.Position, Quaternion.identity, moveHandleSize, snapSize, Handles.RectangleHandleCap); if (trigger.Position != newPosition) { Undo.RecordObject(trigger, "Move Trigger"); trigger.Position = newPosition; } }
private static void CustomPreferencesGUI() { if(!_prefsLoaded) { _cameraTargetColor = EditorPreferences.GetColor32(_cameraTargetColorKey, _cameraTargetColorValue); _cameraBoundColor = EditorPreferences.GetColor32(_cameraBoundColorKey, _cameraBoundColorValue); _railColor = EditorPreferences.GetColor32(_railColorKey, _railColorValue); _railFXColor = EditorPreferences.GetColor32(_railFXColorKey, _railFXColorValue); _triggerColor = EditorPreferences.GetColor32(_triggerColorKey, _triggerColorValue); _snapInterval = EditorPrefs.GetFloat(_snapIntervalKey, _snapIntervalValue); _prefsLoaded = true; } EditorGUILayout.LabelField("Gizmo Colors", EditorStyles.boldLabel); _cameraTargetColor = EditorGUILayout.ColorField(_cameraTargetColorKey, _cameraTargetColor); _cameraBoundColor = EditorGUILayout.ColorField(_cameraBoundColorKey, _cameraBoundColor); _railColor = EditorGUILayout.ColorField(_railColorKey, _railColor); _railFXColor = EditorGUILayout.ColorField(_railFXColorKey, _railFXColor); _triggerColor = EditorGUILayout.ColorField(_triggerColorKey, _triggerColor); EditorGUILayout.Space(); EditorGUILayout.LabelField("General", EditorStyles.boldLabel); _snapInterval = EditorGUILayout.FloatField(_snapIntervalKey, _snapInterval); EditorGUILayout.Space(); EditorGUILayout.Space(); if (GUILayout.Button("Restore defaults")) { _cameraTargetColor = _cameraTargetColorValue; _cameraBoundColor = _cameraBoundColorValue; _railColor = _railColorValue; _railFXColor = _railFXColorValue; _triggerColor = _triggerColorValue; _snapInterval = _snapIntervalValue; } if (GUI.changed) { EditorPreferences.SetColor32(_cameraTargetColorKey, _cameraTargetColor); EditorPreferences.SetColor32(_cameraBoundColorKey, _cameraBoundColor); EditorPreferences.SetColor32(_railColorKey, _railColor); EditorPreferences.SetColor32(_railFXColorKey, _railFXColor); EditorPreferences.SetColor32(_triggerColorKey, _triggerColor); EditorPrefs.SetFloat(_snapIntervalKey, _snapInterval); } }
private void OnDrawGizmosSelected() { Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.TriggerColorKey, EditorPreferences.TriggerColorValue); // Trigger Shape if (Shape == TriggerShape.Circle) { Utilities.GizmosDrawWireDisc(Position, Radius); } else { Gizmos.DrawWireCube(Position, Size); } }
private void OnDrawGizmosSelected() { Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.RailColorKey, EditorPreferences.RailColorValue); var handleSize = HandleUtility.GetHandleSize(Vector3.zero) * 0.2f; var nodeHandleSize = (transform.parent == null || GetComponentInParent <RailManager>() == null) ? handleSize * 0.25f : handleSize; var nodeGizmoSize = new Vector2(nodeHandleSize, nodeHandleSize); for (int i = 0; i < Nodes.Count; i++) { // Nodes Gizmos.DrawWireCube(Nodes[i].Position, nodeGizmoSize); } DrawRailPath(); }
/// <summary>Draws a circle with interactive handles for radius</summary> /// <param name="trigger">The trigger to draw as a circle</param> /// <param name="handleSize">Handle size</param> public static void DrawDynamicCircleTrigger(Trigger trigger, float handleSize, Vector3 snapSize) { Handles.color = EditorPreferences.GetColor32(EditorPreferences.TriggerColorKey, EditorPreferences.TriggerColorValue); Handles.DrawLine(trigger.Position + new Vector2(0.5f * handleSize, 0f), trigger.Position + new Vector2(trigger.Radius, 0f)); float newRadius = Handles.FreeMoveHandle((trigger.Position + new Vector2(trigger.Radius, 0f)), Quaternion.identity, 0.25f * handleSize, snapSize, Handles.RectangleHandleCap).x - trigger.Position.x; if (trigger.Radius != newRadius) { Undo.RecordObject(trigger, "Change Trigger Radius"); if (newRadius < 0f) { newRadius = 0f; } trigger.Radius = newRadius; } }
/// <summary>The primary method for drawing a Trigger component on the scene view</summary> /// <param name="trigger">The trigger to draw</param> /// <param name="handleSize">Handle size</param> /// <param name="snapSize">Snap Size</param> /// <param name="drawEditorHandles">Indicates whether interactive handles should be drawn</param> public static void DrawTriggerOnScene(Trigger trigger, float handleSize, Vector3 snapSize, bool drawEditorHandles = false) { Handles.color = EditorPreferences.GetColor32(EditorPreferences.TriggerColorKey, EditorPreferences.TriggerColorValue); if (drawEditorHandles) { DrawTriggerFreeMoveHandles(trigger, handleSize, snapSize); } else { Handles.DrawWireCube(trigger.Position, new Vector2(handleSize * 0.25f, handleSize * 0.25f)); } // Trigger Shape if (trigger.Shape == TriggerShape.Rectangle) { // Draw Rectangle Editor Handles if (drawEditorHandles) { DrawDynamicRectangleTrigger(trigger, handleSize, snapSize); } } else if (trigger.Shape == TriggerShape.Circle) { // Draw Circle Editor Handles if (drawEditorHandles) { DrawDynamicCircleTrigger(trigger, handleSize, snapSize); } } // Trigger Name Text string triggerText = trigger.gameObject.name; // Trigger Event Text if (drawEditorHandles) { triggerText += GetTriggerEventText(trigger); } DrawTextAtPosition(triggerText, trigger.Position, Handles.color, true); }
/// <summary>Draws a rectangle with interactive handles for size</summary> /// <param name="trigger">The trigger to draw as a rectangle</param> /// <param name="handleSize">Handle size</param> public static void DrawDynamicRectangleTrigger(Trigger trigger, float handleSize, Vector3 snapSize) { Handles.color = EditorPreferences.GetColor32(EditorPreferences.TriggerColorKey, EditorPreferences.TriggerColorValue); Handles.DrawLine(trigger.Position + new Vector2(0.5f * handleSize, 0f), trigger.Position + new Vector2(trigger.Size.x * 0.5f, 0f)); Handles.DrawLine(trigger.Position + new Vector2(0f, 0.5f * handleSize), trigger.Position + new Vector2(0f, trigger.Size.y * 0.5f)); float newSizeX = 2f * (Handles.FreeMoveHandle((trigger.Position + new Vector2(trigger.Size.x * 0.5f, 0f)), Quaternion.identity, 0.25f * handleSize, snapSize, Handles.RectangleHandleCap).x - trigger.Position.x); if (trigger.Size.x != newSizeX) { Undo.RecordObject(trigger, "Change Trigger Size"); if (newSizeX < 0f) { newSizeX = 0f; } trigger.Size.x = newSizeX; } float newSizeY = 2f * (Handles.FreeMoveHandle((trigger.Position + new Vector2(0f, trigger.Size.y * 0.5f)), Quaternion.identity, 0.25f * handleSize, snapSize, Handles.RectangleHandleCap).y - trigger.Position.y); if (trigger.Size.y != newSizeY) { Undo.RecordObject(trigger, "Change Trigger Size"); if (newSizeY < 0f) { newSizeY = 0f; } trigger.Size.y = newSizeY; } }
private void OnDrawGizmosSelected() { if (Target == null && (_currentRail == null || _currentRail.Target == null)) { return; } var camera = GetComponent <Camera>(); var gizmoZPos = transform.position.z + Mathf.Abs(transform.position.z) * transform.forward.z; Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.CameraTargetColorKey, EditorPreferences.CameraTargetColorValue); // Current camera position var screenSizeY = Utilities.GetScreenSizeInWorldUnits(camera, Mathf.Abs(transform.position.z)).y; var cameraPos = new Vector3(transform.position.x, transform.position.y, gizmoZPos); Utilities.GizmosDrawWireDisc(cameraPos, screenSizeY * 0.02f); Utilities.GizmosDrawWireDisc(cameraPos, screenSizeY * 0.015f); Gizmos.DrawRay(cameraPos - new Vector3(screenSizeY * 0.02f, 0f, 0f), new Vector2(screenSizeY * 0.04f, 0f)); Gizmos.DrawRay(cameraPos - new Vector3(0f, screenSizeY * 0.02f, 0f), new Vector2(0f, screenSizeY * 0.04f)); // Intended Position var intendedPos = new Vector3(_intendedPosition.x, _intendedPosition.y, gizmoZPos); Utilities.GizmosDrawWireDisc(intendedPos, screenSizeY * 0.01f); Gizmos.DrawRay(intendedPos - new Vector3(screenSizeY * 0.01f, 0f, 0f), new Vector2(screenSizeY * 0.02f, 0f)); Gizmos.DrawRay(intendedPos - new Vector3(0f, screenSizeY * 0.01f, 0f), new Vector2(0f, screenSizeY * 0.02f)); Gizmos.DrawLine(cameraPos, intendedPos); // Offset if (OffsetX > 0f || OffsetY > 0f) { var intendedPosWithoutOffset = new Vector3(_intendedPositionWithoutOffset.x, _intendedPositionWithoutOffset.y, gizmoZPos); Gizmos.DrawWireSphere(intendedPosWithoutOffset, screenSizeY * 0.0125f); Gizmos.DrawLine(intendedPosWithoutOffset, intendedPos); } // Smoothing Bounds if (SmoothX > 0f && BoundX > 0f) { Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.CameraBoundColorKey, EditorPreferences.CameraBoundColorValue); if (SmoothX > 0f && BoundY > 0f) { Gizmos.DrawWireCube(cameraPos, new Vector3(BoundX * _screenSizeInWorldUnits.x, BoundY * _screenSizeInWorldUnits.y, 0f)); } else { var bottomLeft = cameraPos - new Vector3(_screenSizeInWorldUnits.x * 0.5f * BoundX, _screenSizeInWorldUnits.y * 0.5f, 0f); var bottomRight = cameraPos - new Vector3(-_screenSizeInWorldUnits.x * 0.5f * BoundX, _screenSizeInWorldUnits.y * 0.5f, 0f); Gizmos.DrawRay(bottomLeft, new Vector3(0f, _screenSizeInWorldUnits.y * 0.5f * 2f, 0f)); Gizmos.DrawRay(bottomRight, new Vector3(0f, _screenSizeInWorldUnits.y * 0.5f * 2f, 0f)); } } else if (SmoothY > 0f && BoundY > 0f) { Gizmos.color = EditorPreferences.GetColor32(EditorPreferences.CameraBoundColorKey, EditorPreferences.CameraBoundColorValue); var bottomLeft = cameraPos - new Vector3(_screenSizeInWorldUnits.x * 0.5f, _screenSizeInWorldUnits.y * 0.5f * BoundY, 0f); var topLeft = cameraPos - new Vector3(_screenSizeInWorldUnits.x * 0.5f, -_screenSizeInWorldUnits.y * 0.5f * BoundY, 0f); Gizmos.DrawRay(bottomLeft, new Vector3(_screenSizeInWorldUnits.x, 0f, 0f)); Gizmos.DrawRay(topLeft, new Vector3(_screenSizeInWorldUnits.x, 0f, 0f)); } }