유니티

유니티 리듬게임 관련 스크립트

작성자 정보

  • 마스터 작성
  • 작성일

컨텐츠 정보

본문

1.노트 생성 스크립트 (노트 매니저)

ㄴ노트의 생성과 파괴 하는 관리자 역할

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class NoteManager : MonoBehaviour

{

    public int bpm = 0;

    double currentTime = 0;


    [SerializeField] Transform tfNoteAppear = null;

    [SerializeField] GameObject goNote = null;


    TimingManager timingManager;


    // Start is called before the first frame update

    void Start()

    {

        timingManager = GetComponent<TimingManager>();

    }


    // Update is called once per frame

    void Update()

    {

        currentTime += Time.deltaTime;


        if(currentTime >= 60d / bpm)

        {

            GameObject t_note = Instantiate(goNote, tfNoteAppear.position, Quaternion.identity);

            t_note.transform.SetParent(this.transform);

            timingManager.boxNoteList.Add(t_note);

            currentTime -= 60d / bpm;

        }

    }


    private void OnTriggerExit2D(Collider2D collision)

    {

        if (collision.CompareTag("note"))

        {

            timingManager.boxNoteList.Remove(collision.gameObject);

            Destroy(collision.gameObject);

        }

    }

}

 

 

2.노트 움직임 스크립트 (노트 자체에 연결하기 프리팹에 연결)

ㄴ노트를 아래로 내려가게 설정했음

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;


public class note : MonoBehaviour

{


    public float noteSpeed = 400;

    private Image noteImage;



    // Start is called before the first frame update

    void Start()

    {

        noteImage = GetComponent<Image>(); 

    }


    public void HideNote()

    {

        noteImage.enabled = false;

    }


    // Update is called once per frame

    void Update()

    {

        transform.localPosition += Vector3.down * noteSpeed * Time.deltaTime;

    }

}

 

3.플레이어 컨트롤 스크립트

ㄴ 스페이스바 누르면 타이밍체크 하게 하는 스크립트

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class PlayerController : MonoBehaviour

{

    TimingManager timingManager;


    private void Start()

    {

        timingManager = FindObjectOfType<TimingManager>();

    }


    // Update is called once per frame

    void Update()

    {

        if (Input.GetKeyDown(KeyCode.Space))

        {

            timingManager.CheckTiming();

        }

    }

}


 

4.센터 스크립트 (리듬게임에서 명중선)

ㄴ 노트가 센터에 도착하면 노래 시작하게 하기

using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class center : MonoBehaviour

{

    AudioSource auido;

    bool musicStart = false;


    // Start is called before the first frame update

    void Start()

    {

        auido = GetComponent<AudioSource>();

    }


    // Update is called once per frame

    void Update()

    {

        

    }


    private void OnTriggerEnter2D(Collider2D collision)

    {

        if (!musicStart)

        {

            if (collision.CompareTag("note"))

            {

                auido.Play();

                musicStart = true;

            }

        }

        

    }

}


 

5.타이밍매니저 (노트매니저에 같이 붙이면됨)

ㄴ 충돌 판정 오브젝트는 배열에 담아 최소값 최대값을 vector2 배열에 담아서 비교하는 스크립트

using System.Collections;

using System.Collections.Generic;

using UnityEditor.Experimental.GraphView;

using UnityEngine;


public class TimingManager : MonoBehaviour

{

    public List<GameObject> boxNoteList = new List<GameObject>();


    [SerializeField] Transform Center = null;

    [SerializeField] RectTransform[] timingRect = null;

    Vector2[] timingBoxs = null;


    void Start()

    {

        timingBoxs = new Vector2[timingRect.Length];

        for(int i = 0; i < timingRect.Length; i++)

        {

            //최소값이 x로 셋팅 최대값이 y로 셋팅

            timingBoxs[i].Set(Center.transform.position.y - timingRect[i].rect.height / 2,

                                Center.transform.position.y + timingRect[i].rect.height / 2);

        }

    }


    // Update is called once per frame

    public void CheckTiming()

    {

        for(int i = 0; i< boxNoteList.Count; i++)

        {

            //boxNoteList == 생성된 노드의 y의 좌표를 담아서

            float t_notePosY = boxNoteList[i].transform.position.y;

            

            for (int y=0; y<timingBoxs.Length; y++)

            {

                //timingBoxs[y].x 최대값

                //timingBoxs[y].y 최소값

                if (timingBoxs[y].y >= t_notePosY && timingBoxs[y].x <= t_notePosY)

                {

                    boxNoteList[i].GetComponent<note>().HideNote();

                    boxNoteList.RemoveAt(i);

                    switch (i)

                    {

                        case 0:

                            Debug.Log("Perfect");

                            break;

                        case 1:

                            Debug.Log("Cool");

                            break;

                        case 2:

                            Debug.Log("Good");

                            break;

                        case 3:

                            Debug.Log("Bad");

                            break;

                    }

                    return;

                }

            }

        }

        Debug.Log("miss");

    }

}

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


알림 0