예제 #1
0
 void KeyRemap()
 {
     keyCode      = GlobalSingleton.GetKey(id);
     keyText.text = GlobalSingleton.GetKeyName(id).ToString();
 }
예제 #2
0
    void Update()
    {
        if (GlobalSingleton.GetHealth() < 0)
        {
            return;
        }

        cooldown -= Time.deltaTime * GlobalSingleton.GetBPM() * 0.0166666666f;
        if (cooldown < 0)
        {
            GameObject go = Instantiate(notePrefab);
            go.transform.SetParent(transform);
            if (noteIndex % 3 == 0)
            {
                go.transform.localPosition = new Vector3(-60.0f, -100000, 0);
            }
            else if (noteIndex % 3 == 1)
            {
                go.transform.localPosition = new Vector3(0.0f, -100000, 0);
            }
            else
            {
                go.transform.localPosition = new Vector3(60.0f, -100000, 0);
            }
            go.transform.localScale = Vector3.one;
            NoteController nc = go.GetComponent <NoteController>();
            nc.hideNote      = (noteIndex - GlobalSingleton.GetHideThreshold() < 0);
            nc.id            = notes[noteIndex].id;
            nc.sustainLength = (notes[noteIndex].length - 1) / 2.0f;
            nc.lateDistance  = lateDistance;
            nc.lastNote      = noteIndex >= (notes.Count - 1);
            if (notes[noteIndex].rest / 2.0f > 0)
            {
                while (cooldown < 0)
                {
                    cooldown += notes[noteIndex].rest / 2.0f;
                }
            }
            else
            {
                cooldown = 0;
            }
            liveNotes.Add(nc);

            if (++noteIndex >= notes.Count)
            {
                cooldown -= notes[noteIndex - 1].rest / 2.0f;
                noteIndex = 0;
                if (notes.Count > 8)
                {
                    while (cooldown < 0)
                    {
                        cooldown += 4;
                    }
                }
                else
                {
                    while (cooldown < 0)
                    {
                        cooldown += 8;
                    }
                }
                notes.Add(GenerateNote(notes.Count));
            }
        }
        NoteController nearestNote         = null;
        float          nearestDist         = float.PositiveInfinity;
        NoteController nearestUnplayed     = null;
        float          nearestUnplayedDist = float.PositiveInfinity;
        NoteController nearestPositive     = null;
        float          nearestPositiveDist = float.PositiveInfinity;

        foreach (NoteController note in liveNotes)
        {
            float signedDist = note.GetDistance();
            float dist       = Mathf.Abs(signedDist);

            if (dist < nearestDist && dist < triggerRange)
            {
                nearestNote = note;
                nearestDist = dist;
            }

            if (dist < nearestUnplayedDist && !note.GetHit() && dist < triggerRange)
            {
                nearestUnplayed     = note;
                nearestUnplayedDist = dist;
            }

            if (signedDist >= 0 && signedDist < nearestPositiveDist && dist < triggerRange)
            {
                nearestPositive     = note;
                nearestPositiveDist = signedDist;
            }
        }

        bool hitNote  = false;
        int  pressKey = -1;

        for (int i = 0; i < 4; ++i)
        {
            if (Input.GetKeyDown(GlobalSingleton.GetKey(i)))
            {
                pressKey = i;
                if (nearestNote != null && nearestNote.id == i &&
                    (!nearestNote.GetHit() || nearestNote.GetCooldown() > 0) &&
                    nearestDist < okayDistance && nearestNote.GetDistance() > -lateDistance)
                {
                    hitNote = true;
                    nearestNote.HitNote(perfectDistance);
                }
                else if (nearestUnplayed != null && nearestUnplayed.id == i &&
                         nearestUnplayedDist < okayDistance && nearestUnplayed.GetDistance() > -lateDistance)
                {
                    hitNote = true;
                    nearestUnplayed.HitNote(perfectDistance);
                }
                else if (nearestPositive != null && nearestPositive.id == i &&
                         (!nearestPositive.GetHit() || nearestPositive.GetCooldown() > 0) &&
                         nearestPositiveDist < okayDistance && nearestPositiveDist > -lateDistance)
                {
                    hitNote = true;
                    nearestPositive.HitNote(perfectDistance);
                }
            }
        }
        if (pressKey >= 0 && !hitNote)
        {
            NoteController missed = null;
            if (nearestPositive != null && nearestPositive.id == pressKey)
            {
                missed = nearestPositive;
            }
            else if (nearestNote != null)
            {
                missed = nearestNote;
            }
            else if (nearestUnplayed != null)
            {
                missed = nearestUnplayed;
            }
            else if (nearestPositive != null)
            {
                missed = nearestPositive;
            }
            if (missed != null)
            {
                missed.MissNote(okayDistance);
                GlobalSingleton.GetShake().StartShake(1.0f, 0.1f);
                GlobalSingleton.GetSound().SourNote(pressKey);
            }
        }
    }