আপনি গেমের অবস্থা কীভাবে সংরক্ষণ করবেন?


27

গেমের অবস্থা বাঁচাতে এবং পুনরায় চালু করার জন্য গেম প্রোগ্রামারদের অনুসরণকারী পদ্ধতিটি কী? ফাইল / ম্যাপিংয়ের মতো। আমি এটি টাওয়ার ডিফেন্স গেমের জন্য সঞ্চয় করতে চাই এবং আমি ऐकতি 3 ডি গেম ইঞ্জিনটি ব্যবহার করছি।

উত্তর:


16

আমি সাধারণত মেমরির স্ন্যাপশটের বিচারে ভাবি না, বরং আমি কেবল একটি তালিকা তৈরি করি যা সেশনগুলির মধ্যে কোন মানগুলি সংরক্ষণ করতে হবে এবং সেই মানগুলিকে একটি বাহ্যিক ফাইলে সংরক্ষণ করতে হবে।

এটি অবশ্যই আপনার নির্দিষ্ট গেমের প্রয়োজনের উপর নির্ভর করে, তবে সাধারণত আমি কেবলমাত্র বর্তমান স্তরের অবস্থা (যেমন সমস্ত শত্রু যেখানে রয়েছে, তাদের স্বাস্থ্য কী ইত্যাদি) সংরক্ষণ করে এবং তারপরে প্লেয়ারকে কী স্তরের স্তরের মতো উচ্চ স্তরের স্টাফ দেয় ইতিমধ্যে সম্পন্ন হয়েছে।


3
+1 আমি এটি এটি করি। আমার বাইনারি ফাইলের যা দরকার তা লিখি। এবং, যদি আমাকে নতুন কিছু যুক্ত করার প্রয়োজন হয় তবে আমি এটিকে শেষ পর্যন্ত যুক্ত করি যাতে আমি পুরানো সেভ ফাইলগুলি ভাঙ্গি না।
বিশৃঙ্খলাবিদ

পুরানো সেভ ফাইলগুলি না ভাঙার সম্পর্কে এটি একটি ভাল পরামর্শ, যদিও শেষ পর্যন্ত ডেটা যুক্ত করা আমি কীভাবে ডেটা সংরক্ষণ করি তার থেকে অপ্রাসঙ্গিক। আমি একটি অভিধানকে সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন করে এটি করি এবং অর্ডারটি সেই ডেটা কাঠামোর ক্ষেত্রে অপ্রাসঙ্গিক।
27:18

