Unity Chapter 6-4. 어메이징 볼링 게임 만들기 : 랜덤 오브젝트 생성기

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 6. 어메이징 볼링 게임 만들기


🔔 랜덤 오브젝트 생성기 : Spawn Generator

한 라운드를 시작할 때 마다 Small Prop, Big Prop 어떤 범위 내에서 수 많은 프롭들을 생성 하고, 랜덤하게 배치해주는 역할을 한다.

SpawnGenerator 오브젝트

  1. 빈 오브젝트 SpawnGenerator 오브젝트를 만든다.
  2. 위치를 reset 하여 0, 15, 0 으로 해준다.
  3. Box Collider 컴포넌트를 붙여준다.
    • 프롭들을 생성하고 배치 할 스폰 범위를 지정해주기 위해.
    • 우리가 아는 그 물리적인 표면 처리를 하려고 붙이는게 아니라 단순히 그냥 범위를 시각적으로 범위를 확인하기 위해 붙인 것.
  4. Box Collider의 크기scale를 50, 2, 50 으로 해주어 늘려준다.
  5. Is Trigger에 체크해서 물리적인 표면을 없애 준다. - Prop들을 밀어내지 않도록. - Ball이 뚫고 지나갈 수 있도록.
  6. 📜SpawnGenerator.cs 스크립트를 만들어 붙여준다.

📜SpawnGenerator.cs

  • 다음 라운드 때마다 수 많은 프롭들을 또 생성하고 또 삭제하는 것을 반복하는건 낭비다. 따라서 다음과 같이 동작한다.
    • 게임 시작할 때 1번만
      • 👉 프롭들 생성
        • 생성시 프롭들을 리스트에 넣음
        • 보관해놨다가 재사용하기 위하여!
    • Ball 이 떨어지는 곳에 있어서 파괴된 프롭들
      • 👉 사실 프롭 없애주는게 아니라 꺼주는 것
    • 그 이후부턴 다음 라운드 때 마다
      • 👉 꺼져 있는 프롭들은 켜주고
      • 👉 기존 프롭들을 랜덤하게 재배치
        • 리스트에 들은 프롭들 원소들의 위치를 랜덤하게 바꿔 줌
      • 마치 새로 또 생성된 것 같은 효과를 준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnGenerator : MonoBehaviour
{
    public GameObject[] propPrefabs;
    private BoxCollider area;
    public int count = 100;
    private List<GameObject> props = new List<GameObject>();

    void Start()
    {
        area = GetComponent<BoxCollider>();

        for (int i = 0; i < count; i++)
        {
            Spawn();
        }

        area.enabled = false;
    }

    void Spawn()
    {
        int selection = Random.Range(0, propPrefabs.Length);

        GameObject selectedPrefab = propPrefabs[selection];

        Vector3 spawnPos = GetRandomPosition();

        GameObject instance = Instantiate(selectedPrefab, spawnPos, Quaternion.identity);

        props.Add(instance);
    }

    private Vector3 GetRandomPosition()
    {
        Vector3 basePosition = transform.position;
        Vector3 size = area.size;

        float posX = basePosition.x + Random.Range(-size.x / 2f, size.x / 2f);
        float posY = basePosition.y + Random.Range(-size.y / 2f, size.y / 2f);
        float posZ = basePosition.z + Random.Range(-size.z / 2f, size.z / 2f);

        Vector3 spawnPos = new Vector3(posX, posY, posZ);

        return spawnPos;
    }

    public void Reset() 
    {
        for (int i = 0; i < props.Count; i++) 
        {
            props[i].transform.position = GetRandomPosition();
            props[i].SetActive(true); 
        }
    }
}

