วิธีที่เหมาะในการเก็บตัวแปรระหว่างฉากคือผ่านคลาสผู้จัดการเดี่ยว ด้วยการสร้างคลาสเพื่อเก็บข้อมูลถาวรและการตั้งค่าคลาสDoNotDestroyOnLoad()
นั้นเป็นคุณสามารถมั่นใจได้ว่าสามารถเข้าถึงได้ทันทีและยังคงอยู่ระหว่างฉาก
ตัวเลือกอื่นที่คุณมีคือใช้PlayerPrefs
คลาส PlayerPrefs
ถูกออกแบบมาเพื่อช่วยให้คุณสามารถบันทึกข้อมูลระหว่างการประชุมเล่นแต่มันจะยังคงเป็นวิธีการบันทึกข้อมูลระหว่างฉาก
ใช้คลาสเดี่ยวและ DoNotDestroyOnLoad()
สคริปต์ต่อไปนี้สร้างคลาส singleton แบบถาวร คลาส singleton เป็นคลาสที่ออกแบบมาเพื่อรันเพียงอินสแตนซ์เดียวในเวลาเดียวกัน โดยการให้ฟังก์ชั่นดังกล่าวเราสามารถสร้างการอ้างอิงตนเองแบบคงที่เพื่อเข้าถึงชั้นเรียนได้จากทุกที่ ซึ่งหมายความว่าคุณสามารถเข้าถึงชั้นเรียนได้โดยตรง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
คลาส
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
สคริปต์ที่จะช่วยให้การสนับสนุนสำหรับความหลากหลายมากขึ้นของประเภทเช่นเวกเตอร์และอาร์เรย์