Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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;
            }
        }