Unity Chapter 11-19. 좀비 TPS 게임 만들기 : Item Spawner

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 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)


🔔 컴포넌트 설정

  • 배열에 프리팹들을 넣어주고 playerTransformPlayer Character를 할당해주자.
    • image
  • 게임을 실행하면 플레이어 주위에 랜덤하게 아이템이 생성되는 것을 볼 수 있다.
    • 아직 아이템을 먹는 처리는 구현되어 있지 않다. 다음 포스트인 📜Player Controller.cs 에서 아이템을 먹는 것에 대한 처리를 할 것!
    • image


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기