บันทึกความคืบหน้าของผู้เล่นในเกม Unity


22

ฉันสร้างเกมโดยใช้เอ็นจิ้นเกม Unity ฉันต้องการบันทึกความคืบหน้าของผู้เล่นรวมถึงระดับคะแนนประสบการณ์ตัวละครที่เลือก ฯลฯ ปัจจุบันฉันใช้playerprefsแต่ฉันต้องการทราบว่าจะใช้งานได้กับเกมที่จะเล่นเกมนี้บนอุปกรณ์มือถือ (Android / iOS) หรือไม่ เป็นเดสก์ท็อป (OSX / พีซี) ถ้าไม่เช่นนั้นฉันควรบันทึกข้อมูลนี้อย่างไร ฉันต้องการบันทึกความคืบหน้าของผู้เล่นโดยอัตโนมัติหลังจากล้างแต่ละด่าน

คำตอบ:


30

PlayerPrefs จะใช้งานข้ามแพลตฟอร์มได้ แต่ไม่แนะนำสำหรับความคืบหน้าในการเล่นเกมบันทึกไฟล์เพราะมันไม่ปลอดภัย ในฐานะที่เป็นไฟล์ธรรมดาผู้เล่นสามารถเปิดมันได้อย่างง่ายดายและเปลี่ยนเนื้อหาเพื่อโกงหรือทำให้เกมของคุณมีพฤติกรรมที่คาดเดาไม่ได้ มันยังไม่รับประกันว่าจะอยู่รอบ ๆ

PlayerPrefsมีไว้สำหรับข้อมูลการตั้งค่าที่ไม่จำเป็นเช่นการแมปการควบคุมหรือการตั้งค่าเพลง / sfx - สิ่งที่ผู้เล่นสามารถเปลี่ยนได้อย่างอิสระและจะไม่พลาดอย่างมากหากพวกเขา (บน Windows เป็นต้น) ใช้จุดคืนค่าระบบ ข้อมูลรีจิสทรีบางส่วน หากสิ่งนี้สูญเสียคะแนนสูงหรือความก้าวหน้าของแคมเปญผู้เล่นจะอารมณ์เสียอย่างไร้เหตุผล!

แต่ขอแนะนำให้บันทึกความคืบหน้าของการเล่นเกมในไฟล์ของคุณ (โดยทั่วไปจะเป็นแบบไบนารี่อาจเข้ารหัสหรือเซ็นชื่อหากคุณต้องการแก้ไขให้ยากขึ้น แต่เห็นความคิดเห็นของฟิลิปป์ด้านล่างนี้)

คุณสามารถใช้Application.persistentDataPathเพื่อรับตำแหน่งการบันทึกที่เชื่อถือได้ในแต่ละแพลตฟอร์ม โดยทั่วไปจะอยู่ในโฟลเดอร์ข้อมูลผู้ใช้ที่จะไม่ถูกลบออกในกรณีเช่นตัวอย่างด้านบน

เมื่อคุณมีเส้นทางที่จะบันทึกคุณสามารถใช้วิธีการ C # IO ปกติเพื่อสร้างเขียนและอ่านไฟล์ของคุณ รายละเอียดจะแตกต่างกันมากขึ้นอยู่กับรูปแบบและโครงสร้างไฟล์บันทึกของคุณดังนั้นหากคุณประสบปัญหาคุณควรถามคำถามใหม่เกี่ยวกับรายละเอียดสิ่งที่คุณพยายามทำและตำแหน่งที่คุณติดขัด


30
ในความคิดของฉันการเข้ารหัสและเซ็นชื่อไฟล์ savegame ของคุณเป็นเพียงแค่อึ มันไม่ปลอดภัยเพราะคุณต้องเก็บกุญแจและอัลกอริธึมในปฏิบัติการของเกมที่แฮ็กเกอร์ผู้ชำนาญสามารถเข้าถึงได้ มันไร้ประโยชน์เช่นกัน เมื่อเป็นเกมเล่นคนเดียว: ทำไมต้องรำคาญ? ให้ผู้เล่นสนุกกับเกมในแบบที่พวกเขาต้องการ เมื่อเป็นเกมที่มีผู้เล่นหลายคนคุณควรบันทึกทุกอย่างบนเซิร์ฟเวอร์ที่ปลอดภัยจากการยักย้ายถ่ายเท
ฟิลิปป์

5
@ SamedTarıkÇETİNมีความแตกต่างที่สำคัญระหว่างเส้นทางข้อมูล (ตำแหน่งที่ติดตั้งเกมของคุณ) และเส้นทางข้อมูลถาวร (ตำแหน่งที่เชื่อถือได้เพื่อบันทึกข้อมูลใหม่) ในบางแพลตฟอร์มเกมที่สร้างขึ้นไม่สามารถเขียนไปยังพา ธ ข้อมูลที่ติดตั้งดังนั้นแนะนำให้บันทึกในตำแหน่งพา ธ ข้อมูลถาวรเป็นกฎทั่วไป
DMGregory