(মূলত,
জোনাসের

10

এই উত্তরটি ইউনিটি 3 ডি নির্দিষ্ট
ইউনিটিতে, বেশিরভাগ ক্লাস সিরিয়ালাইজযোগ্য, এর অর্থ আপনি সম্পূর্ণ ইউনিটি অবজেক্টগুলিকে ডিস্কে স্ট্রিম করতে সক্ষম। ফলউইং ইউনিটিস্ক্রিপ্ট-কোড কোনও বিষয়কে সিরিয়ালাইজ করার একটি উপায়, এটি আবার একটি ডিস্কে এটি সংরক্ষণ করুন (লোড করার পরে আপনাকে অবশ্যই বস্তুটি নিক্ষেপ করতে হবে):

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
সি # ব্যবহারের পাশাপাশি আপনি প্লেয়ারপ্রিফ ব্যবহার করতে চাইবেন। এগুলি ক্রস প্ল্যাটফর্ম, আপনি ওয়েব / আইওএস / অ্যান্ড্রয়েডে আইও করতে পারবেন না। একতা 3d.com/support/docamentation/ScriptReferences/… (যদিও দুর্দান্ত নমুনা!)
টিজেহিউভেল

প্লেয়ারপ্রেসগুলি কম নমনীয়, তারা প্রকৃতপক্ষে ক্রস প্ল্যাটফর্ম এবং এগুলি একক বা সম্পর্কযুক্ত মান সংরক্ষণ করার জন্য উপযুক্ত। তবে উইন্ডোজ প্লেয়ারপ্রেফগুলিতে রেজিস্ট্রি, প্লেটেক্সট এ সংরক্ষণ করা হয়।
জোনাস

7
আপনি যদি ইতিমধ্যে সিরিয়ালাইজ করে থাকেন তবে কেন এটি স্ট্রিংয়ে সিরিয়ালীকরণ করবেন না এবং এটি প্লেয়ারপ্রিসে সংরক্ষণ করবেন না। অবশ্যই এটি কম নমনীয়, তবে এটি ক্রসপ্ল্যাটফর্ম গেমের একমাত্র সমাধান।
টিজেহিউভেল

2
প্লেয়ারপ্রিফস সেটিংসের মতো ছোট ডেটা সঞ্চয় করার জন্য দুর্দান্ত তবে পুরো সেভগেমগুলির
স্ক্রিপ্ট

2
@ টিজেহুভেল: "আপনি ওয়েব / আইওএস / অ্যান্ড্রয়েডে আইও করতে পারবেন না" আপনি অবশ্যই মোবাইলে আইও করতে পারবেন
প্রেজেমেসউ র্রাজেসিস্কি

2

একটি টিডির জন্য আমি সম্ভবত তরঙ্গগুলির মধ্যে একচেটিয়াভাবে সংরক্ষণ করতাম। এইভাবে আপনাকে সমস্ত টাওয়ারগুলি সম্পর্কে ভাবতে হবে। স্তরগুলিতে কিছু স্বয়ংক্রিয় সেভ পয়েন্ট রাখুন, এর মধ্যে 10 মিনিটের বেশি নয়, তবে সম্ভবত কম ভাল।

অবশ্যই যদি আপনার স্তরগুলি পর্যাপ্ত হয় তবে আপনি প্রচারাভিযানের স্থিতি ব্যতীত আর কিছুই বাঁচাতে পারবেন না।


1

আমি যখন গেমের বর্তমান অবস্থা উল্লেখ করি তখন আমি সংরক্ষণের মুহুর্তে মেমরির স্ন্যাপশটটিকে উল্লেখ করছি। আপনি যে ডেটা আপনার উপর সংরক্ষণ করতে যাচ্ছেন তা থেকে আপনাকে এইচডিডি পুনরায় তৈরি করতে সক্ষম হতে হবে।

অবিচ্ছিন্নভাবে মেমরি ডাম্প সঞ্চালন করে এইচডিডি এ ফেলে দিতে হবে এমন ডেটা রয়েছে এমন আপনার সমস্ত শ্রেণীর সিরিয়ালাইজ করা সহজ। এটির সাথে সমস্যা হ'ল আপনার ক্লাসে পরিবর্তনগুলি ক্রমীকৃত মানগুলির সংখ্যা / ধরণের পরিবর্তন করে এবং পুরানো সংরক্ষণগুলি ভেঙে দেয়। এছাড়াও আপনি সমস্ত কিছু সংরক্ষণ করছেন বলে এটি লোডের সময়কে বাড়িয়ে তোলে। স্বতন্ত্র ক্ষেত্রগুলি চিহ্নিত করার জন্য এটি আরও দক্ষ যা আপনার সিরিয়ালাইজার / আইডিই ব্যবহার করে যে কোনও বৈশিষ্ট্য সিস্টেমের সাথে বর্তমান "মেমরি স্ন্যাপশট" পুনর্নির্মাণের জন্য প্রয়োজনীয়। তারপরে সেই সংরক্ষিত ডেটা থেকে "মেমরি স্ন্যাপশট" পুনর্নির্মাণ করুন।

এছাড়াও আমি ইউনিটি এর আগে কখনও ব্যবহার করি নি যাতে এতে অন্তর্নির্মিত কিছু থাকতে পারে However তবে এটি সাধারণ পদ্ধতির।


তুমি কি বোঝাতে চাই যে আমার রাজ্যগুলিকে একটি ফাইলে রাখতে হবে?
সৈয়দ

1
@ হ্যাঁ হ্যাঁ, দিনের শেষে এটিকে কোনও ধরণের একটি ফাইলে লিখতে হবে যেহেতু অ্যাপ স্টেটটি স্মৃতিতে সংরক্ষণ করা যাচ্ছে না। ইউনিটির সাথে বিশেষত আপনি প্লেয়ারপ্রেফ ক্লাসটি ব্যবহার করতে পারেন (যা আমি মনে করি উইন্ডোজে রেজিস্ট্রিগুলিতে আসলে জিনিসগুলি সংরক্ষণ করে) আপনি যদি পুরো ফাইল পড়া / লেখার স্টাফ এড়াতে চান।
টেট্র্যাড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.