NoteControl.cs 3.9 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using System.Threading;

public class NoteControl : MonoBehaviour
{
    public AudioSource audioSource;
    public TextAsset data;
    private int waitting_time;
    public float additional_time;

    //다음화면까지 저장되어야하는 정보들.. 따로 파일 만들어야 할수 있음. 아니면 아예 최근플레이로 만들거나. 
    public int score;
    public int max_combo;
    public int current_combo;
    public int[] PGBM_count = new int[4] { 0,0,0,0};


    // 노트가 나올 채널과 시간이 담겨있는 리스트
    private int[,] single_notelist = new int[10000, 2]; //[[채널],[시간]]
    private int[,] double_notelist = new int[10000, 3]; //[[채널],[채널],[시간]]
    private int[,] long_notelist = new int[10000, 3]; //[[채널][시간][시간]]
    private int[,] slide_notelist = new int[10000, 2]; //[[채널],[시간]]

    //각자 나올 노트의 갯수 , 현재 나온 노트의 갯수
    private int[] notelist_count = new int[4] { 0, 0, 0, 0 };
    private int[] real_count = new int[4] { 0, 0, 0, 0 };

    //총 할당가능한 노트의 갯수, 할당한 노트의 갯수
    private int limit_note = 20;
    private int alloc_count = 0;
    public GameObject[] allocate_notelist = new GameObject[20]; //limit_note

    void Start()
    {
        //쓸 노트들 할당
        for (int i = 0; i < limit_note; i++){
            allocate_notelist[i] = GameObject.Find("Note_" + i);
            //Debug.Log("Allocated note list : " + allocate_notelist[i].name);
        }

        //오디오랑 노트데이터 할당, 춤도 할당해줘야함.
        audioSource = GetComponent<AudioSource>();
        data = Resources.Load("Blueming3", typeof(TextAsset)) as TextAsset;

        //파일 읽기
        ReadNote();
        StartCoroutine(CreateNote());
        
    }


    void ReadNote()
    {
        //노드정보있는파일 읽기
        StringReader sr = new StringReader(data.text);

        string line;
        string noteclass;
        line = sr.ReadLine();
        while (line != null)
        {
            noteclass = line.Split(' ')[0];

            // single note
            if (noteclass == "0")
            {
                single_notelist[notelist_count[0], 0] = Convert.ToInt32(line.Split(' ')[1]);
                single_notelist[notelist_count[0], 1] = Convert.ToInt32(line.Split(' ')[2]);
                notelist_count[0] += 1;
                Debug.Log(line);
            }

            line = sr.ReadLine();
        }
    }

    public void musicStart()
    {
        audioSource.Play(); //오디오 재생
    }
    IEnumerator CreateNote()
    {
        //ReadNode에 적용된 시간마다 해당위치의 노드들 복사. //그때그떄 복사하는게 나을지 미리 다 만들어놓고 하나씩 내려보내는게 나을지? 
        Invoke("musicStart", 1.8f); //대충 2초라고 했지만 정확히 해야함. 

        float delaytime = 0;
        //싱글노트
        while (real_count[0] < notelist_count[0])
        {

            delaytime = single_notelist[real_count[0], 1];
            yield return new WaitForSeconds(delaytime*0.001f); //delaytime만큼 대기
            //(delay시간 = nextnote떨어질시간 - prevnote 떨어질시간)... 그렇게 메모장에 있다고 생각.

            //할당할 노트에 채널할당, 활성화.
            allocate_notelist[alloc_count].GetComponent<OneNote>().channel = single_notelist[real_count[0], 0];
            allocate_notelist[alloc_count].GetComponent<OneNote>().isActive = true;

            //instantious 와 destroy는 리소스 많이잡아먹으니까 20개 계속 번갈아 쓰도록
            alloc_count++;
            if (alloc_count >= limit_note) { alloc_count = 0; }

            //single note에서 실제로 나온 노트수 up
            real_count[0]++;

        }

    }
}