본문 바로가기
Technology/Computer

UNITY 게임 빌드에는 persistentdatapath가 포함되지 않으므로 streamingAssets 폴더에 넣어서 배포시 복제하도록 해야한다

by re-moon 2024. 12. 24.

 

 

 

 

 

 

 

 

 

Unity에서 Application.persistentDataPath에 저장된 데이터는 빌드 과정에서 포함되지 않습니다. persistentDataPath는 게임이 실행된 후 플레이어의 로컬 장치에 데이터를 저장하거나 로드하는 데 사용됩니다. 이는 주로 저장 데이터, 설정 파일, 다운로드한 콘텐츠 등 런타임에 생성되거나 수정될 수 있는 데이터를 저장하기 위한 디렉터리입니다.

중요한 점:

  • persistentDataPath는 읽기-쓰기 가능한 디렉터리입니다.
  • 게임 빌드에는 포함되지 않지만, 게임 실행 중 이 경로를 통해 데이터를 읽고 쓸 수 있습니다.
  • 빌드 과정에서 포함하려는 데이터는 Resources 폴더 또는 StreamingAssets 폴더에 넣어야 합니다.

추천 방법:

만약 persistentDataPath에 기본 데이터를 제공하고 싶다면:

  1. 데이터를 StreamingAssets 폴더에 포함하여 빌드에 포함하세요.
  2. 게임 실행 시 처음 로드할 때, 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로 복사하는 방식이 일반적입니다. 이는 초기 데이터를 제공하면서도 사용자가 데이터를 수정하거나 저장할 수 있도록 하는 방법입니다.

배포 시 데이터 처리 과정

  1. StreamingAssets에 JSON 파일 추가:
    • 프로젝트의 Assets/StreamingAssets 폴더에 JSON 파일(예: data.json)을 추가합니다.
    • 이 폴더에 있는 파일은 빌드 과정에서 게임 패키지에 포함됩니다.
    • StreamingAssets는 읽기 전용입니다(플랫폼에 따라 경로 액세스 방법이 조금 다를 수 있음).
  2. 게임 실행 시 복사:
    • 게임이 실행될 때, 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를 사용하는 것이 좋습니다.