유니티/유니런(2D 러닝 게임)

유니런(6) - 발판 반복 생성과 게임 완성

무직백수취업준비생 2021. 8. 28. 18:15
728x90
반응형

Platform 프리팹을 배치하고 Sorting Layer을 조정합니다.

 

하이어라키창의 Platform 게임 오브젝트에 Platform 스크립트를 추가하고

 

플레이어가 Platform을 밟으면 점수가 증가하도록 스크립트를 수정합니다.

 

using UnityEngine;

// 발판으로서 필요한 동작을 담은 스크립트
public class Platform : MonoBehaviour {
    public GameObject[] obstacles; // 장애물 오브젝트들
    private bool stepped = false; // 플레이어 캐릭터가 밟았었는가

    // 컴포넌트가 활성화될때 마다 매번 실행되는 메서드
    private void OnEnable() {
        //밟힘 상태를 리셋
        stepped = false;

        //장애물의 수만큼 루프
        for (int i = 0; i < obstacles.Length; i++)
        {
            //현재 순번의 장애물을 1/3의 확률로 활성화
            if(Random.Range(0, 3) == 0)
            {
                obstacles[i].SetActive(true);
            }
            else
            {
                obstacles[i].SetActive(false);
            }
        }
    }

    void OnCollisionEnter2D(Collision2D collision) {
        //충돌한 상대방의 태그가 Player이고 이전에 플레이어 캐릭터가 밟지 않았다면
        if (collision.collider.tag == "Player" &&!stepped)
        {
            //점수를 추가하고 밟힘 상태를 참으로 변경
            stepped = true;
            GameManager.instance.AddScore(1);
        }
    }
}

 

Platform 오브젝트의 Obstacles 필드를 열어 Size를 3으로 변경하고 자식 오브젝트 세 개를 할당합니다.

 

 

플레이해보면 바닥을 밟을때 점수가 오르고 장애물의 개수가 0에서 3개 랜덤으로 생성되는 걸 확인할 수 있습니다.

 

하이어라키의 Platform 게임 오브젝트 변경내용을 프리팹에 적용시킨 후 하이어라키에서 삭제합니다.

 

이제 게임을 지속시키기위해 발판을 지속적으로 생성시키겠습니다.

 

메모리 사용량을 줄이기 위해 오브젝트 풀링 방식으로 생성시키겠습니다.

 

발판 생성기를 하이어라키에 추가하고 스크립트를 작성합니다.

 

using UnityEngine;

// 발판을 생성하고 주기적으로 재배치하는 스크립트
public class PlatformSpawner : MonoBehaviour {
    public GameObject platformPrefab; // 생성할 발판의 원본 프리팹
    public int count = 3; // 생성할 발판의 개수

    public float timeBetSpawnMin = 1.25f; // 다음 배치까지의 시간 간격 최솟값
    public float timeBetSpawnMax = 2.25f; // 다음 배치까지의 시간 간격 최댓값
    private float timeBetSpawn; // 다음 배치까지의 시간 간격

    public float yMin = -3.5f; // 배치할 위치의 최소 y값
    public float yMax = 1.5f; // 배치할 위치의 최대 y값
    private float xPos = 20f; // 배치할 위치의 x 값

    private GameObject[] platforms; // 미리 생성한 발판들
    private int currentIndex = 0; // 사용할 현재 순번의 발판

    private Vector2 poolPosition = new Vector2(0, -25); // 초반에 생성된 발판들을 화면 밖에 숨겨둘 위치
    private float lastSpawnTime; // 마지막 배치 시점


    void Start() {
        //count만큼의 공간을 가지는 새로운 발판 배열 생성
        platforms = new GameObject[count];

        //count만큼 루프하면서 발판 생성
        for (int i = 0; i < count; i++)
        {
            //platformPrefab을 원본으로 새 발판을 poolPosition 위치에 복제 생성
            //생성된 발판을 platform 배열에 할당
            platforms[i] = Instantiate(platformPrefab, poolPosition, Quaternion.identity);
        }

        //마지막 배치 시점 초기화
        lastSpawnTime = 0f;
        //다음번 배치까지의 시간 간격을 0으로 초기화
        timeBetSpawn = 0f;
    }

    void Update() {
        // 게임오버 상태에서는 동작하지 않음
        if(GameManager.instance.isGameover)
        {
            return;
        }

        //마지막 배치 시점에서 timeBetSpawn이상 시간이 흘렀다면
        if(Time.time >= lastSpawnTime + timeBetSpawn)
        {
            //기록된 마지막 배치 시점을 현재 시점으로 갱신
            lastSpawnTime = Time.time;

            //다음 배치까지의 시간 간격을 timeBetSpawnMin, timeBetSpawnMax 사이에서 랜덤 설정
            timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax);

            //배치할 위치의 높이를 yMin과 yMax 사잉에서 랜덤 결정
            float yPos = Random.Range(yMin, yMax);

            //사용할 현재 순번의 발판 게임 오브젝트를 비활성화하고 즉시 다시 활성화
            //이때 발판의 Platform 컴포넌트의 OnEnable 메서드가 실행됨
            platforms[currentIndex].SetActive(false);
            platforms[currentIndex].SetActive(true);

            //현재 순번의 발판을 오른쪽에 재배치
            platforms[currentIndex].transform.position = new Vector2(xPos, yPos);
            //순번 넘기기
            currentIndex++;

            //마지막 순번에 도달했다면 순번을 리셋
            if(currentIndex >= count)
            {
                currentIndex = 0;
            }
        }
    }
}

 

 

3개의 발판이 계속해서 루프되며 정상적으로 플레이됨을 볼 수 있습니다.

 

 

배경음악까지 추가해줍니다.

 

 

pc에서 빌드해봅니다.

 

이것으로 2D 러닝 게임 유니런 제작이 끝났습니다.

728x90
반응형

'유니티 > 유니런(2D 러닝 게임)' 카테고리의 다른 글

유니런 체력 표시하기  (0) 2021.09.02
유니런(7) - 씬 전환  (0) 2021.09.01
유니런(5) - 게임 매니저  (1) 2021.08.09
유니런(4) - UI  (0) 2021.08.08
유니런(3) - 배경 스크롤링  (0) 2021.08.08