장면 사이에 변수를 저장하는 이상적인 방법은 싱글 톤 관리자 클래스를 이용하는 것입니다. 영구 데이터를 저장할 클래스를 만들고 해당 클래스를로 설정 DoNotDestroyOnLoad()
하면 즉시 액세스 할 수 있고 장면간에 지속될 수 있습니다.
또 다른 옵션은 PlayerPrefs
클래스 를 사용하는 것 입니다. 재생 세션간에PlayerPrefs
데이터를 저장할 수 있도록 설계 되었지만 장면간에 데이터를 저장하는 수단으로 사용됩니다 .
싱글 톤 클래스를 사용하여 DoNotDestroyOnLoad()
다음 스크립트는 영구 싱글 톤 클래스를 만듭니다. 싱글 톤 클래스는 동시에 단일 인스턴스 만 실행하도록 설계된 클래스입니다. 이러한 기능을 제공함으로써 정적 자체 참조를 안전하게 생성하여 어디서나 클래스에 액세스 할 수 있습니다. 따라서 클래스 DataManager.instance
내부의 모든 공용 변수를 포함 하여을 사용하여 클래스에 직접 액세스 할 수 있습니다 .
using UnityEngine;
/// <summary>Manages data for persistance between levels.</summary>
public class DataManager : MonoBehaviour
{
/// <summary>Static reference to the instance of our DataManager</summary>
public static DataManager instance;
/// <summary>The player's current score.</summary>
public int score;
/// <summary>The player's remaining health.</summary>
public int health;
/// <summary>The player's remaining lives.</summary>
public int lives;
/// <summary>Awake is called when the script instance is being loaded.</summary>
void Awake()
{
// If the instance reference has not been set, yet,
if (instance == null)
{
// Set this instance as the instance reference.
instance = this;
}
else if(instance != this)
{
// If the instance reference has already been set, and this is not the
// the instance reference, destroy this game object.
Destroy(gameObject);
}
// Do not destroy this object, when we load a new scene.
DontDestroyOnLoad(gameObject);
}
}
아래에서 싱글 톤이 작동하는 것을 볼 수 있습니다. 초기 장면을 실행하자마자 DataManager 객체는 계층 뷰에서 장면 특정 제목에서 "DontDestroyOnLoad"제목으로 이동합니다.
PlayerPrefs
수업 사용
Unity에는라는 기본 영구 데이터를 관리하기위한 클래스가 내장되어PlayerPrefs
있습니다. PlayerPrefs
파일에 커밋 된 모든 데이터 는 게임 세션 동안 지속 되므로 자연스럽게 장면 전체에서 데이터를 유지할 수 있습니다.
PlayerPrefs
파일 유형의 변수를 저장할 수 string
, int
과 float
. PlayerPrefs
파일에 값을 삽입 string
하면 키로 추가 값을 제공합니다 . 동일한 키를 사용하여 나중에 PlayerPref
파일 에서 값을 검색 합니다.
using UnityEngine;
/// <summary>Manages data for persistance between play sessions.</summary>
public class SaveManager : MonoBehaviour
{
/// <summary>The player's name.</summary>
public string playerName = "";
/// <summary>The player's score.</summary>
public int playerScore = 0;
/// <summary>The player's health value.</summary>
public float playerHealth = 0f;
/// <summary>Static record of the key for saving and loading playerName.</summary>
private static string playerNameKey = "PLAYER_NAME";
/// <summary>Static record of the key for saving and loading playerScore.</summary>
private static string playerScoreKey = "PLAYER_SCORE";
/// <summary>Static record of the key for saving and loading playerHealth.</summary>
private static string playerHealthKey = "PLAYER_HEALTH";
/// <summary>Saves playerName, playerScore and
/// playerHealth to the PlayerPrefs file.</summary>
public void Save()
{
// Set the values to the PlayerPrefs file using their corresponding keys.
PlayerPrefs.SetString(playerNameKey, playerName);
PlayerPrefs.SetInt(playerScoreKey, playerScore);
PlayerPrefs.SetFloat(playerHealthKey, playerHealth);
// Manually save the PlayerPrefs file to disk, in case we experience a crash
PlayerPrefs.Save();
}
/// <summary>Saves playerName, playerScore and playerHealth
// from the PlayerPrefs file.</summary>
public void Load()
{
// If the PlayerPrefs file currently has a value registered to the playerNameKey,
if (PlayerPrefs.HasKey(playerNameKey))
{
// load playerName from the PlayerPrefs file.
playerName = PlayerPrefs.GetString(playerNameKey);
}
// If the PlayerPrefs file currently has a value registered to the playerScoreKey,
if (PlayerPrefs.HasKey(playerScoreKey))
{
// load playerScore from the PlayerPrefs file.
playerScore = PlayerPrefs.GetInt(playerScoreKey);
}
// If the PlayerPrefs file currently has a value registered to the playerHealthKey,
if (PlayerPrefs.HasKey(playerHealthKey))
{
// load playerHealth from the PlayerPrefs file.
playerHealth = PlayerPrefs.GetFloat(playerHealthKey);
}
}
/// <summary>Deletes all values from the PlayerPrefs file.</summary>
public void Delete()
{
// Delete all values from the PlayerPrefs file.
PlayerPrefs.DeleteAll();
}
}
PlayerPrefs
파일을 처리 할 때 추가 예방 조치를 취 합니다.
- 각 키를로 저장했습니다
private static string
. 이를 통해 항상 올바른 키를 사용하고 있음을 보장 할 수 있으며 어떤 이유로 든 키를 변경해야하는 경우 키에 대한 모든 참조를 변경할 필요가 없습니다.
PlayerPrefs
파일을 쓴 후 디스크에 파일을 저장합니다 . 재생 세션에서 데이터 지속성을 구현하지 않으면 차이가 없습니다. PlayerPrefs
것입니다 일반 응용 프로그램을 닫습니다 동안 디스크에 저장하지만, 게임이 충돌하는 경우는 자연적으로 호출 할 수 있습니다.
- 실제로 관련 키 를 검색하기 전에 각 키 가 에 있는지 확인 합니다. 이것은 무의미한 이중 검사처럼 보일 수 있지만 가지고있는 것이 좋습니다.
PlayerPrefs
- 나는이
Delete
즉시 닦아 방법 PlayerPrefs
파일을. 재생 세션에서 데이터 지속성을 포함하지 않으려면에서이 메소드를 호출하는 것을 고려할 수 있습니다 Awake
. 청산하여 PlayerPrefs
각 게임의 시작 파일을, 당신은 어떤 데이터가 있는지 확인 않았다 이전 세션에서 계속 실수로 데이터로 처리되지 않은 현재의 세션.
PlayerPrefs
아래에서 실제로 볼 수 있습니다 . "데이터 저장"을 클릭하면 Save
메서드를 직접 호출하고 "데이터로드"를 클릭하면 Load
메서드를 직접 호출합니다 . 구현 방법은 다를 수 있지만 기본 사항을 보여줍니다.
마지막으로, PlayerPrefs
더 유용한 유형을 저장하기 위해 기본을 확장 할 수 있음을 지적해야합니다 . JPTheK9 는PlayerPrefs
파일에 저장 될 배열을 문자열 형식으로 직렬화하는 스크립트를 제공 하는 유사한 질문에 대한 좋은 답변을 제공 합니다. 그들은 또한 우리를 가리 킵니다 의 Unify 커뮤니티 위키 , 사용자가보다 넓은 업로드 PlayerPrefsX
스크립트를 같은 벡터와 배열과 같은 유형의 큰 다양한 지원을 허용 할 수 있습니다.