우리는 지금까지 프로젝트 뷰에서 직접 인스펙터 뷰의 프로퍼티에 애셋을
드래그&드롭하여 할당해주는 방식을 사용했습니다.
이렇게 드래그&드롭으로 애셋를 할당하는 방법은 매우 직관적이고 간편한 방법이지만,
만약 드래그&드롭을 해야하는 수가 많아진다면
처음부터 끝까지 수동으로 사람의 손을 거쳐야만 해서 생각보다 많은 작업 시간을 소모하게 만듭니다.
따라서 에셋을 스크립트로 가져오는 방법을 알아보도록 하겠습니다.
프리팹을 등록할때 Resources, 그 아래에 Prefabs 폴더를 만들어서 관리했던것을 기억하시나요?
유니티에서는 에셋을 쉽게 불러올 수 있도록 "Resources"라는 이름으로 폴더를 만든다면
Resources 클래스를 이용하여 스크립트에서 쉽게 에셋을 로드할 수 있는 기능을 제공합니다.
Resources 폴더는 유니티 엔진의 예약 폴더라는 것으로,
특정한 규칙에 따라 정해진 이름으로 만들어진 폴더에 특수한 기능을 부여하는 것입니다.

에디터에서 Resources 폴더는 Assets 폴더 아래에 있다면 위치는 상관없으며
A 폴더와 B 폴더, 둘 다 Resources 폴더를 가지고 있어도
무리없이 하나의 Resources 폴더처럼 동작합니다.
Resources.Load 함수를 사용하면 Resources 폴더 안에 들어있는
에셋들을 스크립트에서 불러와서 사용할 수 있게 됩니다.
에셋의 경로로 접근할 때는 Resources 폴더는 생략하고
'/'를 이용하여 하위 폴더에 접근하며 게임오브젝트의 이름으로 접근할 수 있습니다.
예) "Prefabs/Tank" => Resources 폴더 아래 Prefabs 폴더 아래 Tank 게임 오브젝트
public class Spawner : MonoBehaviour
{
[SerializeField]
private GameObject prefab;
GameObject tank;
void Start()
{
prefab = Resources.Load<GameObject>("Prefabs/Tank"); //에셋 불러오기
tank = Instantiate(prefab);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.X))
{
Destroy(tank, 3f);
}
}
}
Resources 폴더에 들어있는 애셋들은 게임이 실행되면 무조건 메모리에 적재됩니다.
그렇기 때문에 게임이 과도한 메모리를 소모하는 문제를 발생시키고 싶지 않다면,
비교적 메모리를 적게 소모하면서 빠르고 손쉽게 가져와야하는
애셋만을 Resources 폴더에 넣어둘 것을 권장합니다.
Resources 폴더와 다르게 애셋들을 메모리에 로드했다가
메모리 관리를 위해서 사용하지 않을 때는 다시 언로드하는 방식으로 사용하는
기술로는 애셋 번들이라는 것이 있습니다.
또한 웹에 있는 서버에 접근하여 필요한
이 애셋 번들과 서버에서 불러오는 방법에 대해서는 다음에 다뤄 보도록 하겠습니다.
Resources 클래스를 사용하는데 불편한 점을 보안하고자
Resources 클래스를 우리 입맛대로 랩핑해서
게임 오브젝트의 생성, 삭제를 관리하는 Resource Manager를 만들어 보겠습니다.
public class ResourceManager : Singleton<ResourceManager>
{
public T Load<T>(string path) where T : Object
{
return Resources.Load<T>(path);
}
public GameObject Instantiate(string path, Transform parent = null)
{
GameObject prefab = Load<GameObject>($"Prefabs/{path}");
if (prefab == null)
{
Debug.Log($"Faild to load Prefab : {path}");
return null;
}
return Object.Instantiate(prefab, parent);
}
public void Destroy(GameObject prefab)
{
if (prefab == null)
return;
Object.Destroy(prefab);
}
}