🚍 변수

  • public GameObject[] propPrefabs;
    • GameObject 배열
    • “Big Prop” 프리팹과 “Small Prop” 프리팹을 슬롯에 드래그 앤 드롭으로 넣어 줄 것이다.
    • 슬롯에서 ✨✨이 배열의 size를 2라고 지정한다. ✨✨
      • ✨✨원소는 "Big Prop" 프리팹과 "Small Prop" 프리팹 이렇게 2개를 드래그 앤 드롭으로 넣어준다.✨✨
  • private BoxCollider area
    • 붙여주었던 BoxCollider 컴포넌트 연결.
      1. 프롭들 생성할 때 범위지정
      2. 프롭들의 랜덤한 위치를 생성할 때 범위(size) 정보 제공
  • public int count = 100;
    • 생성할 프롭의 개수
  • private List<GameObject> props
    • 생성한 프롭들을 넣고 관리할 리스트
      • 한번 생성한 프롭들을 다음 라운드 때마다 재활용 할 것이기 때문에 이렇게 저장할 자료구조가 필요한 것.

🚍 함수

  • void Start()
    • area = GetComponent();
      • area는 private이니까 GetComponent<BoxCollider>()로 붙어있는 Box Collider를 가져 옴
    • for문
      • Spawn()함수 호출
        • count = 100이라면 100번 호출하여 100개의 프롭을 만듬
    • area.enabled = false;
      • 이제 Box Collider의 역할은 끝났고 괜히 다른 것들과 Trigger로서 충돌 처리가 일어날 수도 있기 때문에 Box Collider를 꺼준다.
  • void Spawn()
    • 1개의 프롭 오브젝트를 랜덤한 위치새로 생성하고 리스트에 추가해주는 역할
      1. 랜덤한 위치
      • Vector3 spawnPos = GetRandomPosition();
      • GetRandomPosition();함수 리턴 값으로 spawnPos 초기화 2. 프롭 생성
        1. 프롭의 여러 종류의 프리팹을 담은 propPrefabs 배열에서 하나를 랜덤으로 받아오기
        • 우리는 “Big Prop”, “Small Prop” 이렇게 두개 이므로 selection은 0 혹은 1 으로 랜덤하게 초기화 된다.
        • selectedPrefab 에 프롭으로 생성할 프리팹이 들어온다. 2. Instantiate으로 프롭 1개 생성하기
        • slsectedPrefab : 프롭의 여러 프리팹 종류 중 랜덤하게 선택된 프리팹을 찍어냄
        • spawnPos : GetRandomPosition()의 결과인 랜덤한 위치
        • Quaternion.identity : 회전값은 전부 0, 회전값은 Vector3 말고 쿼터니언을 사용한다는 것 잊지말기
        • instance에 대입한 이유 👉 프롭 오브젝트 리스트에 넣어주어야 하니까 3. 프롭 리스트에 방금 생성한 프롭 오브젝트를 추가해주기
        • props.Add(instance);
  • private Vector3 GetRandomPosition()
    • void Spawn() 에게 랜덤한 Vector3 위치를 리턴해 줌
    • void Reset() 에서 다음 라운드 때를 위하여 프롭 위치들 랜덤하게 재지정 할 때 사용된다.
    • basePosition : Spawn Generator 오브젝트의 위치 벡터
    • size : 스폰 범위의 3차원 크기 벡터
    • 각각 float인 x, y, z를 랜덤하게 구한 후 합쳐서 Vector3 spawnPos로 리턴한다.
      • 👉 (목적지 위치) = (기준 위치) + (랜덤한 이동할 양)
        • image
  • public void Reset()
    • 크기를 불러올 때 List는 Count를 쓰고 배열은 Length를 쓴다.
    • 다음 라운드시 리스트의 프롭 원소들 처리
      1. 위치를 랜덤하게 바꾼다. props[i].transform.position = GetRandomPosition();
      2. Ball맞고 파괴되어 꺼진 친구들은 다시 켜준다. rops[i].SetActive(true);
    • 외부에서(public) 호출할 것이다.


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

맨 위로 이동하기

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

댓글 남기기