private IEnumerable <object> marbleReset(MarbleTumbleModule m) { var orig1rot = m.MarbleLayer1.transform.localRotation; var orig2x = m.MarbleLayer2.transform.localPosition.x; var orig2rot = m.MarbleLayer2.transform.localRotation; var orig3rot = m.MarbleLayer3.transform.localRotation; var newRandomRot = Quaternion.Euler(Rnd.Range(0, 360), Rnd.Range(0, 360), Rnd.Range(0, 360)); float duration = 1f; float elapsed = 0; while (elapsed < duration) { elapsed += Time.deltaTime; var t = Mathf.Min(duration, elapsed) / duration; m.MarbleLayer1.transform.localRotation = Quaternion.Slerp(orig1rot, Quaternion.identity, t); m.SetMarblePos(Easing.OutSine(t, orig2x, -.062f, 1), t * (1 - t) * .1f); m.MarbleLayer2.transform.localRotation = Quaternion.Slerp(orig2rot, Quaternion.identity, t); m.MarbleLayer3.transform.localRotation = Quaternion.Slerp(orig3rot, newRandomRot, t); yield return(null); } duration = .1f; elapsed = 0; while (elapsed < duration) { elapsed += Time.deltaTime; m.SetMarblePos(Easing.InQuad(Mathf.Min(duration, elapsed), -.062f, -.058f, duration)); yield return(null); } }
public override IEnumerable <object> RunAnimation(MarbleTumbleModule m) { m.Audio.PlaySoundAtTransform("Marble" + (2 * (FromIndex - IntoIndex)), m.transform); var elapsed = 0f; var duration = .2f * (FromIndex - IntoIndex); var origRoll = m.MarbleLayer2.transform.localEulerAngles.z; var fromX = m.MarbleLayer2.transform.localPosition.x; var toX = IsGap ? (IntoIndex == 0 ? .002f : -.01f * (IntoIndex + .5f) - .003f) : -.01f * (IntoIndex + 1) - .0004f; while (elapsed < duration) { elapsed += Time.deltaTime; var movement = Easing.InQuad(Mathf.Min(duration, elapsed), 0, toX - fromX, duration); m.SetMarblePos(movement + fromX); m.MarbleLayer2.transform.localEulerAngles = new Vector3(0, 0, origRoll - movement / .003f / Mathf.PI * 180); yield return(null); } if (IntoIndex == 0 && IsGap) { m.Audio.PlayGameSoundAtTransform(KMSoundOverride.SoundEffect.CorrectChime, m.transform); m.Module.HandlePass(); m._isSolved = true; } else if (!IsGap) { m.Module.HandleStrike(); var coroutines = (Rotation4 != null ? new[] { animate(4, -1, Rotation4.RotateFrom, Rotation4.RotateTo, m, .8f), marbleReset(m) } : new[] { marbleReset(m) }).Select(e => e.GetEnumerator()).ToArray(); var any = true; while (any) { yield return(null); any = false; for (int i = 0; i < coroutines.Length; i++) { any |= coroutines[i].MoveNext(); } } m._ignoreClicks = false; } }