0. 전체 스크립트 구성
1 | UIManager | 화면 해상도 고정, 플레이어의 HP에 따라 UI 변경 |
2 | GameManager | 누적시간에 따라 난이도/배경화면 변경, 일시정지, 엔딩화면 문구 변경, 버튼관리 |
3 | Level 1~4 | 비 내리는 속도와 빈도, 비/아이템 비율 관리하여 난이도 조절 |
4 | Main | 메인 화면의 버튼 관리 |
5 | Help | 게임 설명 화면의 버튼 관리 |
6 | TimeLimit | 아이템 사용 시 사용 가능 시간 UI로 표시 |
7 | Part_Rotate | 파티클 생성 시 각도 랜덤 설정 |
8 | PlayerCollider | 캐릭터 충돌 체크, 충돌한 오브젝트의 정보를 Player 스크립트로 전달 |
9 | Player | 캐릭터 이동 (이미지 변경), 충돌한 오브젝트에 대한 반응 |
10 | Down | 비 내리는 방향 설정, 땅에 닿으면 사라지는 기능 |
1. 비(아이템) 랜덤 스폰
//비 생성
void MakeRain()
{
int rand = Random.Range(0, 15); //일반비:산성비:황사비 = 12:2:1
if (rand == 1)
Instantiate(Resources.Load("Prefabs/2D/YellowRain"), rainSpawns[Random.Range(0, 6)]);
else if (rand == 2 || rand == 3)
Instantiate(Resources.Load("Prefabs/2D/BlackRain"), rainSpawns[Random.Range(0, 6)]);
else
Instantiate(Resources.Load("Prefabs/2D/BlueRain"), rainSpawns[Random.Range(0, 6)]);
StartCoroutine("DelayRain");
}
//비 딜레이시간
IEnumerator DelayRain()
{
// 딜레이 시간 랜덤화
float delay = Random.Range(minDelay_R, maxDelay_R);
yield return new WaitForSeconds(delay);
MakeRain();
}
① Random.Range(float min, float max);
- 일반비 : 산성비 : 황사비의 비율을 미리 정해두고, 랜덤으로 생기도록 하였다.
- 비가 생길 위치를 랜덤으로 지정하였다.
- 다음 비가 내리기 전까지 랜덤한 딜레이 시간을 두었다
② Instantiate(Resources.Load("폴더명/오브젝트명"), Transform);
- Resources 폴더에 있는 비 오브젝트를 복제하여 원하는 위치에 생성하였다.
③ StartCorutine("함수명"); / IEnumerator() / yield return new WaitForSeconds(float);
- 비가 내린 후, 다음 비가 내리기 전까지의 딜레이를 두었다.
2. 플레이 시간
public Text count;
private float second, curTime, minute;
void Start()
{
// 처음 시간 저장
curTime = Time.time;
}
void Update()
{
// 초 저장
second = (int)(Time.time - curTime);
// 만약 초가 59보다 크다면
if (second > 59)
{
// 처음 시간에 지금 시간을 저장해서 second가 0이 되도록
curTime = Time.time;
second = 0;
// 분 증가시키기
minute++;
// 만약 분이 59보다 크다면
if (minute > 59)
{
// 다시 0으로
minute = 0;
}
}
// 초, 분 00 : 00 형태로 출력
count.text = string.Format(minute.ToString("00") + ":" + second.ToString("00"));
}
① Time.time;
- Time.deletaTime과 다르게 선언된 시점부터 시작되기 때문에 자유롭게 플레이 시간을 나타냈다.
- 초가 59초가 넘으면 1분으로 바꾸고 초는 다시 0부터 시작되도록 했다 (분도 동일)
① string.Format(float.ToString("00"));
- 초와 분이 출력 될 때, 가독성을 위해 '1:5'형식이 아닌 '01:05'형식으로 출력하였다.
3. 일시정지 + 카운트 후 게임 재개
//일시정지
public void OnClickPasue()
{
isPause = true;
// 일시정지 화면
pauseCanvas.SetActive(true);
}
public void Update()
{
if (isPause){
Time.timeScale = 0;
} else
Tiime. timeScale = 1;
}
}
① Time.timeScale;
- 시간이 흘러가는 속도를 나타내는 Time.timeScale 값을 0으로 바꿔 일시정지를 했다
//이어 하기
public void OnClickCountinue()
{
// 일시정지 화면 끄기
pause.SetActive(false);
// 카운트 다운
StartCoroutine(Countdown(1, 1, 1));
// 숫자 3
Instantiate(Resources.Load("Prefabs/2D/3"));
}
//3초 카운트
IEnumerator Countdown(int dur1, int dur2, int dur3)
{
while (dur1 > 0)
{
dur1--;
yield return WaitForUnscaledSeconds(1f);
}
// 숫자 2
Instantiate(Resources.Load("Prefabs/2D/2"));
while (dur2 > 0)
{
dur2--;
yield return WaitForUnscaledSeconds(1f);
}
// 숫자 1
Instantiate(Resources.Load("Prefabs/2D/1"));
while (dur3 > 0)
{
dur3--;
yield return WaitForUnscaledSeconds(1f);
// 시간 흐르도록
isPause = false;
}
}
IEnumerator WaitForUnscaledSeconds(float dur)
{
var cur = 0f;
while (cur < dur)
{
yield return null;
cur += Time.unscaledDeltaTime;
}
}
① Time.unscaledDeltaTime;
- 일시정지 상태이므로 일반적인 deltaTime 대신 영향을 받지 않는 unscaledDeltaTime을 사용하였다.
- 1초씩 지날 때마다 숫자 이미지를 띄워 게임 재개까지 몇 초 남았는지 알려주었다.
➕ 출시에 관한 내용은 다음 게시물로 이어집니다 :)
반응형
'내가 만든 게임 (Portfolio) > 머리를 지켜라 (모바일)' 카테고리의 다른 글
[2018] [머리를 지켜라] 출시 내역 (2) | 2020.03.11 |
---|---|
[2018] [머리를 지켜라] 게임 설명 (0) | 2020.03.11 |
[2018] [머리를 지켜라] 간단한 게임 소개 (0) | 2020.03.04 |