만들어야 할 것: 라운드가 시작될 때 마다 프롭이 정해진 범위 내에서 랜덤하게 정해진 갯수만큼 찍어나오는 것
1. 빈 게임 오브젝트로 SpawnGenerator 만들기
2. 범위를 지정하기 위해서 Box Collider 사용
여기서 Box Collider의 역할은 충돌체로써의 역할이 아니라 그저 시각적으로 볼 수 있는 초록색 바운더리(Spawn 범위)를 만들어주기 위해 사용하는 것
3. SpawnGenerator 사이즈 늘려서 스폰 범위 만들어주기
4. Box Collider의 is Trigger 체크해서 Spawn 한 오브젝트들이 서로 밀어내지 않기 위해
(Trigger한 오브젝트는 다른 물체가 뚫고 지나갈 수 있어서)
브젝트들을 강제로 밀어내지 않게 해줌
5. SpawnGenerator에 새로운 스크립트 SpawnGenerator.cs 추가
SpawnGenerator에게 가장 먼저 필요한 것:
- 나 자신의 박스 콜라이더 : 스폰할 위치
- 찍어낼 게임 오브젝트들
- 몇개를 찍어낼지
- (프롭 재사용을 위한) 출력하기 위한 리스트
GetRandomPosition에서 생성 범위
SpawnGenerator.cs
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;
}
//미리 만들어진 프리팹들 중에서 랜덤하게 하나를 픽업해서
//GetRandomPosition을 통해서 가져온 위치에 하나 찍어내는 역할을 함
private void Spawn()
{
//몇번째 친구를 사용할까 (GameObject[] proPrefabs; 여기서)
//Random.Range는 maximum 값은 빼고 랜덤으로 반환함
int selection = Random.Range(0,propPrefabs.Length);
GameObject selectedPrefab = propPrefabs[selection];
Vector3 spawnPos = GetRandomPosition();
//Quaternion.identity : 0,0,0의 회전
//단순하게 찍어내지만 말고 리스트에 등록을 해야함
//왜? 라운드가 넘어갈 때 마다 스폰제네레이터가 미리 찍혀나온
//프롭들을 전부 가져와서 다시 랜덤한 위치에 지정해야 하기 때문
//그래서 Instantiate(selectedPrefab, spawnPos, Quaternion.identity); 이것만 하지 않고 값을 받아와서
//밑에처럼
GameObject instance = Instantiate(selectedPrefab, spawnPos, Quaternion.identity);
props.Add(instance); //리스트에 등록
}
//생성할때마다 랜덤한 백터3 좌표 반환용
//Spawn 함수에서 매번 새로운 랜덤 위치를 가져다줄 수 있도록 함
private Vector3 GetRandomPosition()
{
//어딜 기준으로 지정할 수 있냐면 기본적으로
//SpawnGenerator 위치에서 박스 사이즈의 절반만큼씩 더해줌
Vector3 basePosition = transform.position;
//박스콜라이더 area의 사이즈
Vector3 size = area.size;
//나 자신의 위치에서(basePosition)
//가로길이의 절반만큼 왼쪽으로, 가로길이의 절반만큼 오른쪽으로
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);
}
}
}
'Unity' 카테고리의 다른 글
게임 매니저, PlayerPrefs (0) | 2021.07.22 |
---|---|
카메라 추적 (0) | 2021.07.22 |
유니티에서 임포트패키지 밑에 여러 패키지들 안보일 때 (0) | 2021.07.20 |
볼 슈터, OnEnable() (0) | 2021.07.20 |
파워 슬라이더 (0) | 2021.07.17 |
댓글