private void Start() { if (pathBehaviour == null) { pathBehaviour = GetComponent <PathBehaviour>(); } if (autoStart) { IsMoving = true; } }
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); }