private void switchToNextPosition() { LocomotionActionEvent locomotionActionEvent = positionTimeline.Dequeue(); LocomotionController currentController = locomotionTracker.GetCurrentController(); Vector3 vector = ((currentController != null) ? currentController.GetPosition() : base.transform.position); Vector3 wsSteerInput = locomotionActionEvent.Position - vector; wsSteerInput.y = 0f; if (locomotionActionEvent.Direction.HasValue) { wsSteerInput = locomotionActionEvent.Direction.Value; if (locomotionActionEvent.Type.IsMovement()) { lastStickDirection = wsSteerInput; } } if (currentController != null && !(currentController is SlideController)) { if (locomotionActionEvent.Type.IsMovement()) { currentController.Steer(wsSteerInput); } else if (locomotionActionEvent.Type == LocomotionAction.Rotate) { currentController.SteerRotation(wsSteerInput); } } desiredStartEvent = desiredTargetEvent; desiredTargetEvent = locomotionActionEvent; startPosition = vector; startFacing = ((currentController != null) ? currentController.GetFacing() : base.transform.forward); state = SyncState.INTERPOLATION; }
private void LateUpdate() { SyncState syncState = state; if (syncState != SyncState.INTERPOLATION || desiredStartEvent.Timestamp == desiredTargetEvent.Timestamp) { return; } LocomotionController currentController = locomotionTracker.GetCurrentController(); float t = (float)(motionSequenceStartTime + timer.ElapsedMilliseconds - desiredStartEvent.Timestamp) / (float)(desiredTargetEvent.Timestamp - desiredStartEvent.Timestamp); Vector3 vector = Vector3.Lerp(startPosition, desiredTargetEvent.Position, t); if (!Allow3DMovement) { vector.y = ((currentController != null) ? currentController.GetPosition().y : base.transform.position.y); } if (currentController != null) { currentController.RemoteSetPosition(vector); if (currentController is SlideController && desiredTargetEvent.Velocity.HasValue) { Vector3 newFacing = Vector3.Slerp(startFacing, desiredTargetEvent.Velocity.Value, t); currentController.RemoteSetFacing(newFacing); } } else { base.transform.position = vector; } }
private void snapIfNeeded(Vector3 target) { LocomotionController currentController = locomotionTracker.GetCurrentController(); Vector3 b = ((currentController != null) ? currentController.GetPosition() : base.transform.position); if (!Allow3DMovement) { if (Vector2.Distance(new Vector2(target.x, target.z), new Vector2(b.x, b.z)) > SnapThreshold) { snapToGround(target); } if (Mathf.Abs(target.y - b.y) > SnapHeightThreshold) { snapToGround(target); } } else if (Vector3.Distance(target, b) > SnapThreshold) { snapToPosition(target); } }
private void Update() { if (!receivingEnabled) { return; } switch (state) { case SyncState.IDLE: if (positionTimeline.Count > 0) { desiredTargetEvent = positionTimeline.Peek(); snapIfNeeded(desiredTargetEvent.Position); timer.Reset(); timer.Start(); state = SyncState.WAITING; } break; case SyncState.WAITING: if (timer.ElapsedMilliseconds > InterpolationDelay || positionTimeline.PeekLast().Timestamp - desiredTargetEvent.Timestamp >= InterpolationDelay) { timer.Reset(); timer.Start(); switchToNextPosition(); motionSequenceStartTime = desiredStartEvent.Timestamp; } break; case SyncState.INTERPOLATION: if (!timeForPosition(desiredStartEvent, desiredTargetEvent)) { break; } triggerEventAction(desiredTargetEvent); if (positionTimeline.Count == 0) { LocomotionController currentController = locomotionTracker.GetCurrentController(); if (currentController != null && !(currentController is SlideController)) { currentController.Steer(lastStickDirection.normalized); } if (lastStickDirection == Vector3.zero) { timer.Stop(); state = SyncState.IDLE; } else { state = SyncState.EXTRAPOLATION; } } else { switchToNextPosition(); } break; case SyncState.EXTRAPOLATION: { LocomotionController currentController = locomotionTracker.GetCurrentController(); if (positionTimeline.Count == 0) { if (timer.ElapsedMilliseconds > MaxExtrapolationTime) { if (currentController != null && !(currentController is SlideController)) { currentController.Steer(Vector3.zero); } timer.Stop(); lastStickDirection = Vector3.zero; state = SyncState.IDLE; } } else { desiredTargetEvent.Position = ((currentController != null) ? currentController.GetPosition() : base.transform.position); desiredTargetEvent.Timestamp = motionSequenceStartTime + timer.ElapsedMilliseconds; switchToNextPosition(); } break; } } }
private Vector3 getCurrentPosition() { LocomotionController currentController = locomotionTracker.GetCurrentController(); return((currentController != null) ? currentController.GetPosition() : base.transform.position); }