유니티 방치형 프로젝트 - 몬스터를 지정 반경 내에 랜덤하게 스폰 시키기(Random.insideUnitSphere)

반응형

 

 

구현 목표

  • 목적:
    지정한 기준 위치(여기서는 원점, (0, 0, 0))로부터 n만큼 떨어진 반경 내에서 몬스터를 랜덤하게 스폰시키는 것.
  • 예시:
    몬스터가 (0, 0, 0)부터 (5, 0, 5) 범위 내에서 랜덤하게 스폰되도록 구현함.

구현 방법

  1. 랜덤 위치 생성:
    • Random.insideUnitSphere 함수를 사용하여 반지름 1의 구 내부의 임의의 점을 얻은 후, 5.0f를 곱해 (0, 0, 0)부터 (5, 0, 5) 범위 내의 위치를 생성합니다.
    • y축은 항상 0으로 고정하여, 스폰 위치가 수평 평면에만 위치하도록 합니다

  2. 특정 범위 조건 적용:
    • while 문을 사용하여 생성된 랜덤 위치와 원점(0, 0, 0) 사이의 거리를 계산합니다.
    • 만약 거리가 3.0 이하이면, 조건에 맞지 않으므로 다시 랜덤 위치를 결정합니다.
      3 값 이내에는 몬스터가 스폰 되지 않은 장면 (징그럽다..)
  3. 반복적인 스폰 처리:
    • 코루틴(SpawnCoroutine)을 이용하여, 한 번에 m_Count만큼 몬스터를 스폰한 후 m_SpawnTime만큼 대기하고, 다시 스폰하는 방식을 사용합니다.

코드 예시

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spawner : MonoBehaviour
{
    public GameObject monster_prefab;

    public int m_Count;
    public float m_SpawnTime;

    private void Start()
    {
        StartCoroutine(SpawnCoroutine());
    }
    IEnumerator SpawnCoroutine()
    {
        Vector3 pos;

        for (int i = 0; i < m_Count; i++)
        {
            pos = Vector3.zero + Random.insideUnitSphere *  5.0f;
            pos.y = 0.0f;

            while(Vector3.Distance(pos, Vector3.zero) <= 3.0f)
            {
                pos = Vector3.zero + Random.insideUnitSphere * 5.0f;
                pos.y = 0.0f;
            }

            var go = Instantiate(monster_prefab,pos,Quaternion.identity);
        }
        yield return new WaitForSeconds(m_SpawnTime);

        StartCoroutine(SpawnCoroutine());
    }
}

요약

  • 랜덤 위치 생성:
    Random.insideUnitSphere와 스케일 조정을 통해 (0, 0, 0) ~ (5, 0, 5) 범위의 위치 생성
  • 조건 검사:
    while 문으로 생성된 위치가 원점에서 3 이하일 경우, 다시 위치를 결정하여 조건에 부합하는 위치에만 몬스터 스폰
  • 반복적 스폰:
    코루틴을 사용하여 지정한 주기마다 몬스터를 반복적으로 스폰

이처럼 간단한 로직으로 원하는 범위 내에서 조건에 맞는 랜덤 스폰을 구현할 수 있습니다.

 

 

반응형