persistentDataPath로 지정된 Unity의 권장 폴더 경로에 데이터를 씁니다.

페이지 업데이트 :
페이지 생성 날짜 :

검증 환경

윈도우
  • 윈도우 11
Unity 에디터
  • 2021.3.3f1
입력 시스템 패키지
  • 1.3.0

이 팁의 전제 조건

이 팁에 대한 설명의 전제로 다음 설정이 미리 이루어졌습니다.

처음에

이전 팁PlayerPrefs에서는 데이터를 저장하고로드하는 방법을 사용했습니다. 그러나 이것은 대용량 데이터 처리 및 데이터 공유의 관점에서 사용하기에 적합하지 않습니다.

이번에는 로컬 폴더 디렉토리에 데이터를 저장하고 로드합니다. 기본적으로 쓰기 위치를 자유롭게 지정할 수 있지만 Unity에서 지정한 persistentDataPath 것을 사용하는 것이 더 유리하므로 이번에는 이것을 사용합니다.

UI 배치 및 처리

이를 위해 이전 팁 "PlayerPrefs를 사용하여 데이터 읽기 및 쓰기"를 그대로 사용하므로 그것을 참고해, 버튼 처리를 할 수 있는 지점까지 구현해 주세요.

덧붙여서, 이번에 사용하는 persistentDataPath 값을 표시하는 장소도 배치합니다.

파일을 저장할 폴더 경로가 어디에 있는지 확인하십시오.

이번에 Application.persistentDataPath 사용할 데이터의 폴더 경로를 에서 가져올 수 있습니다. 먼저 위치가 어디에 있는지 보여 드리겠습니다.

Start 텍스트 필드에 값을 표시하는 메서드를 만들어 보겠습니다.

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonEvent : MonoBehaviour
{
  // 省略

  /// <summary>パステキスト。</summary>
  [SerializeField] Text TextPath;


  /// <summary>最初に一度だけ呼ばれます。</summary>
  private void Start()
  {
    TextPath.text = Application.persistentDataPath;
  }

  // 省略
}

실행하면 밑면에 경로가 표시되어야 합니다.

이번에는 Windows에서 실행 중이므로 경로는 다음과 같습니다. 경로의 내용은 실행 중인 사용자와 프로젝트 설정의 "CompanyName" 또는 "ProductName"에 따라 변경될 수 있습니다. 게임을 만들 때 게임이 출시되기 전에 "CompanyName"과 "ProductName"을 결정하고 나중에 변경하지 마십시오.

이 경로는 실행 중인 플랫폼에 따라 다릅니다. 아래는 공식 웹 사이트에 나열된 경로입니다. Unity 버전에 따라 달라질 수 있으니 꼭 실행해서 확인해 보세요.

값을 저장합니다

대상 경로를 결정하기만 하면 .NET 표준 라이브러리에서 데이터 쓰기 및 읽기를 처리할 수 있습니다. 이번에는 데이터를 하나의 클래스로 결합하고 JSON으로 문자열을 작성하고 문자열을 대량으로 작성합니다.

using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class ButtonEvent : MonoBehaviour
{
  // 省略

  /// <summary>セーブデータ。</summary>
  public class SaveData
  {
    public string Name;
    public string HP;
    public string Attack;
    public string Money;
  }

  /// <summary>
  /// 保存ボタンをクリックしたときの処理。
  /// </summary>
  public void OnClickSave()
  {
    // 保存するデータを作成
    var data = new SaveData()
    {
      Name = InputFieldName.text,
      HP = InputFieldHP.text,
      Attack = InputFieldAttack.text,
      Money = InputFieldMoney.text,
    };

    // オブジェクトを JSON 文字列にシリアライズ
    var json = JsonUtility.ToJson(data);

    // 所定の場所にテキストファイルとして保存
    File.WriteAllText(Path.Combine(Application.persistentDataPath, "SaveData.txt"), json);

    Debug.Log("保存しました。");
  }

  // 省略
}

이전 팁의 내용은 .NET Standard 라이브러리에서 지원하므로 특별히 어려운 것은 없다고 생각합니다. 먼저 실행하고 저장해 보겠습니다.

경로 위치를 보면 파일이 저장된 것을 볼 수 있습니다.

텍스트 파일을 열면 입력이 JSON 형식으로 저장된 것을 볼 수 있습니다.

이번에는StreamWriter 파일을 쉽게 쓸 수 File 있도록 클래스를 사용하고 있지만 와 같은 다른 클래스를 사용하면 문제가 없습니다.

저장된 값 가져오기

읽는 것도 어렵지 않다고 생각합니다.

/// <summary>
/// 読み込みボタンをクリックしたときの処理。
/// </summary>
public void OnClickLoad()
{
  // 保存されているテキストファイルを読み込む
  var json = File.ReadAllText(Path.Combine(Application.persistentDataPath, "SaveData.txt"));

  // JSON テキストから指定したオブジェクトにデシリアライズ
  var data = JsonUtility.FromJson<SaveData>(json);

  // 読み込んだ値を各フィールドにセット
  InputFieldName.text = data.Name;
  InputFieldHP.text = data.HP;
  InputFieldAttack.text = data.Attack;
  InputFieldMoney.text = data.Money;

  Debug.Log("読み込みました。");
}

저장된 텍스트를 읽고 복원 메서드로 JsonUtility.FromJson JSON 문자열을 역직렬화할 수 있습니다.

게임을 실행하고 Load from empty 버튼을 클릭하여 입력 필드가 채워지는지 확인합니다.

요약

Application.persistentDataPath 를 사용하여 지정된 위치에 데이터를 읽고 쓸 수있었습니다. 파일로 저장할 수 있기 때문에 대용량 데이터를 저장할 수도 있습니다. 그러나 이 폴더 경로에 저장된 데이터는 여러 환경에서 동기화될 수 있으므로 이 경우 큰 파일을 저장할지 아니면 다른 위치에 저장할지를 고려해야 합니다.