Unity Engine/Unity 3D.

일정한 간격으로 오브젝트 생성

Muru 2023. 10. 20. 16:02

 private IEnumerator 코루틴이름()
 {
 	//15개 생성할거니까 15, 간격은 2정도
 	CreateMagicPosWithInterval(15, 2f)
 }
 
 private void CreateMagicPosWithInterval(int count, float interval)
    {
    	//플레이어 위치에서 살짝 떨어진 y값 4와 z값 -1
        Vector3 centerPos = playerController.transform.position + new Vector3(0f , 4f, -1f);

        List<Vector3> positions = new List<Vector3>();

        for (int i = 0; i < 6; i++)
        {
            positions.Add(centerPos + new Vector3((i - 2.5f) * interval, 0, -interval));
        }
        for (int i = 0; i < 5; i++)
        {
            positions.Add(centerPos + new Vector3((i - 2f) * interval, 0, 0));
        }
        for (int i = 0; i < 4; i++)
        {
            positions.Add(centerPos + new Vector3((i - 1.5f) * interval, 0, interval));
        }

        foreach (var pos in positions)
        {
            Transform magicPos = Instantiate(megidoPosPrefab, pos, Quaternion.identity);
            magicPosition.Add(magicPos);
        }
    }

 

간단하게 메기도를 발사할 Pos를 줄어드는 형태 및 일정한 간격으로 만들었다.

Pos를 플레이어의 위치에서 첫번째 줄엔 6개, 두 번째 줄 5개, 세 번째 줄 4개로 생성할것. (총 15개)

 

여기서 (i - 숫자f) * interval(간격);을 설명해보자면

 

첫번째 줄에서 생성하는 6개의 포인트는 0부터 5까지 i를 반복하는데, -숫자f를 하지않고

(i * interval)을 한다면 포인트가 0부터 시작하므로 플레이어의 오른쪽으로 확장될것입니다.

 

저는 포인트를 중심에 가깝게 만들고 싶으므로 -2.5f를 사용해 6개의 포이느가 중심을 기준으로 균등하게했습니다.

for(i = 0, i < 6; i++)
{
    for문이 반복되는데
    i = 0 - 2.5f = 첫 번째 생성위치 = -2.5f
    i = 1 - 2.5f = 두 번째 생성위치 = -1.5f
    
    ...2, 3, 4
    
    i = 5 - 2.5f = 다섯 번째 생성위치 = 2.5f
}

이 생성위치에 interval(간격)을 곱하므로 균등하게 생성을 할수있게된다.

 

두 번째 -interval,0, interval 값은 z값인데 15개 (6 + 5 + 4) 세 줄로 나타낼것이므로 간격을 준것이다.

 

이제 그리드 형태로 플레이어 중심 주변에 균등히 배치됩니다.