예약된(?) 폴더 이름과 Application의 Path들
특수 폴더 이름
유니티는 아래의 몇몇 폴더 이름을 특수한 목적을 위해 예약해 두고 있다. (개발 언어의 예약어처럼)
- Assets
- Editor
- Editor default resources
- Gizmos
- Plugins
- Resources
- Standard Assets
- StreamingAssets
"Assets"
Assets는 유니티 프로젝트에서 쓰이는 에셋들을 담고 있는 주 폴더이다. 대부분의 API가 모든 에셋이 여기에 있다고 가정하고 있다.
"Editor"
Editor 폴더 안의 스크립트는 에디터 어셈블리에 포함된다. 따라서 런타임에 읽을 수 없다. Editor 폴더는 여러 개가 될 수 있다.
"Editor Default Resources"
에디터에서만 사용할 리소스들을 모아두는 폴더. 에디터 전용이기 때문에 빌드에는 포함되지 않는다. 단 하나의 폴더만 존재할 수 있고 Assets 폴더 바로 안 루트에 배치해야 한다.
"Gizmos"
Gizmo에 쓸 에셋들을 모아두는 폴더. Gizmos.DrawIcon 함수에서 사용할 이미지들은 이 폴더 안에 있어야 한다. 마찬가지로 에디터 전용이라 빌드에 포함 안 됨. Assets 폴더 바로 안 루트에 배치해야 한다.
"Resources"
스크립트에서 에셋을 온디맨드 형식으로 로드하고자 한다면 에셋을 "Resources"폴더 안에 두면 가능하다. 이런 에셋들은 Resources.Load 함수를 이용하여 쓸 수 있다. 여러 개의 폴더를 생성할 수 있으며 Resource 폴더의 하위 폴더에 에셋을 넣어도 된다. 만약 Editor의 하위 폴더에 "Resources"폴더가 있다면 그 안의 에셋들은 에디터 전용으로 간주되어 에디터에서 로드할 수 있게 되지만 빌드에는 포함되지 않는다.
"(Pro )Standard Assets"
스탠다드 에셋 패키지를 임포트 하면 이 폴더에 저장이 된다. 기본 어셈블리보다 빨리 컴파일된다.
"Streaming Assets"
스트리밍 에셋이란 타겟 플랫폼의 특정 폴더에 있어서 유니티가 필요할 때 접근할 수 있는 에셋이다. 예를 들어 특정 엔딩 분기에서 100MB짜리 동영상을 틀어야 하는데 이걸 애초에 씬 로드 때 로드하는 건 이상하다. 따라서 필요할 때 동영상을 로드하는 게 좋은데 이럴 때 쓰이는 게 스트리밍 에셋이다.
이곳에 있는 에셋들은 유니티 전용 포맷으로 임포트 되지 않는다.
아무튼 이 폴더 안에 있는 에셋들은 설치 시 타겟 플랫폼의 특정 폴더로 복사된다. (Video Player 등에서 접근할 수 있도록)
안드로이드 관련
".androidpack" 혹은 ".androidlib"으로 끝나는 폴더들은 안드로이드 커스텀 에셋이나 라이브러리로 간주된다.
히든 에셋
유니티에서는 다음의 폴더들은 임포트 대상에서 제외한다.
- 숨겨진 폴더
- '.'으로 시작하는 파일 및 폴더
- '~'으로 끝나는 파일 및 폴더
- cvs라는 이름의 파일 및 폴더
- .tmp확장자를 가진 파일
폴더별 어셈블리와 실행 순서
폴더의 위치에 따라 어셈블리도 바뀌고 실행 순서도 바뀌게 되는데 다음 순서로 실행된다.
실행 순서 | 어셈블리 이름 | 타겟 |
1 | Assembly-CSharp-firstpass | Standard Assets폴더에 있는 스크립트나 Plugins들이 여기에 속한다. |
2 | Assembly-CSharp-Editor-firstpass | Standard Assets폴더 안의 Editor 폴더에 있는 스크립트나 플러그인 |
3 | Assembly-CSharp | 대부분의 스크립트 |
4 | Assembly-CSharp-Editor | "Editor"폴더 안에 있는 스크립트 들 |
Application.path들
Application클래스에서는 총 4개의 path를 제공하는데 다음과 같다.
- Application.dataPath
- Application.persistentDataPath
- Application.temporaryCachePath
- Application.streamingAssetsPath
Application.dataPath
이건 그냥 게임이 저장된 폴더를 가리킨다. 예를 들어 안드로이드 타겟에서는 APK 파일의 위치를 가리킨다. 주의할 점은 iOS에서는 이 공간이 읽기 전용이다. 따라서 파일을 디바이스에 저장할 때 이 경로로 하면 안드로이드에서는 잘 되는데 iOS에서는 안 되는 문제가 발생한다. 뭔가 데이터를 저장하고자 한다면 아래의 persistentDataPath를 써야 한다.
Application.persistentDataPath
디바이스의 Public Directory를 가리킨다. 따라서 런타임에 파일 읽기/쓰기가 가능하다. 또한 이름에서 유추할 수 있듯 persistent 하다. 앱이 업데이트되어도 이곳에 있는 파일들은 제거되지 않는다.
Application.streamingAssetsPath
위에서 다룬 "Streaming Assets"폴더의 경로를 가리킨다.
Application.temporaryCachePath
문자 그대로의 임시 캐시에 대한 폴더. 어디선가 OS에 의해 삭제될 수 있다고 본 것 같은데 출처를 못 찾겠음.
참고 :
https://docs.unity3d.com/2021.3/Documentation/Manual/SpecialFolders.html
https://answers.unity.com/questions/1181652/difference-between-applicationpersistantdatapath-v.html