Unity Chapter 11-19. 좀비 TPS 게임 만들기 : Item Spawner
카테고리: Unity Lesson 1
태그: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 11. 좀비 TPS 게임 만들기
📜ItemSpawner.cs
빈 게임 오브젝트
Item Spawner
를 만들고 여기에 스크립트를 붙여주자.
🟦AmmoPack, 🟦Coin, 🟦HelathPack
IItem
타입의 프리팹들을 실행시 오브젝트로서 스폰하는 역할
- 플레이어 근처의
Nav Mesh
위에 랜덤한 위치를 찍어서 그 위치에 아이템을 랜덤하게 스폰한다.Nav Mesh
가 사용되서using UnityEngine.AI;
using UnityEngine;
using UnityEngine.AI;
// 내비메쉬 관련 코드
// 주기적으로 아이템을 플레이어 근처에 생성하는 스크립트
public class ItemSpawner : MonoBehaviour
{
public GameObject[] items; // 생성할 아이템들
public Transform playerTransform; // 플레이어의 트랜스폼
private float lastSpawnTime; // 마지막 생성 시점
public float maxDistance = 5f; // 플레이어 위치로부터 아이템이 배치될 최대 반경
private float timeBetSpawn; // 생성 간격
public float timeBetSpawnMax = 7f; // 최대 시간 간격
public float timeBetSpawnMin = 2f; // 최소 시간 간격
private void Start()
{
// 생성 간격과 마지막 생성 시점 초기화
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax);
lastSpawnTime = 0;
}
// 주기적으로 아이템 생성 처리 실행
private void Update()
{
if (Time.time >= lastSpawnTime + timeBetSpawn && playerTransform != null)
{
lastSpawnTime = Time.time; // 마지막 생성 시간 갱신
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax); // 생성 주기를 랜덤으로 변경
Spawn(); // 실제 아이템 생성
}
}
// 실제 아이템 생성 처리
private void Spawn()
{
// 플레이어 근처의 네브 메쉬위의 랜덤 위치를 가져옵니다.
var spawnPosition = Utility.GetRandomPointOnNavMesh(playerTransform.position, maxDistance, NavMesh.AllAreas);
spawnPosition += Vector3.up * 0.5f; // 바닥에서 0.5만큼 위로 올립니다.
// 아이템 중 하나를 무작위로 골라 랜덤 위치에 생성합니다.
var item = Instantiate(items[Random.Range(0, items.Length)], spawnPosition, Quaternion.identity);
// 생성된 아이템을 5초 뒤에 파괴
Destroy(item, 5f);
}
}
멤버 변수
public GameObject[] items; // 생성할 아이템들
public Transform playerTransform; // 플레이어의 트랜스폼
private float lastSpawnTime; // 마지막 생성 시점
public float maxDistance = 5f; // 플레이어 위치로부터 아이템이 배치될 최대 반경
private float timeBetSpawn; // 생성 간격
public float timeBetSpawnMax = 7f; // 최대 시간 간격
public float timeBetSpawnMin = 2f; // 최소 시간 간격
items
배열- 게임 도중 실시간으로 생성할 아이템 프리팹 원형🟦 들을 넣어두는 배열
- 유니티 에디터에서 3 개의 프리팹을 이 배열에 넣어둘 것이다.
playerTransform
- 아이템을 생성할 반경의 중심점으로
Player Character
의 트랜스폼이 할당될 것이다. - 플레이어 주변 랜덤한 위치에서 아이템을 랜덤하게 생성하게 할 것이라서.
- 아이템을 생성할 반경의 중심점으로
lastSpawnTime
- 가장 마지막에 아이템을 생성한 시간
maxDistance
- 플레이어 위치로부터 아이템이 배치될 최대 반경
timeBetSpawn
- 현재 아이템 생성 시간으로부터 다음 아이템 생성 시간까지의 간격. 대기 시간.
- 최소
timeBetSpawnMin
, 최대timeBetSpawnMax
범위를 결정한 후 이 범위 내에서 랜덤하게 결정될 것이다.
timeBetSpawnMax
- 최대 시간 간격
timeBetSpawnMin
- 최소 시간 간격
멤버 함수
private void Start()
생성 간격과 마지막 생성 시점 초기화
private void Start()
{
// 생성 간격과 마지막 생성 시점 초기화
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax);
lastSpawnTime = 0;
}
timeBetSpawn
- 아이템 생성 대기 시간 결정.
- 현재 아이템 생성 시간으로부터 다음 아이템 생성 시간까지의 간격은 최소
timeBetSpawnMin
, 최대timeBetSpawnMax
이 범위 내에서 랜덤하게 결정된다. - 게임 시작시 결정됨
- 현재 아이템 생성 시간으로부터 다음 아이템 생성 시간까지의 간격은 최소
- 아이템 생성 대기 시간 결정.
lastSpawnTime
- 가장 마지막에 아이템을 생성한 시간을 게임 시작시 0 으로 초기화
private void Update()
주기적으로 아이템 생성 처리 실행
- 매 프레임마다 아이템이 생성될 조건이 되었는지를 검사해야 함.
private void Update()
{
if (Time.time >= lastSpawnTime + timeBetSpawn && playerTransform != null)
{
lastSpawnTime = Time.time; // 마지막 생성 시간 갱신
timeBetSpawn = Random.Range(timeBetSpawnMin, timeBetSpawnMax); // 생성 주기를 랜덤으로 변경
Spawn(); // 실제 아이템 생성
}
}
- 현재 시간 (
Time.time
)이 마지막으로 아이템이 생성된 시간(lastSpawnTime
)으로부터 생성 대기 시간 간격(timeBetSpawn
)을 넘었고 and 플레이어가 존재 한다면 👉 아이템을 생성해야 함- 마지막 생성 시간을 현재 시간으로 갱신 lastSpawnTime = Time.time
- 생성 주기 다시 랜덤하게 갱신
- 실제 아이템을 생성하는 처리를 담당하는 함수인 Spawn() 실행
private void Spawn()
실제로 아이템 생성 처리를 담당
private void Spawn()
{
// 플레이어 근처의 네브 메쉬위의 랜덤 위치를 가져옵니다.
var spawnPosition = Utility.GetRandomPointOnNavMesh(playerTransform.position, maxDistance, NavMesh.AllAreas);
spawnPosition += Vector3.up * 0.5f; // 바닥에서 0.5만큼 위로 올립니다.
// 아이템 중 하나를 무작위로 골라 랜덤 위치에 생성합니다.
var item = Instantiate(items[Random.Range(0, items.Length)], spawnPosition, Quaternion.identity);
// 생성된 아이템을 5초 뒤에 파괴
Destroy(item, 5f);
}
플레이어의 근처
NavMesh
의 랜덤한 위치에서, 3 종류의 아이템 중 랜덤한 아이템을 생성.
spawnPosition
결정 👉 플레이어 근처의NavMesh
위의 랜덤 위치를 가져오기.- 📜Utility.cs의 GetRandomPointOnNavMesh 함수 사용
- 바닥에서 0.5만큼 위에 생성되게끔 해주기
item
결정 👉 생성할 아이템spawnPosition
위치에 아무 회전도 하지 않은 상태로items
배열의 랜덤한 아이템 프리팹을 게임 도중 실시간으로 오브젝트로서 생성한다.- 그리고 이를
item
에 리턴
- 그리고 이를
- 먹지 않은 아이템들이 Snene에 계속해서 무한히 쌓이면 안된다. 따라서 생성한 아이템을 5초 뒤에 파괴되도록 한다.
- Destroy(item, 5f)
🔔 컴포넌트 설정
- 배열에 프리팹들을 넣어주고
playerTransform
에Player Character
를 할당해주자. - 게임을 실행하면 플레이어 주위에 랜덤하게 아이템이 생성되는 것을 볼 수 있다.
- 아직 아이템을 먹는 처리는 구현되어 있지 않다. 다음 포스트인 📜Player Controller.cs 에서 아이템을 먹는 것에 대한 처리를 할 것!
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기