[Unity] 2D 엔드리스 러너 게임 만들기 (3) - 게임 시작, 게임 오버

Kim Yuhyeon·2023년 4월 17일
0

게임개발

목록 보기
70/135
post-custom-banner

참고

초간단 유니티로 엔드리스 러너 만들기!

게임 시작

  • Player에 Capsule Collider 2d 컴포넌트 추가

GameManager.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    #region instance
    public static GameManager instance;
    private void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }

        instance = this;
    }
    #endregion

    public float gameSpeed = 1;

}

GroundScroller 이랑 MobBase 의 speed를
GameManager.instance.gameSpeed 로 통일

플레이 버튼

GameManager.cs

    public void PlayBtn()
    {
        playBtn.SetActive(false);
        isPlay = true;
    }

GroundScroller, PlayerController, MobBase에 조건문 넣기(isPlay가 참일때)

GameManager.cs

  public delegate void OnPlay();
  public OnPlay onPlay;

RespawnManager.cs

 private void Start()
 {
      GameManager.instance.onPlay += PlayGame;
 }
   
void PlayGame()
 {
     StartCoroutine(CreateMob());
 }

 IEnumerator CreateMob()
{
    while (GameManager.instance.isPlay)
   {
       MobPool[DeactiveMob()].SetActive(true);
       yield return new WaitForSeconds(Random.Range(1f, 3f));
   }
}
   

delegate, Invoke

버튼 OnClick 에 함수 연결

게임 오버

GameManager.cs

 public delegate void OnPlay(bool isPlay);

delegate bool 인자 넣어주기

    public void PlayBtnClick()
   {
       playBtn.SetActive(false);
       isPlay = true;
       onPlay.Invoke(isPlay);
   }

   public void GameOver()
   {
       playBtn.SetActive(true);
       isPlay = false;
       onPlay.Invoke(isPlay);
   }    

RespawnManager.cs

    void PlayGame(bool isPlay)
    {
        if (isPlay)
            StartCoroutine(CreateMob());
        else 
            StopAllCoroutines();
    }

isPlay 인자 추가

PlayerController.cs

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Mob"))
        {
            GameManager.instance.GameOver();
        }
    }

Mob

IsTrigger 체크

Player

Rigidbody 2D 추가
Body Type : Kinematic

RespawnManager.cs

    void PlayGame(bool isPlay)
    {
        if (isPlay)
        {
            // 시작 전 장애물 비활성화

            for (int i = 0; i < MobPool.Count; i++)
            {
                if (MobPool[i].activeSelf)
                    MobPool[i].SetActive(false);
            }
            StartCoroutine(CreateMob());
        }
        else 
            StopAllCoroutines();
    }

    IEnumerator CreateMob()
    {
        yield return new WaitForSeconds(0.5f);
        while (GameManager.instance.isPlay)
        {
            MobPool[DeactiveMob()].SetActive(true);
            yield return new WaitForSeconds(Random.Range(1f, 3f));
        }
    }
     

플레이 버튼 누르면 화면에 나와있는 몹 비활성화

결과

post-custom-banner

0개의 댓글