आप गेम स्टेट कैसे बचाते हैं?


27

गेम प्रोग्रामर द्वारा खेल राज्य को बचाने और फिर से शुरू करने के लिए प्रक्रिया क्या है? फ़ाइलें / मैपिंग की तरह। मैं इसे टॉवर डिफेंस गेम के लिए बचाना चाहता हूं और मैं एकता 3 डी गेम इंजन का उपयोग कर रहा हूं।

जवाबों:


16

मैं आमतौर पर एक मेमोरी स्नैपशॉट के संदर्भ में नहीं सोचता, बल्कि मैं सिर्फ एक सूची बनाता हूं कि किन मूल्यों को सत्रों के बीच सहेजने की जरूरत है और उन मूल्यों को एक बाहरी फ़ाइल में सहेजें।

यह आपके विशिष्ट खेल की जरूरतों पर निश्चित रूप से निर्भर करता है, लेकिन आमतौर पर मैं बस वर्तमान स्तर की स्थिति को बचाता हूं (यानी जहां सभी दुश्मन हैं, उनका स्वास्थ्य क्या है, आदि) और फिर उच्च स्तर का सामान जैसे खिलाड़ी किस स्तर का है। पहले ही पूरा कर लिया है।


3
+1 यह है कि मैं इसे कैसे करता हूं। मैं लिखता हूं कि मुझे बाइनरी फ़ाइल की क्या आवश्यकता है। और, अगर मुझे कुछ नया जोड़ने की आवश्यकता है, तो मैं इसे अंत तक जोड़ता हूं, इसलिए मैं पुरानी सहेजें फ़ाइलों को नहीं तोड़ता।
अराजकतावादी 18

पुरानी सहेजने वाली फ़ाइलों को न तोड़ने के बारे में यह एक अच्छी टिप है, हालांकि अंत में डेटा जोड़ना मेरे डेटा को सहेजने के लिए अप्रासंगिक है। मैं किसी धारावाहिक को क्रमबद्ध / डिसेर्बलाइज़ करके करता हूं, और आदेश उस डेटा संरचना में अप्रासंगिक है।
झॉकिंग

(मूल रूप से, जोनास के उत्तर में कोड, मेरी वस्तु एक शब्दकोश होने के साथ)
14

10

यह उत्तर यूनिटी 3 डी विशिष्ट है
एकता में, अधिकांश कक्षाएं क्रमबद्ध हैं, इसका मतलब है कि आप डिस्क में पूर्ण एकता वस्तुओं को स्ट्रीम करने में सक्षम हैं। 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;
                }       
        }
}

2
C # का उपयोग करने के अलावा, आप PlayerPrefs का भी उपयोग करना चाहेंगे। वे क्रॉस प्लेटफॉर्म हैं, आप वेब / iOS / Android पर IO नहीं कर सकते। unity3d.com/support/documentation/ScriptReference/… (हालांकि अच्छा नमूना!)
TJHeuvel

प्लेयरप्रैफ़्स कम लचीले हैं, वे वास्तव में क्रॉस प्लेटफॉर्म हैं और वे एकल या असंबंधित मूल्यों को संग्रहीत करने के लिए एकदम सही हैं। लेकिन Windows PlayerPrefs पर रजिस्ट्री, प्लेनटेक्स्ट में संग्रहित किया जाता है।
जोनास

7
यदि आप पहले से ही धारावाहिक कर रहे हैं, तो इसे एक स्ट्रिंग में क्रमबद्ध क्यों न करें और इसे PlayerPrefs में संग्रहीत करें। यकीन है कि यह कम लचीला है, लेकिन इसकी बहुत ज्यादा एक crossplatform खेल के लिए एकमात्र समाधान है।
TJHeuvel

2
PlayerPrefs सेटिंग्स की तरह छोटे डेटा को संग्रहीत करने के लिए बहुत अच्छा है, लेकिन पूरे savegames के लिए आपको Application.persistentDataPath docs.unity3d.com/ScriptReference/…
झूमना

2
@TJHeuvel: "आप वेब / iOS / Android पर IO नहीं कर सकते हैं" आप सबसे निश्चित रूप से मोबाइल पर IO कर सकते हैं
Przemysław Wrzesiński

2

टीडी के लिए मैं शायद लहरों के बीच विशेष रूप से बचा सकता हूं। इस तरह आप सभी को सोचना होगा कि यह टावर है। कुछ स्वचालित सहेजने के बिंदुओं को स्तरों में रखें, बीच में 10 मिनट से अधिक नहीं, लेकिन कम शायद बेहतर है।

बेशक यदि आपके स्तर काफी कम हैं तो आप अभियान की स्थिति के अलावा कुछ भी नहीं बचा सकते हैं।


1

जब मैं खेल की वर्तमान स्थिति का उल्लेख करता हूं तो मैं बचत के क्षण में मेमोरी स्नैपशॉट का उल्लेख कर रहा हूं। आपको उस डेटा को फिर से बनाने में सक्षम होना चाहिए, जिसे आप एचडीडी पर स्टोर करने जा रहे हैं।

यह आसान है कि आप सभी कक्षाओं को क्रमबद्ध करें जिसमें डेटा है जो लगातार होना चाहिए और इसे एचडीडी को डंप करना होगा, अनिवार्य रूप से एक मेमोरी डंप का प्रदर्शन करना होगा। इसके साथ समस्या यह है कि आपको कक्षाओं में फेरबदल करने से क्रमबद्ध मानों की संख्या / प्रकार बदल जाएंगे और पुरानी बचतें टूट जाएंगी। क्योंकि आप लोड हो रहा है समय बढ़ जाती है सब कुछ बचा रहे हैं। व्यक्तिगत रूप से उन क्षेत्रों को चिह्नित करने के लिए इसका अधिक कुशल है जो वास्तव में वर्तमान "मेमोरी स्नैपशॉट" को फिर से बनाने के लिए आवश्यक हैं, जो भी आपके सिस्टम द्वारा उपयोग किए जाने वाले विशेषता / आईडीई का उपयोग करता है। फिर उस सहेजे गए डेटा से "मेमोरी स्नैपशॉट" का पुनर्निर्माण करें।

इसके अलावा, मैंने पहले कभी एकता का उपयोग नहीं किया है, इसलिए इसमें कुछ निर्मित हो सकता है। हालांकि, यह विशिष्ट दृष्टिकोण है।


मेरा मतलब है कि मुझे अपने राज्यों को एक फाइल में स्टोर करना है?
सैयद

1
@ हाँ, हाँ, दिन के अंत में इसे किसी तरह की फ़ाइल में लिखना होगा क्योंकि ऐप स्टेट मेमोरी में सेव नहीं होने वाला है। एकता के साथ विशेष रूप से आप प्लेयरप्रिफ़ क्लास का उपयोग कर सकते हैं (जो मुझे लगता है कि वास्तव में विंडोज पर रजिस्ट्री में चीजों को संग्रहीत करता है) यदि आप पूरी फाइल पढ़ने / लिखने के सामान से बचना चाहते हैं।
तेतराड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.