ขั้นตอนตามมาโดยโปรแกรมเมอร์เกมสำหรับการบันทึกและกลับสู่สถานะของเกมคืออะไร? ชอบไฟล์ / การแมป ฉันต้องการบันทึกไว้สำหรับเกมป้องกันหอคอยและฉันใช้เอ็นจิ้นเกม unity3D
ขั้นตอนตามมาโดยโปรแกรมเมอร์เกมสำหรับการบันทึกและกลับสู่สถานะของเกมคืออะไร? ชอบไฟล์ / การแมป ฉันต้องการบันทึกไว้สำหรับเกมป้องกันหอคอยและฉันใช้เอ็นจิ้นเกม unity3D
คำตอบ:
โดยทั่วไปฉันไม่คิดในแง่ของภาพรวมหน่วยความจำ แต่ฉันเพียงแค่ทำรายการของค่าที่ต้องได้รับการบันทึกระหว่างเซสชันและบันทึกค่าเหล่านั้นลงในไฟล์ภายนอก
ขึ้นอยู่กับความต้องการของเกมของคุณแน่นอน แต่โดยปกติฉันจะบันทึกสถานะของระดับปัจจุบัน (เช่นที่ศัตรูทั้งหมดอยู่ที่ใดสุขภาพของพวกเขาคืออะไร) แล้วระดับที่สูงกว่าจะเหมือนกับระดับผู้เล่น เสร็จสิ้นแล้ว
คำตอบนี้เป็น Unity3d ที่เฉพาะเจาะจง
ใน Unity คลาสส่วนใหญ่เป็นแบบอนุกรมซึ่งหมายความว่าคุณสามารถสตรีมวัตถุ Unity ที่สมบูรณ์ไปยังดิสก์ได้ follwing UnityScript-Code เป็นวิธีการทำให้เป็นอันดับวัตถุ, บันทึกลงดิสก์โหลดอีกครั้ง (หลังจากโหลดคุณต้องโยนวัตถุ):
import System;
import System.IO;
import System.IO.Stream;
import System.Runtime.Serialization;
import System.Runtime.Serialization.Formatters.Binary;
class SaveLoad {
public static function SaveFile(filename:String, obj:Object):void {
try {
Debug.Log("Writing Stream to Disk.", SaveLoad);
var fileStream:Stream = File.Open(filename, FileMode.Create);
var formatter:BinaryFormatter = new BinaryFormatter();
formatter.Serialize(fileStream, obj);
fileStream.Close();
} catch(e:Exception) {
Debug.LogWarning("Save.SaveFile(): Failed to serialize object to a file " + filename + " (Reason: " + e.ToString() + ")");
}
}
public static function LoadFile(filename:String):Object {
try {
Debug.Log("Reading Stream from Disk.", SaveLoad);
var fileStream:Stream = File.Open(filename, FileMode.Open, FileAccess.Read);
var formatter:BinaryFormatter = new BinaryFormatter();
var obj:Object= formatter.Deserialize(fileStream);
fileStream.Close();
return obj;
} catch(e:Exception) {
Debug.LogWarning("SaveLoad.LoadFile(): Failed to deserialize a file " + filename + " (Reason: " + e.ToString() + ")");
return null;
}
}
}
สำหรับ TD ฉันอาจจะประหยัดเฉพาะระหว่างคลื่น วิธีที่คุณจะต้องคิดก็คือหอคอย ใส่จุดบันทึกอัตโนมัติบางอย่างไว้ในระดับไม่เกิน 10 นาที แต่น่าจะน้อยกว่า
แน่นอนว่าถ้าระดับของคุณสั้นพอคุณก็ไม่สามารถบันทึกอะไรได้นอกจากสถานะของแคมเปญ
เมื่อฉันอ้างถึงสถานะปัจจุบันของเกมฉันหมายถึงภาพรวมหน่วยความจำในขณะที่บันทึก คุณต้องสามารถสร้างข้อมูลนั้นจากข้อมูลที่คุณจะเก็บไว้ใน HDD ได้
มันเป็นวิธีที่ง่ายที่สุดเพียงแค่จัดลำดับคลาสของคุณทั้งหมดที่มีข้อมูลที่ต้องคงอยู่และถ่ายโอนข้อมูลไปยัง HDD โดยจะทำการถ่ายโอนข้อมูลหน่วยความจำ ปัญหาเกี่ยวกับสิ่งนี้คือการแก้ไขคลาสของคุณจะเปลี่ยนจำนวน / ประเภทของค่าที่เป็นอนุกรมและแบ่งการบันทึกเก่า นอกจากนี้เนื่องจากคุณบันทึกทุกอย่างมันจะเพิ่มเวลาในการโหลด มันมีประสิทธิภาพมากกว่าในการทำเครื่องหมายฟิลด์แต่ละฟิลด์ที่จำเป็นต้องใช้เพื่อสร้าง "สแนปช็อตหน่วยความจำ" ปัจจุบันด้วยระบบแอตทริบิวต์อะไรก็ตามที่ serializer / IDE ของคุณใช้ จากนั้นสร้าง "ภาพรวมหน่วยความจำ" จากข้อมูลที่บันทึกไว้
นอกจากนี้ฉันไม่เคยใช้ Unity มาก่อนดังนั้นอาจมีบางอย่างในตัวอย่างไรก็ตามนี่เป็นวิธีการทั่วไป