Unity Chapter 6-4. 어메이징 볼링 게임 만들기 : 랜덤 오브젝트 생성기
카테고리: Unity Lesson 1
태그: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 6. 어메이징 볼링 게임 만들기
🔔 랜덤 오브젝트 생성기 : Spawn Generator
한 라운드를 시작할 때 마다 Small Prop
, Big Prop
어떤 범위 내에서 수 많은 프롭들을 생성 하고, 랜덤하게 배치해주는 역할을 한다.
SpawnGenerator 오브젝트
- 빈 오브젝트
SpawnGenerator
오브젝트를 만든다. - 위치를 reset 하여 0, 15, 0 으로 해준다.
- Box Collider 컴포넌트를 붙여준다.
- 프롭들을 생성하고 배치 할 스폰 범위를 지정해주기 위해.
- 우리가 아는 그 물리적인 표면 처리를 하려고 붙이는게 아니라 단순히 그냥 범위를 시각적으로 범위를 확인하기 위해 붙인 것.
- Box Collider의 크기scale를 50, 2, 50 으로 해주어 늘려준다.
- Is Trigger에 체크해서 물리적인 표면을 없애 준다.
-
Prop
들을 밀어내지 않도록. -Ball
이 뚫고 지나갈 수 있도록. - 📜SpawnGenerator.cs 스크립트를 만들어 붙여준다.
📜SpawnGenerator.cs
- 다음 라운드 때마다 수 많은 프롭들을 또 생성하고 또 삭제하는 것을 반복하는건 낭비다. 따라서 다음과 같이 동작한다.
- 게임 시작할 때 1번만
- 👉 프롭들 생성
- 생성시 프롭들을
리스트
에 넣음 - 보관해놨다가 재사용하기 위하여!
- 생성시 프롭들을
- 👉 프롭들 생성
Ball
이 떨어지는 곳에 있어서 파괴된 프롭들- 👉 사실 프롭 없애주는게 아니라 꺼주는 것
- 그 이후부턴 다음 라운드 때 마다
- 👉 꺼져 있는 프롭들은 켜주고
- 👉 기존 프롭들을 랜덤하게 재배치함
리스트
에 들은 프롭들 원소들의 위치를 랜덤하게 바꿔 줌
- 마치 새로 또 생성된 것 같은 효과를 준다.
- 게임 시작할 때 1번만
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 컴포넌트 연결.
- 프롭들 생성할 때 범위지정
- 프롭들의 랜덤한 위치를 생성할 때 범위(size) 정보 제공
- 붙여주었던 BoxCollider 컴포넌트 연결.
- 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를 꺼준다.
- area = GetComponent
- void Spawn()
- 1개의 프롭 오브젝트를 랜덤한 위치에 새로 생성하고 리스트에 추가해주는 역할
- 랜덤한 위치
- Vector3 spawnPos =
GetRandomPosition();
GetRandomPosition();
함수 리턴 값으로 spawnPos 초기화 2. 프롭 생성- 프롭의 여러 종류의 프리팹을 담은 propPrefabs 배열에서 하나를 랜덤으로 받아오기
- 우리는 “Big Prop”, “Small Prop” 이렇게 두개 이므로 selection은 0 혹은 1 으로 랜덤하게 초기화 된다.
- selectedPrefab 에 프롭으로 생성할 프리팹이 들어온다. 2. Instantiate으로 프롭 1개 생성하기
- slsectedPrefab : 프롭의 여러 프리팹 종류 중 랜덤하게 선택된 프리팹을 찍어냄
- spawnPos :
GetRandomPosition()
의 결과인 랜덤한 위치 - Quaternion.identity : 회전값은 전부 0, 회전값은 Vector3 말고 쿼터니언을 사용한다는 것 잊지말기
- instance에 대입한 이유 👉 프롭 오브젝트 리스트에 넣어주어야 하니까 3. 프롭 리스트에 방금 생성한 프롭 오브젝트를 추가해주기
- props.Add(instance);
- 1개의 프롭 오브젝트를 랜덤한 위치에 새로 생성하고 리스트에 추가해주는 역할
- private Vector3 GetRandomPosition()
void Spawn()
에게 랜덤한 Vector3 위치를 리턴해 줌void Reset()
에서 다음 라운드 때를 위하여 프롭 위치들 랜덤하게 재지정 할 때 사용된다.- basePosition :
Spawn Generator
오브젝트의 위치 벡터 - size : 스폰 범위의 3차원 크기 벡터
- 각각 float인 x, y, z를 랜덤하게 구한 후 합쳐서 Vector3 spawnPos로 리턴한다.
- 👉 (목적지 위치) = (기준 위치) + (랜덤한 이동할 양)
- 👉 (목적지 위치) = (기준 위치) + (랜덤한 이동할 양)
- public void Reset()
- 크기를 불러올 때 List는 Count를 쓰고 배열은 Length를 쓴다.
- 다음 라운드시 리스트의 프롭 원소들 처리
- 위치를 랜덤하게 바꾼다. props[i].transform.position = GetRandomPosition();
Ball
맞고 파괴되어 꺼진 친구들은 다시 켜준다. rops[i].SetActive(true);
- 외부에서(public) 호출할 것이다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기