유니티 동적 파일 Load에 필요한 Resources 폴더
예를 들어 유저가 게임을 다운받았을 때 필요 없는 애셋들(테스트용 또는 에셋 번들 등)까지 받을 필요는 없다. 보통 게임 사에서는 게임 제작 시 필요한 prefab들을 한데 묶어서 빌드하므로서 최적화 작업을 수행한다.
하지만 최종 완성 전 개발 단계에서 수시로 프로젝트를 테스트해야 하는 과정에서는 애셋을 확정지을수도 없을 뿐더러 필요 에셋을 수시로 주고받아야 하는 상황이 발생할 수 있다. 예를 들어, 개발 프로젝트를 합칠 때 리소스에 대한 통제가 원활하지 않으면 프리팹이 누락되거나 필드에 연결되지 않아 테스트 동작하는 데 문제가 발생할 수 있다. 이렇게 리소스에 대한 유연한 사용이 필요할 때 우리는 Resources 파일을 사용해주면 된다.
유저의 편의성을 위해 유니티는 내부적으로 특수 목적으로 동적 파일을 사용할 때 Resources라는 고정적인 이름을 가진 파일을 만들어서 저장하면, 동적 로드를 지원하는 기능을 제공하고 있다. Resources 파일에 저장된 데이터들은 동적으로 로드가 되어 파일을 건드리지 않기 때문에 프로젝트를 진행할 때 특정 메서드를 선언해 호출해줄 수 있다.
예를 들어, bullet에 피격당한 적이 폭발하는 explosion 프리팹을 나타낼 때 다음과 같이 Resources 파일에 저장된 GameObject를 호출해줄 수 있다.
GameObject explosionFactory;
// explosionFactory = (GameObject)Resources.Load("Prefabs/Explosion");
explosionFactory = Resources.Load("Prefabs/Explosion") as GameObject ;
Resources.Load() 메서드는 기본적으로 Object 타입을 가지고 호출할 경로를 string 형식으로 작성해주어야 한다. 따라서 Resources 폴더 안 Prefabs 폴더에 있는 Explosion 프리팹을 가져오기 위해 "Prefabs/Explosion" 형식으로 path를 지정해주면 된다.
그리고 Object 타입 객체를 받기 때문에 실제로 로드해서 호출할 때는 TypeCasting(형 변환)을 해주어야 한다. explosionFactory를 GameObject 타입으로 선언했기 때문에 (GameObject) 또는 as GameObject로 형 변환해주면 된다.
유니티에서 제공하는 특수 폴더
Resources 파일을 사용한 동적 로드는 유니티에서 유저들의 편의성을 향상시킬 수 있는 기능으로 유니티가 가진 장점 중 하나라고 보면 된다. 유니티에서는 Resources 뿐만 아니라 비슷한 역할을 하는 특수 폴더 이름과 기능을 제공하고 있다.
Assets | 유니티 프로젝트에서 사용하는 애셋이 포함되는 주 폴더 |
Editor | 런타임 스크립트가 아닌, 에디터 스크립트로 간주하여 유니티 에디터에 기능을 추가하며 커스터마이징 |
Editor Default Resources | 요구가 있을 때 즉시 에셋 파일을 로드 |
Gizmos | 씬 뷰에 그래픽스를 추가하여 원래는 보이지 않는 디자인 디테일을 시각화 |
Plug-ins | 유니티의 기능을 확장하기 위해 포르젝트에 추가하는 네이티브 DLL(타사 코드 라이브러리, 시스템 콜, 기타 유니티 빌트인 기능 등) |
Resources | 씬에서 게임플레이에 사용할 에셋의 인스턴스를 만드는 대신 스크립트에서 온디맨드 방식으로 에셋을 로드 |
Standard Assets | 스탠다드 애셋 패키지를 임포트하면 에셋 뿐만 아니라 스크립트 컴파일 순서에도 영향을 미침, 특수 폴더와 스크립트 컴파일 순서에 사용 |
StreamingAssets | 파일을 타겟 기기의 특정 폴더로 그대로 복사되어 사용하기 위함 |
Hidden Assets | 임포트 과정에서 유니티 Assets 폴더의 특정 파일 및 폴더를 완전히 무시 |
https://docs.unity3d.com/kr/2018.4/Manual/SpecialFolders.html
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity] File 저장과 PlayerPrefs (0) | 2022.07.15 |
---|---|
[Unity/C#] Call by Value / Call by Reference 비교, StringBuilder 사용 이유 (0) | 2022.07.13 |
[Unity] 유니티 2D게임 배경 제작 시 Plane과 Quad 차이 비교 (0) | 2022.07.07 |
[유니티/C#] 일반화(Generic)이란? 제네릭 메서드&제네릭 클래스의 선언 방식과 차이 비교, 제네릭 컬렉션 특징 및 활용 사례 (0) | 2022.07.06 |
[유니티/C#] 게임 디자인 패턴(Design Pattern)과 리팩토링(Refactoring) (0) | 2022.07.04 |