# 프리팹으로 구조 구축

> Use prefabs to instantiate several copies of a block prefab to construct a wall.

코드를 사용하여 특정한 설정의 프리팹 복사본을 대규모로 즉시 만들 수 있습니다. 코드를 사용하여 이런 식으로 구조체를 생성하는 것을 절차적 생성이라고 부릅니다.

## 블록 벽 인스턴스 만들기

이 작업은 블록 벽 인스턴스를 만드는 방법을 보여줍니다.

### 게임 오브젝트에 Wall 스크립트 연결

1. MonoBehaviour 스크립트를 생성하고 이름을 `Wall`로 지정합니다.
2. 아래 코드를 복사하여 `Wall` 스크립트에 넣습니다.
3. `Wall` 스크립트를 씬의 빈 게임 오브젝트에 연결합니다.

```
using UnityEngine;
public class Wall : MonoBehaviour
{
   public GameObject block;
   public int width = 10;
   public int height = 4;
  
   void Start()
   {
       for (int y=0; y<height; ++y)
       {
           for (int x=0; x<width; ++x)
           {
               Instantiate(block, new Vector3(x,y,0), Quaternion.identity);
           }
       }       
   }
}
```

**결과:** 필드가 `None`인 `Block` 변수가 인스펙터에 표시됩니다. `None` 값은 이 변수에 프리팹이 아직 할당되지 않았음을 의미합니다.


**아직 프리팹이 할당되지 않은 Block 변수:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockNotAssigned.png)

### Block 변수에 프리팹 할당

위 스크립트 예시는 **Block** 변수에 프리팹을 할당하기 전까지는 동작하지 않습니다. 간단한 블록 프리팹을 만들려면 다음 과정을 따르십시오.

1. **GameObject > 3D Object > Cube**를 선택합니다.

2. 큐브를 **계층** 창에서 **프로젝트** 창의 **Assets** 폴더로 드래그합니다. 그러면 프리팹 에셋이 생성됩니다.

3. 프리팹 이름을 `Block`으로 바꿉니다.

4. 이제 `Block` 프리팹이 에셋으로 존재하므로 계층 구조에서 큐브를 안전하게 삭제할 수 있습니다.

5. 이제 `Block` 프리팹을 만들었으므로 이를 **Block** 변수에 할당할 수 있습니다. 원본 게임 오브젝트(`Wall` 스크립트가 연결된 오브젝트)를 선택합니다. 이후 **프로젝트 창**에서 `Block` 프리팹을 **Block** 변수 슬롯(`None`으로 표시된 곳)으로 드래그합니다.


**Block 프리팹이 할당된 Block 변수:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockAssigned.png)

위 과정을 완료한 후 **Play**를 클릭하면 Unity가 해당 프리팹을 사용하여 벽을 빌드합니다.


**위 예시에서 생성된 10개의 블록을 4열로 쌓아 만든 벽.:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallComplete.png)

이는 Unity에서 반복해서 사용할 수 있는 유연한 워크플로 패턴입니다. 이 스크립트에서 프리팹을 사용했으므로, 스크립트를 건드리지 않고도 프리팹을 쉽게 교체하거나 편집하여 벽을 구성하는 벽돌의 프로퍼티를 수정할 수 있습니다. 씬에서 서로 다른 프리팹이 할당된 다른 게임 오브젝트에 `Wall` 스크립트를 사용하여 서로 다른 프리팹 유형으로 구성된 다양한 벽을 만드는 것도 가능합니다.

코드를 사용하여 제작 중인 게임이나 앱에 맞게 게임 오브젝트를 격자, 원형 패턴, 무작위 분산을 비롯한 다양한 패턴으로 배치할 수 있습니다. 다음 예시는 인스턴스를 원형으로 배치하는 법을 보여줍니다.

```
using UnityEngine;
public class CircleFormation : MonoBehaviour
{
   // Instantiates prefabs in a circle formation
   public GameObject prefab;
   public int numberOfObjects = 20;
   public float radius = 5f;
   void Start()
   {
       for (int i = 0; i < numberOfObjects; i++)
       {
           float angle = i * Mathf.PI * 2 / numberOfObjects;
           float x = Mathf.Cos(angle) * radius;
           float z = Mathf.Sin(angle) * radius;
           Vector3 pos = transform.position + new Vector3(x, 0, z);
           float angleDegrees = -angle*Mathf.Rad2Deg;
           Quaternion rot = Quaternion.Euler(0, angleDegrees, 0);
           Instantiate(prefab, pos, rot);
       }
   }
}
```


**위 예시에서 생성된 원형 블록 배열:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingCircle.png)

## 추가 리소스

* [발사체 및 폭발 인스턴스화](/engine/6000.0/manual/scripting/object-oriented-development/instantiating-prefabs/projectiles.md)
* [캐릭터 파괴 시뮬레이션](/engine/6000.0/manual/scripting/object-oriented-development/instantiating-prefabs/wrecks.md)
