Unity에서 Application.persistentDataPath에 저장된 데이터는 빌드 과정에서 포함되지 않습니다. persistentDataPath는 게임이 실행된 후 플레이어의 로컬 장치에 데이터를 저장하거나 로드하는 데 사용됩니다. 이는 주로 저장 데이터, 설정 파일, 다운로드한 콘텐츠 등 런타임에 생성되거나 수정될 수 있는 데이터를 저장하기 위한 디렉터리입니다.
중요한 점:
- persistentDataPath는 읽기-쓰기 가능한 디렉터리입니다.
- 게임 빌드에는 포함되지 않지만, 게임 실행 중 이 경로를 통해 데이터를 읽고 쓸 수 있습니다.
- 빌드 과정에서 포함하려는 데이터는 Resources 폴더 또는 StreamingAssets 폴더에 넣어야 합니다.
추천 방법:
만약 persistentDataPath에 기본 데이터를 제공하고 싶다면:
- 데이터를 StreamingAssets 폴더에 포함하여 빌드에 포함하세요.
- 게임 실행 시 처음 로드할 때, StreamingAssets에 있는 데이터를 persistentDataPath로 복사하세요.
using System.IO;
using UnityEngine;
public class DataInitializer : MonoBehaviour
{
void Start()
{
string persistentDataFilePath = Path.Combine(Application.persistentDataPath, "data.json");
string streamingDataFilePath = Path.Combine(Application.streamingAssetsPath, "data.json");
if (!File.Exists(persistentDataFilePath))
{
File.Copy(streamingDataFilePath, persistentDataFilePath);
Debug.Log("Data copied to persistentDataPath.");
}
}
}
위 코드를 통해 StreamingAssets에 저장된 초기 데이터를 실행 시 persistentDataPath로 복사할 수 있습니다.
게임을 배포할 때 StreamingAssets에 JSON 파일과 같은 초기 데이터를 넣고, 게임 실행 시 이 데이터를 persistentDataPath로 복사하는 방식이 일반적입니다. 이는 초기 데이터를 제공하면서도 사용자가 데이터를 수정하거나 저장할 수 있도록 하는 방법입니다.
배포 시 데이터 처리 과정
- StreamingAssets에 JSON 파일 추가:
- 프로젝트의 Assets/StreamingAssets 폴더에 JSON 파일(예: data.json)을 추가합니다.
- 이 폴더에 있는 파일은 빌드 과정에서 게임 패키지에 포함됩니다.
- StreamingAssets는 읽기 전용입니다(플랫폼에 따라 경로 액세스 방법이 조금 다를 수 있음).
- 게임 실행 시 복사:
- 게임이 실행될 때, StreamingAssets에 포함된 데이터를 읽어서 각 플레이어의 persistentDataPath에 복사합니다.
- 이후에는 persistentDataPath에 있는 데이터를 사용하여 게임 데이터를 읽거나 저장합니다.
예제 코드: StreamingAssets에서 persistentDataPath로 복사
아래 코드는 초기 데이터를 복사하는 작업을 수행합니다.
using System.IO;
using UnityEngine;
public class DataInitializer : MonoBehaviour
{
void Start()
{
string fileName = "data.json"; // JSON 파일 이름
string persistentDataFilePath = Path.Combine(Application.persistentDataPath, fileName);
string streamingDataFilePath = Path.Combine(Application.streamingAssetsPath, fileName);
// persistentDataPath에 파일이 없을 경우 복사
if (!File.Exists(persistentDataFilePath))
{
// Android 플랫폼에서는 StreamingAssets의 파일 접근이 조금 다름
if (Application.platform == RuntimePlatform.Android)
{
// WWW 또는 UnityWebRequest 사용
StartCoroutine(CopyFromStreamingAssetsAndroid(streamingDataFilePath, persistentDataFilePath));
}
else
{
// PC, iOS 등에서는 직접 복사
File.Copy(streamingDataFilePath, persistentDataFilePath);
Debug.Log($"Data copied to persistentDataPath: {persistentDataFilePath}");
}
}
}
// Android 플랫폼용 복사 (StreamingAssets는 특별 처리 필요)
private IEnumerator CopyFromStreamingAssetsAndroid(string sourcePath, string destinationPath)
{
using (UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.Get(sourcePath))
{
yield return request.SendWebRequest();
if (request.result == UnityEngine.Networking.UnityWebRequest.Result.Success)
{
File.WriteAllBytes(destinationPath, request.downloadHandler.data);
Debug.Log($"Data copied to persistentDataPath: {destinationPath}");
}
else
{
Debug.LogError($"Failed to copy data: {request.error}");
}
}
}
}
장점
- StreamingAssets는 배포 시 초기 데이터를 포함하기에 적합합니다.
- persistentDataPath는 사용자별 데이터를 저장하는 데 사용되므로, 플레이어가 데이터를 수정하거나 게임 진행 상황을 저장할 수 있습니다.
플랫폼별 경로
- persistentDataPath는 사용자별 로컬 저장소에 위치합니다:
- Windows: C:/Users/<사용자>/AppData/LocalLow/<회사명>/<게임명>
- Android: /data/data/<패키지 이름>/files
- iOS: Application/<App_Bundle_ID>/Documents
- StreamingAssets는 읽기 전용이며 플랫폼마다 경로 접근 방식이 다릅니다:
- PC: 빌드된 게임 디렉터리 내 포함
- Android: APK 파일 내부 (직접 액세스 불가능, WebRequest 필요)
- iOS: 앱 번들 내부
주의할 점
- StreamingAssets는 읽기 전용이므로, 실행 중 데이터를 수정하려면 반드시 persistentDataPath로 복사해야 합니다.
- Android에서는 StreamingAssets의 파일을 다룰 때 특별 처리가 필요하니, UnityWebRequest를 사용하는 것이 좋습니다.
'Technology > Computer' 카테고리의 다른 글
Unity SO(ScriptableObject) (2) | 2024.12.26 |
---|---|
유니티 : 씬을 옮겨도 UI가 없어지지 않게 하는법 (2) | 2024.12.24 |
Unity에서 SO와 JSON의 동시 활용 (퀘스트 만들때) (1) | 2024.12.23 |
unity에서 SO(ScriptableObject), 데이터 관리 및 모듈 (2) | 2024.12.21 |
unity 플랫폼마다 persistentDataPath 위치가 다르다 (1) | 2024.12.05 |