배 타다 개발자

[유니티] 프리팹을 씬에 효과적으로 로딩하는 방법 - Resource Manager 본문

Graphics/Unity 3D

[유니티] 프리팹을 씬에 효과적으로 로딩하는 방법 - Resource Manager

노 아 2021. 10. 27. 09:39

유니티에서 프리팹을 로딩하는 방법에 대해서 정리합니다.

방법 1 : 에디터에서 드래그 드랍해서 생성

씬에 객체를 생성할 때, 아래와 같은 스크립트형식은 같이 유니티의 장점을 활용하여서 에디터에서 프리팹을 드래그 드랍해서 씬에 생성해주는 방법이 가장 쉬운 방법입니다.

'StaticMesh'라는 프리팹이 씬에 로딩이 될겁니다.

방법 2 : 스크립트 컴포넌트에서 직접 접근하여 생성

두번째 방법으로는 스크립트 컴포넌트에서 Assets/Resources 이하 파일 시스템에 접근하여서 로드시키는 방법입니다.

플레이하면 씬에 Assets/Resources/Prefabs 파일의 StaticMesh 라는 프리팹이 로딩됩니다.

ResourceManager 로 로딩/생성/파괴를 싱글톤매니저에서 관리.

위의 두가지 방법으로 프리팹을 로딩하다보면,
누가 언제 무엇을 언제 만드는 지 헷갈리게 됩니다.

ResourceManager를 싱글톤매니저에 등록해서 프리팹을 로딩하는 방식을 만들어봅니다.

ResourceManager 스크립트를 하나 생성하고, Monobahaviour 상속은 해제시킵니다.

이제 싱글톤 매니터 스크립트에는 ResouceManager를 생성하고,
다른 클래스에서 접근할때 Manager.Resource로 접근할 수 있게
프로퍼티를 다음과 같이 만들어 줍니다.

테스트

이제 단순하게 싱글톤매니저에서 StaticMesh라는 프리팹을 생성하도록
PrefabTest 스크립트 컴포넌트를 작성하면 싱글톤 매니저에서 ATC 프리팹을 생성합니다.


플레이를 누르면 씬에 프리팹이 생성되었습니다.

코드

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


// 리소스의 Load, Instantiate, Destroy 를 관리하는 리소스 매니저. 
public class ResourceManager 
{

    // path에 있느 파일을 로드하는 함수, 로드되는 조건은 Object 일 때
    public T Load<T>(string path) where T : Object
    {
        return Resources.Load<T>(path);
    }


    // 생성 
    // parent는 프리팹을 생성해서 붙일 곳 
    public GameObject Instantiate(string path, Transform parent = null)
    {
        GameObject prefab = Load<GameObject>($"Prefabs/{path}");

        if(prefab == null)
        {
            Debug.Log($"Failed to load prefab : {path}");
            return null;
        }

        return Object.Instantiate(prefab, parent);
    }


    public void Destroy(GameObject go)
    {
        if (go == null) return;
        Object.Destroy(go);
    }

}