유니티 리듬게임 관련 스크립트
작성자 정보
- 마스터 작성
- 작성일
컨텐츠 정보
- 313 조회
- 목록
본문
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");
}
}
관련자료
-
이전
-
다음