Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
                }
            }
        }
Exemplo n.º 3
0
        /// <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;
            }
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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();
        }
Exemplo n.º 7
0
        /// <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;
            }
        }
Exemplo n.º 8
0
        /// <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);
        }
Exemplo n.º 9
0
        /// <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;
            }
        }
Exemplo n.º 10
0
        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));
            }
        }