[Unity] 빌드(Build)했을 때, JSON 파일을 읽지 못하는 현상
2022. 3. 7. 21:18ㆍTrouble Shootings/Game
분명 유니티 에디터 상에서 실행했을 때는 JSON 파일을 잘 읽어왔었습니다. 그런데, 빌드만 하면 읽어오지 못하는 문제가 발생했네요... 이것 때문에 2시간은 삽질한 것 같습니다.
1. 문제의 JSON 파일 읽어오기 코드
using System.IO;
using LitJson;
private const string jsonFilePath = "/Resources/Json/Narration.json";
private JsonData ReadJsonFile()
{
if(File.Exists(Application.dataPath + jsonFilePath))
{
string jsonString = File.ReadAllText(Application.dataPath + jsonFilePath);
JsonData jsonData = JsonMapper.ToObject(jsonString);
return jsonData;
}
return null;
}
위 코드는 분명 에디터에서 실행할 때는 잘 읽어오는 문제없는 코드였습니다. 열심히 이것 저것 찾아본 결과, 유니티의 Assets 디렉토리의 Resources 디렉토리 내부에 있는 파일들을 가져올 때는 Resources 클래스를 사용해줘야 하는 것 같더라구요.
2. Resources 클래스
- Assets 폴더 내 Resources 이름을 가진 폴더 안의 모든 에셋들은 Resources.Load() 함수를 통해 접근할 수 있다.
- Resources 폴더는 여러 개가 존재할 수 있으며, 오브젝트를 로드할 시 모두 검사 대상이 된다.
- 대소문자는 구분하지 않는 것 같다. (Resources == resources)
유니티 공식 문서에 적혀있는 내용입니다. 유니티에서는 보통 에셋에 접근할 때, 경로명보다는 멤버 변수에 참조를 할당하는 방식을 사용하죠. 인스펙터 창에서 공개된 멤버 변수에 오브젝트를 할당하는 것이 그 예시입니다.
이런 식의 할당 방법은 사용되는 에셋들을 자동으로 계산하여 빌드할 때 포함시키는 것 같네요.
하지만 Resources 폴더에 에셋들을 넣어두게 되면 위와 같은 방법은 사용할 수 없게 됩니다. 즉, Resources 폴더 내에 있는 에셋들은 별도로 로드를 해주지 않으면 빌드할 때, 포함시키지 않는 것 같습니다. 이 부분을 몰랐기 때문에 버그가 발생한 것 같네요.
3. 수정한 JSON 파일 읽어오기 코드
- Resources 폴더 다음부터 경로명을 설정
- 파일 확장자명은 생략
/* 경로명이 Assets/Resources/Json/Narration.json 이라면, */
private const string jsonFilePath = "Json/Narration";
private JsonData ReadJsonFile()
{
var jsonTextFile = Resources.Load<TextAsset>(jsonFilePath);
JsonData jsonData = JsonMapper.ToObject(jsonTextFile.ToString());
return jsonData;
}
728x90
반응형