void Play() { isPlaying = true; music.Play(); startTime = AudioSettings.dspTime; nextBeatLine = beatLines.GetNext(); }
public BeatLerper(BPMEvent[] events_arr, double offset) { IEnumerable <BPMEvent> events = events_arr.OrderBy(ev => ev.beat); List <BeatLine> lines_l = new List <BeatLine>(); BPMEvent ev1 = events.First(); if (ev1.type == BPMEventType.Stop) { Debug.LogException(new System.Exception("First BPM event must be a BPM change")); } lines_l.Add(new BeatLine(0, double.PositiveInfinity, ev1.newBPM / 60, 0, offset)); foreach (BPMEvent ev in events.Skip(1)) { BeatLine left = lines_l.Last(); left.end = left.TimeFromBeat(ev.beat); lines_l[lines_l.Count - 1] = left; if (ev.type == BPMEventType.BPMChange) { double new_bps = ev.newBPM / 60; lines_l.Add(new BeatLine(left.end, double.PositiveInfinity, new_bps, ev.beat - new_bps * left.end, offset)); } else // it's a stop { lines_l.Add(new BeatLine(left.end, left.end + ev.stopDuration, 0, ev.beat, offset)); lines_l.Add(new BeatLine(left.end + ev.stopDuration, double.PositiveInfinity, left.bps, ev.beat - left.bps * (left.end + ev.stopDuration), offset)); } } lines = lines_l.ToArray(); }
void Update() { if (!isPlaying) { return; } double currentTime = AudioSettings.dspTime - startTime; Vector3 pos = slider.transform.position; pos.z = (float)(currentTime * DistancePerSec); slider.transform.position = pos; if (nextBeatLine != null && pos.z + 1.0f >= nextBeatLine.transform.position.z) { nextBeatLine.Clear(Mathf.Abs(slider.GetPointerX() - nextBeatLine.GetBeatPosX()) <= SuccessDistance); nextBeatLine = beatLines.GetNext(); } if (fullSpinSign == 0) { if (!slider.FullSpinBound.HasValue) { Vector3 cameraAngles = cameraObject.transform.eulerAngles; cameraAngles.z = Mathf.Lerp(-CameraAngleMax, CameraAngleMax, slider.CurrentPointerValue); cameraObject.transform.eulerAngles = cameraAngles; } else { fullSpinSign = slider.FullSpinBound == 0 ? 1 : -1; fullSpinCurrent = cameraObject.transform.eulerAngles.z; if (fullSpinCurrent > CameraAngleMax) { fullSpinCurrent -= 360; } else if (fullSpinCurrent < -CameraAngleMax) { fullSpinCurrent += 360; } fullSpinTarget = fullSpinSign == -1 ? -360 : 360; fullSpinProgress = 0; } } else { fullSpinProgress += Time.deltaTime * fullSpinSpeed; fullSpinProgress = Mathf.Min(fullSpinProgress, 1); Vector3 cameraAngles = cameraObject.transform.eulerAngles; cameraAngles.z = Mathf.Lerp(fullSpinCurrent, fullSpinTarget, fullSpinProgress); if (fullSpinProgress >= 1) { fullSpinSign = 0; } cameraObject.transform.eulerAngles = cameraAngles; } }