Example #1
0
        private void Start()
        {
            if (pathBehaviour == null)
            {
                pathBehaviour = GetComponent <PathBehaviour>();
            }

            if (autoStart)
            {
                IsMoving = true;
            }
        }
Example #2
0
        public Positioner2(Transform mover, GridPoint startPoint)
        {
            this.mover                = mover;
            movement                  = new MovementBehaviour(mover, settings);
            movement.onEndMove       += OnEndMove;
            movement.onStartRotation += OnStartRotation;
            movement.onEndRotation   += OnEndRotation;
            path = new PathBehaviour(mover, settings, startPoint);

            Upgrades.Instance.AddListener <LaborerSpeed> (
                (LaborerSpeed u) => speedMultiplier = u.CurrentValue
                );
        }
        private void DrawSegments(PathBehaviour pathBehaviour)
        {
            for (int segmentIndex = 0; segmentIndex < pathBehaviour.NumberOfSegments; ++segmentIndex)
            {
                var curKnot = pathBehaviour.Knots[segmentIndex % pathBehaviour.Knots.Count];
                var nexKnot = pathBehaviour.Knots[(segmentIndex + 1) % pathBehaviour.Knots.Count];

                Vector3 start        = pathBehaviour.PathSpaceToWorldSpace(curKnot.Position);
                Vector3 end          = pathBehaviour.PathSpaceToWorldSpace(nexKnot.Position);
                Vector3 startControl = pathBehaviour.PathSpaceToWorldSpace(curKnot.OutControlPoint + curKnot.Position);
                Vector3 endControl   = pathBehaviour.PathSpaceToWorldSpace(nexKnot.InControlPoint + nexKnot.Position);

                Handles.DrawBezier(start, end, startControl, endControl, Color.white, null, 2f);
            }
        }
        private bool DrawPointHandles(PathBehaviour pathBehaviour, CubicBezierKnot segment, int index)
        {
            // Check for changes in the path position.
            Vector3 position = pathBehaviour.PathSpaceToWorldSpace(segment.Position);

            bool selected = _list.index == index;
            bool dirty    = false;

            // Show a label to indicate which point is which.
            string pointName = string.Format("P{0}", index);

            Handles.color = Color.gray;
            Handles.Label(position + new Vector3(0, HandleUtility.GetHandleSize(position) * 0.3f, 0), pointName);

            bool moved = DrawHandle(ref position, position, pathBehaviour, index * 3 + 0, false, "Move Bezier Point", selected);

            if (moved)
            {
                position    = pathBehaviour.WorldSpaceToPathSpace(position);
                _list.index = index;
                // Keep the tangents at relative positions to the bezier point.
                segment.Position = position;
                dirty            = true;
            }

            if (segment.Type == CubicBezierKnotType.Singular || pathBehaviour.AutoControlPoints)
            {
                return(dirty);
            }

            // Check for changes in to the in control point.
            Vector3 inControlPoint = pathBehaviour.PathSpaceToWorldSpace(segment.InControlPoint + segment.Position);

            Handles.color = selected ? Color.yellow : Color.blue;
            Handles.DrawLine(position, inControlPoint);

            moved = DrawHandle(ref inControlPoint, position, pathBehaviour, index * 3 + 1, true, "Move Bezier Control Point", selected);
            if (moved)
            {
                inControlPoint         = pathBehaviour.WorldSpaceToPathSpace(inControlPoint) - segment.Position;
                _list.index            = index;
                segment.InControlPoint = inControlPoint;
                segment.RecalculateControlPoint(true, true);
                dirty = true;
            }

            // Check for changes to the out control point
            Vector3 outControlPoint = pathBehaviour.PathSpaceToWorldSpace(segment.OutControlPoint + segment.Position);

            Handles.color = selected ? Color.yellow : Color.blue;
            Handles.DrawLine(position, outControlPoint);

            moved = DrawHandle(ref outControlPoint, position, pathBehaviour, index * 3 + 2, true, "Move Bezier Control Point", selected);
            if (moved)
            {
                outControlPoint = pathBehaviour.WorldSpaceToPathSpace(outControlPoint) - segment.Position;
                _list.index     = index;

                segment.OutControlPoint = outControlPoint;
                segment.RecalculateControlPoint(false, true);
                dirty = true;
            }
            return(dirty);
        }
        private bool DrawHandle(ref Vector3 point, Vector3 basePoint, PathBehaviour pathBehaviour, int index, bool useCircleCap,
                                string undoMessage, bool selected)
        {
            const float HandleSize = 0.05f;

            Handles.CapFunction cap = Handles.DotHandleCap;
            float size         = HandleSize * HandleUtility.GetHandleSize(point);
            bool  isExtendMode = false;

            if (useCircleCap)
            {
                isExtendMode = (Event.current.modifiers & EventModifiers.Shift) != 0;

                if (isExtendMode)
                {
                    cap = Handles.CubeHandleCap;
                }
                else
                {
                    _lastSafeTangent = Vector3.zero;
                    cap = Handles.SphereHandleCap;
                }
                size *= 3;
            }
            if (selected)
            {
                Handles.color = useCircleCap ? new Color(1f, 172 / 255f, 97f / 255f) : Color.yellow;
            }
            else
            {
                Handles.color = useCircleCap ? new Color(13f / 255f, 63f / 255f, 147f / 255f) : Color.blue;
            }

            EditorGUI.BeginChangeCheck();
            bool    changed  = false;
            Vector3 oldPoint = point;

            point = Handles.FreeMoveHandle(point, Quaternion.identity, size, Vector3.zero, cap);

            if (isExtendMode)
            {
                Vector3 v1 = (oldPoint - basePoint);
                Vector3 v2 = (point - basePoint);
                if (v1.magnitude > 0f)
                {
                    _lastSafeTangent = v1.normalized;
                }
                else
                {
                    v1 = _lastSafeTangent;
                }
                point = Vector3.Project(v2, v1.normalized) + basePoint;
            }
            if (EditorGUI.EndChangeCheck())
            {
                changed = true;
            }

            if (changed)
            {
                Undo.RecordObject(pathBehaviour, undoMessage);
                EditorUtility.SetDirty(pathBehaviour);
            }
            return(changed);
        }