2
แม้ว่าฉันจะเห็นด้วยกับ @Philipp ว่าการจัดเก็บข้อมูลฝั่งไคลเอ็นต์นั้นไม่เคยปลอดภัยอย่างแท้จริงและในหลาย ๆ กรณีเราไม่จำเป็นต้องกังวลเกี่ยวกับการรักษาความปลอดภัยของเกมผู้เล่นเดี่ยวจำนวนความปลอดภัยหรือความสับสนที่จะนำไปใช้ ผู้สร้างแต่ละคนจะต้องทำเพื่อตัวเอง ด้วยคำตอบนี้ฉันเพียงต้องการให้ข้อมูลแก่ผู้ถามเพื่อให้ทางเลือกที่มีข้อมูลเกี่ยวกับสิ่งที่เหมาะสมสำหรับเกมของพวกเขา
DMGregory

1
ในอีกด้านหนึ่งฉันเห็นด้วยกับ @Philipp แต่ฉันเคยเห็น / ทำงานกับไฟล์บันทึกแบบอนุกรมที่อ่านไม่ออกอย่างสมบูรณ์เพื่อทำงานกับในเท็กซ์เอดิเตอร์ ใช่ฉันอาจจะรู้วิธีที่จะเข้าไปและทำการเปลี่ยนแปลงบางอย่างหรืออื่น ๆ แต่เมื่อไฟล์ดูเหมือนเลขฐานสิบหกดิบ 2 megs มันจะเป็นงานที่ค่อนข้างน่าเบื่อที่จะคิดออก ในกรณีเช่นนี้ผู้ที่เสียชีวิตส่วนใหญ่จะพยายามแยกชิ้นส่วนและผลลัพธ์จะเฉพาะเจาะจงกับจุดนั้นในเกม (การเพิ่มอีกหนึ่งหน่วยลงในการบันทึกจะเป็นการผลักข้อมูลที่ตามมาทั้งหมด) จากนั้นอีกครั้งมันไม่ได้ตั้งใจที่จะปลอดภัย
Draco18s

2
@ShantanuSingh โดยไม่เก็บไว้ใน PlayerPrefs ข้อมูลประเภทนั้นควรถูกเก็บไว้ในฐานข้อมูลระยะไกลและร้องขอเมื่อเริ่มต้นแอพ เพื่อความเข้ากันได้เมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ตให้ถอยกลับไปยังไฟล์ที่บันทึกไว้ในระบบปลอดภัย (นั่นคือเข้ารหัส) ค่าฐานข้อมูล (ถ้ามี) ควรเขียนทับค่าโลคัล อาจมีปลั๊กอินการซื้อในแอปที่จัดการกับสิ่งต่าง ๆ เช่นกัน แต่อาจเป็น "อินเทอร์เน็ตที่จำเป็น" แฮ็ก (แม้แต่ไฟล์ที่เข้ารหัสไม่ปลอดภัย 100%) หรือเป็นรายละเอียดความคิดเห็นนี้
Draco18s

4

บนไซต์ Unity มีวิดีโอที่ผ่านตัวเลือกหลักสองตัวสำหรับการบันทึก (PlayerPrefs และสร้างไฟล์บันทึกของคุณเอง) วิดีโอสามารถพบได้ที่นี่: http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/persistence-data-saving-loading?playlist=17117


-1

PlayerPrefs เป็นร้าน K / V ที่ออกแบบมาเพื่อ "เพิ่งทำงาน" ไม่ว่าคุณจะสร้างแพลตฟอร์มใด ฉันบอกว่าใช้ต่อไปจนกว่าคุณจะมีเหตุผลที่น่าสนใจไม่ควรทำ


ฉันคิดว่าคำถามนั้นค่อนข้างดีหากมีเหตุผลที่น่าสนใจที่จะไม่ใช้ PlayerPrefs (ใช่มี) เช่นฉันลงคะแนนคำตอบนี้เพราะไม่ตอบคำถาม
ปีเตอร์ - Unban Robert Harvey

-1

ดังนั้นวิธีที่ดีที่สุดคือการประหยัดฝั่งเซิร์ฟเวอร์? แปลงข้อมูลที่ต้องการบันทึกทั้งหมดเป็น json string และเก็บไว้ในเซิร์ฟเวอร์ mysql เป็นข้อมูลสตริงและเมื่อจำเป็นต้องโหลดเชื่อมต่อกับเซิร์ฟเวอร์และกู้คืนข้อมูลหรือไม่


4
นี่ไม่ใช่คำตอบสำหรับคำถาม หากคุณมีคำถามถามเป็นคำถามใหม่
Sourav Paul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.