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 |