본문 바로가기
Unity

랜덤 오브젝트 생성기

by imagineer_jinny 2021. 7. 22.

만들어야 할 것: 라운드가 시작될 때 마다 프롭이 정해진 범위 내에서 랜덤하게 정해진 갯수만큼 찍어나오는 것

 

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

댓글