유니티 프로그램

[유니티] UNITY GameObject의 위치를 랜덤(random)하게 생성하려면 어떻게 하나요?

비도르 2022. 8. 1. 19:32

[유니티] UNITY GameObject의 위치를 랜덤(random)하게 생성하려면 어떻게 하나요?

 

안녕하세요. 오늘도 평화롭게 태풍이 다가오는 8월의 첫날입니다.

게임을 시작할 때 다양한 위치에 게임 말들을 위치시키고 싶을 때가 있습니다. 매번 정해진 위치를 적용하는 것 보다 게임의 흥미를 위해서 랜덤하게 생성할 필요가 있습니다.

 

이때 사용하는 것이 Random 스크립트 API 입니다.


How??? 어떻게 사용하는지 알아보겠습니다.

 

1. 사각형의 면에서 랜덤 값을 가져오고 싶을 때는Range()함수를 사용합니다.

X = Random.Range(0, 1f); // 가로 위치

Y = Random.Range(0, 1f); // 세로 위치

 

2. 원형의 면에서 랜덤 값을 가져오고 싶을 때는 insideUnitSphere 변수를 사용합니다.

Vector3 xyz = (Vector3)Random.insideUnitSphere; // 3D 공간의 랜덤 위치를 가져옴

 

이렇게 간단하게 가로세로 위치를 가져와서 Position값에 넣어서 구현할 수 있습니다.

 

아래와 같이 Randomtest 란 이름의 스크립터를 만들어서 빈오브젝트에 넣고 랜덤한 위치에 게임오브젝트를 생성하는 방법을 알아보겠습니다.

 

[예제1]  사각형의 면에 랜덤으로 위치값 가져오기

아래와 같이 스크립터를 생성하고, 빈오브젝트를 만들어서 넣습니다.

using UnityEngine;

public class Randomtest : MonoBehaviour
{
    // 크기가 가로,세로 10인 정사각형에서 랜덤위치 가져오기
    [Header("GameObject")]
    public GameObject cubeIns; //생성하려는 게임오브젝트를 넣는다.

    void Start()
    {
        float squaureRange = 10f; //생성하려는 범위의 크기를 넣어준다

        for (int i = 0; i < 10; i++)
        {
            float rangeX = Random.Range(0, 1f) * squaureRange; //가로의 위치를 랜덤으로 생성한다.
            float rangeY = Random.Range(0, 1f) * squaureRange; //세로의 위치를 랜덤으로 생성한다.
            Vector3 randPos = new Vector3(rangeX, 5.0f, rangeY); //가로,세로의 위치 정보를 넣는다. 높이는 임의로 5로 설정함.

            Instantiate(cubeIns, randPos, Quaternion.identity); //랜덤한 위치에 게임오브젝트를 생성한다.
        }
    }
}

 

그리고, 프리팹으로 만든 생성하고 싶은 게임오브젝트를 변수 cubeIns에  드래그앤드랍해서 넣고 실행하면 아래와 같이 랜덤하게 큐브가 생성되는 것을 확인 할 수 있습니다.

 

Random.Range(min,max) 함수 예제

 

[예제2] 원형의 면에 랜덤으로 위치값 가져오기

아래와 같이 스크립터를 생성하고, 빈오브젝트를 만들어서 넣습니다.

 

using UnityEngine;

public class Randomtest : MonoBehaviour
{
    // 크기가 반지름이 10인 원형에서 랜덤위치 가져오기
    [Header("GameObject")]
    public GameObject cubeIns; //생성하려는 게임오브젝트를 넣는다.

    void Start()
    {
        float squaureRange = 10f; //생성하려는 범위의 크기를 넣어준다

        for (int i = 0; i < 30; i++)
        {           
            Vector3 randPos = (Vector3)Random.insideUnitSphere *squaureRange;
            randPos.y = 5f; //높이 값을  임의로 5로 고정함.
            Instantiate(cubeIns, randPos, Quaternion.identity); //랜덤한 위치에 게임오브젝트를 생성한다.
        }
    }
}

 

그리고, 프리팹으로 만든 생성하고 싶은 게임오브젝트를 변수에 드래그앤드랍해서 넣고 실행하면 아래와 같이 원형으로 랜덤하게 큐브가 생성되는 것을 확인 할 수 있습니다.

Random.insideUnitSphere 변수 예제

그럼 즐유 하세요 ^^