안녕하세요 투니드입니다! 이번시간에는 유니티에서 사용하는 프리팹에 대해서 알아보겠습니다!

 

프리팹(Prefab)이란?

프리팹(Prefab) 은 게임 오브젝트(GameObject)를 미리 저장해 두었다가 언제든 복제해서 사용할 수 있는 템플릿 입니다.
같은 오브젝트를 여러 번 만들 때 효율적으로 관리할 수 있습니다.
씬(Scene)에서 직접 생성하지 않고 코드에서 동적으로 생성할 수도 있습니다.
원본(프리팹)을 수정하면 모든 인스턴스가 함께 업데이트됩니다.

 

1) 프리팹의 기본 사용법

프리팹을 활용하면 같은 오브젝트를 여러 번 생성할 때 중복을 줄이고 유지보수를 쉽게 할 수 있습니다.
예를 들어, 적 캐릭터(Enemy)나 총알(Bullet)과 같은 반복되는 오브젝트를 프리팹으로 관리하면 유용합니다.

 

✅ 프리팹 생성 방법

  1. Hierarchy에서 게임 오브젝트를 만든 후 원하는 설정을 합니다.
  2. Project 창으로 드래그하여 프리팹으로 변환합니다.
  3. 이제 프리팹을 코드에서 쉽게 인스턴스화할 수 있습니다!

In Project

 

예를 들어 총이 있는 게임이라고 가정해 볼게요! 총이 있다면 총알이 있겠죠? 그런데 총알은 정~말 여러 개가 필요할 겁니다!

맞나요?

 

이런 때에 사용하는 게 프리팹입니다 프리팹 생성방법을 좀 더 자세히 알아보죠!

위와 같이 우선 원본을 하나 만들어줍니다! 그리고 나서

In Project

 

Hierarchy에 만든 원본 게임오브젝트를 원하는 폴더에 들어가서 드래그 앤 드롭해주면 됩니다!

그러면 파란색 오브젝트로 바뀔 텐데, 이렇게 되면 프리팹으로 정상적으로 설정이 된 것입니다!

 

그러면 이 프리팹을 왜 쓰느냐 방금 만든 프리팹을 Hierarchy에 많~이 드래그해보겠습니다!

In Project

 

이렇게 프리팹을 하나 만들면 똑같은 게임오브젝트를 드래그만으로 Hierarchy에 생성해 낼 수 있습니다!

 

 

2) 프리팹을 활용한 동적 생성

프리팹을 동적으로 생성하려면 Instantiate 내부메서드를 사용합니다.

 

🎯 예제: 총알(Bullet) 프리팹 생성

 

BulletTest.cs

더보기

using UnityEngine;

public class BulletTest : MonoBehaviour
{
    public GameObject bulletPrefab; // Inspector에서 프리팹을 할당해야 합니다.

    void Update()
    {
        //왼쪽 마우스버튼을 누르면
        if (Input.GetMouseButtonDown(0))
        {
            // 프리팹을 현재 위치에 생성
            Instantiate(bulletPrefab, transform.position, Quaternion.identity);
        }
    }
}

이렇게 스크립트 파일을 저장하고

GameObject Inspector

 

빈 오브젝트를 하나 만들어준 다음에 BulletTest.cs 파일을 붙여줍니다! 그리고 Prefab 칸에 아까 만들었던 Bullet 프리팹을 드래그해서 할당해 줍니다! 

 

이렇게 설정해 준다음 실행해 보면 

Game

 

이렇게 마우스를 클릭할 때마다 Bullet이 생성되는 걸 확인하실 수 있습니다! 정말 쉽죠??

 

✔ bulltPrefab 변수를 통해 프리팹을 가져와 Instantiate()로 생성
✔ transform.position을 사용해 현재 위치에 프리팹을 생성
✔ Quaternion.identity는 회전을 초기화 (0,0,0) 상태로 둠

 

3) 생성된 프리팹의 관리

프리팹을 생성할 때 부모(Parent) 오브젝트를 지정하거나, 일정 시간이 지나면 삭제할 수도 있습니다.

 

✅ 생성된 프리팹을 특정 오브젝트의 자식으로 설정

더보기

using UnityEngine;

public class BulletTest : MonoBehaviour
{
    public GameObject bulletPrefab; // Inspector에서 프리팹을 할당해야 합니다.

    void Update()
    {
        //왼쪽 마우스버튼을 누르면
        if (Input.GetMouseButtonDown(0))
        {
            // 프리팹을 현재 위치에 생성
            GameObject bulletGO = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
            bulletGO.transform.parent = transform;
        }
    }
}

이렇게 코드를 바꾸게 되면 이제부터는 빈 오브젝트인 GameObject의 자식들로 들어가게 될 겁니다!

함께 보시죠!

Game

 

이렇게요! 그러면 이제 Hierarchy창을 깨끗하게 관리할 수 있겠죠?

 

✅ 일정 시간이 지나면 자동으로 삭제

더보기

using UnityEngine;

public class BulletTest : MonoBehaviour
{
    public GameObject bulletPrefab; // Inspector에서 프리팹을 할당해야 합니다.

    void Update()
    {
        //왼쪽 마우스버튼을 누르면
        if (Input.GetMouseButtonDown(0))
        {
            // 프리팹을 현재 위치에 생성
            GameObject bulletGO = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
            bulletGO.transform.parent = transform;

            Destroy(bulletGO, 5f); // 5초 후에 삭제

        }
    }
}

이렇게 한 줄 코드를 추가해 주면 5초 후에 생성된 프리팹이 씬에서 지워질 거에요!

함께 보시죠!

Game

 

5f 자리에 원하는 시간을 넣으면 그 시간이 지나면 사라집니다! 사용자가 원하는 시간에 맞게 생성시켰다가 제거했다가 할 수 있다는 뜻이죠!

 

✔ Destroy()를 사용하면 메모리를 절약할 수 있습니다.
✔ 필요하지 않은 프리팹을 자동으로 제거하여 성능을 관리할 수 있습니다.

 

4) 프리팹과 오리지널 오브젝트의 차이

✔ 프리팹은 원본 데이터를 보존하면서, 인스턴스들은 개별적으로 변형이 가능합니다.
✔ 프리팹을 수정하면 씬 내 모든 인스턴스에 변경 사항이 적용됩니다.

 

5) 총알 자동 생성 시스템

더보기

using UnityEngine;

public class BulletTest : MonoBehaviour
{
    public GameObject bulletPrefab; // Inspector에서 프리팹을 할당해야 합니다.


    void Start()
    {
        InvokeRepeating("SpawnBullet", 0f, 1f); // 3초마다 총알 생성
    }

    void SpawnBullet()
    {
        Vector3 spawnPos = new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
        Instantiate(bulletPrefab, spawnPos, Quaternion.identity);
    }
}

코드를 이렇게 바꿔보죠! 이러면 어떻게 될까요?

Game

 

Vector3 spawnPos를 설정해서 중구난방으로 생성이 되긴 합니다만 뭘 누르지 않아도 자동으로 3초마다 하나씩

총알이 생성되는 걸 확인하실 수 있습니다!

 

프리팹은 유니티 개발에 있어서 필수 중에 필수입니다! 절대로 모르셔도, 사용법을 헷갈리셔도 안되기 때문에 한 번에 마스터하셔서 좋은 개발 하셨으면 좋겠습니다!

 

감사합니다!

+ Recent posts