반응형
게임에서 필수적인 요소 중 하나는 장애물, 몬스터, 아이템과 같은 도전/어려운 게임성 재미 요소입니다.
게임이 진행되는 동안 장애물과 아이템을 반복적으로 나타나도록 하는 레벨 디자인을 해보도록 하겠습니다.

- 게임 화면에 스프라이트의 빌딩 건물을 배치시키고 비율에 맞춰서 크기를 변경하였습니다.


- 스프라이트의 빌딩은 중심축이 이미지의 중간으로 되어 있는데, 중심을 이미지 하단의 중간으로 맞춰주었습니다.
- Sprite Mode를 Single 로 변경하면 Pivot 옵션이 새로 나타납니다.
- Pivot을 Bottom으로 변경합니다.

- 변경했음에도 축이 이미지의 중간으로 되어있는 경우가 있습니다.
- 좌측 상단의 Toggle Tool Handle Position 옵션이 Center 에서 Pivot으로 변경하면 해결 됩니다.

- 빌딩과 같은 움직이는 객체를 위한 Mover 스크립트와 화면에서 벗어나면 사라지는 Destroyer 스크립트를 생성하였습니다.
- 건물과 사람 사이의 겹치지 않도록 Z축도 알맞게 수정해줍니다.
using UnityEngine;
public class Mover : MonoBehaviour
{
[Header("Settings")]
public float moveSpeed = 1f;
void Start()
{
}
void Update()
{
transform.position += Vector3.left * moveSpeed * Time.deltaTime;
}
}
- 건물의 이동 스크립트 입니다.
void Update()
{
transform.position += Vector3.left * moveSpeed * Time.deltaTime;
}
- 건물의 위치를 Vector3.left를 사용하면 왼쪽 방향(X축)으로 설정한 moveSpeed 만큼 이동합니다.
- 객체의 이동을 이러한 방식으로 간단하게 사용할 수 있습니다.
using UnityEngine;
public class Destroyer : MonoBehaviour
{
void Start()
{
}
void Update()
{
if (transform.position.x < -15)
{
Destroy(gameObject);
}
}
}
- 건물이 움직이면서 일정 위치로 이동했을 때 사라지도록 하는 스크립트 입니다.
void Update()
{
if (transform.position.x < -15)
{
Destroy(gameObject);
}
}
- X의 좌표가 -15 미만이면 오브젝트를 삭제합니다.


- 스크립트가 적용된 객체를 이름과 이미지만 변경하여 재활용하고 싶기 때문에 Prefabs 폴더를 만들어서 Prefab으로 만들어주었습니다.
- Prefab은 하이어라키 창의 원하는 오브젝트를 폴더에 다시 드래그&드롭 해서 옮기면 만들어집니다.
- Prefab으로 만들면 자동으로 생성됬다가 사라지기를 반복해야 되기 때문에 화면에서 오브젝트는 삭제해줍니다.


- 프리팹으로 만든 빌딩이 나타나는 위치를 만들어줍니다.
- create Empty 빈 오브젝트를 Building Spawner 이름으로 생성합니다.
- 오브젝트를 생성되는 위치에 옮기고 Spawner 스크립트를 생성하여 적용합니다.
using UnityEngine;
public class Spawner : MonoBehaviour
{
[Header("References")]
public GameObject[] gameObjects;
void Start()
{
}
void Update()
{
}
- 스크립트는 프리팹으로 만든 여러개의 오브젝트를 저장할 수 있도록 합니다.


- 인스펙터 창에서 적용된 스크립트를 확인하여 오브젝트의 개수 만큼 칸을 추가합니다.
- 프리팹을 스크립트 각 칸에 할당합니다.
- 프리팹의 위치값은 0으로 변경합니다. 실제로 빌딩이 나타나는 위치는 Building Spawner 기준으로 생성됩니다.
using UnityEngine;
public class Spawner : MonoBehaviour
{
[Header("Settings")]
public float minSpawnDelay;
public float maxSpawnDelay;
[Header("References")]
public GameObject[] gameObjects;
void Start()
{
Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
}
void Spawn()
{
GameObject randomObject = gameObjects[Random.Range(0, gameObjects.Length)];
Instantiate(randomObject, transform.position, Quaternion.identity);
Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
}
}
- Spawner 스크립트를 수정합니다.
[Header("Settings")]
public float minSpawnDelay;
public float maxSpawnDelay;
- 건물의 생성 속도를 설정할 수 있습니다.
void Spawn()
{
GameObject randomObject = gameObjects[Random.Range(0, gameObjects.Length)];
Instantiate(randomObject, transform.position, Quaternion.identity);
Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
}
- 설정된 프리팹 오브젝트를 랜덤으로 선택하여 해당 위치에 설정된 최소시간(min) ~ 최대시간(max) 사이의 값을 랜덤으로 하여 생성합니다.
- 이후, Invoke를 통해 자신의 클래스를 불러 생성을 반복할 수 있습니다.
void Start()
{
Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
}
- 처음 실행될 때 클래스를 한번 호출합니다.

- Inspector 에서 최소시간과 최대시간을 설정합니다.

반응형
'Unity Project > Unity6 Challenge (김치-런)' 카테고리의 다른 글
| [Unity 6 Challenge] 게임 매니저(Game Manager) (1) | 2024.12.26 |
|---|---|
| [Unity 6 Challenge] 적 장애물 과 아이템 (0) | 2024.12.20 |
| [Unity 6 Challenge] 캐릭터 플레이어 애니메이션 (0) | 2024.12.18 |
| [Unity 6 Challenge] 캐릭터 플레이어(Player) Jump. (2) | 2024.12.18 |
| [Unity 6 Challenge] 무한 스크롤링 (2) | 2024.12.17 |