در این پست، روش ساده ای برای سیو و لود کردن داده‌ها توی انجین بازی سازی گودو ارائه میدم. برای این کار روشهای مختلفی وجود داره. این روشی که بهتون نشون میدم برای ذخیره یک داده است. یعنی هر تابع ذخیره و لود کردن، یک داده رو ذخیره و لود میکنه و برای سیو و لودهای ساده کاربرد داره. 

آموزش رو در قالب یک پروژه کوچیک انجام میدیم و در آخر فایل پروژه رو براتون میذارم و میتونید دانلود کنید.

با یک پروژه جدید شروع میکنیم. یک صحنه دوبعدی ایجاد میکنیم. در اون صحنه، یک لیبل برای نمایش یک عدد، دوتا دکمه، یکی برای افزایش مقدار عدد و دیگری برای سیو عدد وجود داره. برنامه به این شکل خواهد بود که وقتی عدد رو افزایش میدید و ذخیره میکنید. وقتی که از برنامه خارج بشید و دوباره وارد بشید آخرین عددی که رسیده بودید نمایش داده میشه. در نهایت روشی برای ریست کردن مقدار داده بهتون نشون میدم.

برای اینکه آموزش های پیشرفته تری بتونم بدم، از یه سری کارهای ابتدایی سریع رد میشم. اگه آموزش های قبلی رو ببینید همه این کارها رو یاد خواهید گرفت. 

پروژه ما در ابتدا این شکلی خواهد بود.

همچنین در این پروژه دوتا اسکریپت داریم. یکی که به نود دوبعدی سرشاخه ضمیمه میشه و یکی به نام general که اتولود میشه و توابع سیو و لود و ریست کردن داده اونجا قرار داره. روی دکمه ها متن های لازم رو نوشتم و و لیبل هم همین طور. 

 بخش اتولود که فایل general رو قرار میدیم این شکلی میشه.

لازمه که برای هر دو دکمه، سیگنال pressed  رو به نود سرشاخه وصل کنیم که با این کار داخل اسکریپت node2d، دوتا تابع برای دو دکمه ایجاد میشه. در اسکریپت node2d، یک متغیر به نام coin مثلا برای تعداد سکه میسازیم. توی تصویر بالا برای لیبل و یکی از دکمه ها متغیر ایجاد کردم که ضروری نبوده و لازم نیست شما انجام بدید. در ابتدا اسکریپت نود 2d به این صورته. 

بعد توی اسکریپت general چندتا کار باید انجام بدیم. 

  • یک متغیر برای سکه ها (که قراره برای سیو و لود استفاده بشه) ایجاد کنیم که من برای این که با اون یکی متغیر اشتباه نگیریدش به نام G_coin ساختم. 
  • یک متغیر رشته ای برای ذخیره مسیر فایلی که متغیر ما قراره توش سیو بشه که اسمش رو گذاشتم coin_save_path. دقت کنید که در ابتدای این آدرس از "user" استفاده شده و به فرض در موبایل، این ادرس میشه فولدر اصلی گوشی شما یا به اصطلاح root. 
  • یک تابع برای سیو. در این تابع کاری که انجام میدیم اینه که یک فایل ایجاد میکنیم و اون رو برای ذخیره کردن یا WRITE باز میکنیم، و متغیر G_coin رو در اون ذخیره میکنیم. 
  • یک تابع برای لود کردن. در این تابع اول بررسی میکنیم که اگر فایلی که قراره ساخته بشه وجود داره(برای جلوگیری از خطا) متغیر ذخیره شده رو در متغیر G_coin قرار بده یا لود کنه.
  • یک تابع برای ریست کردن مقدار ذخیره شده. برای این که بتونید برنامتون رو بارها تست کنید. اسکریپت general به این شکل خواهد بوددقت کنید که برای ذخیره کردن در فایل WRITE استفاده میشه و برای لود کردن از READ. یک نکته دیگه این که من تابع reset_coins رو در تابع ready فراخوانی کردم، ولی فعلا به صورت کامنت درش آوردم تا فراخوانی نشه. بعدا درباره این توضیح میدم. 

حالا باید در اسکریپت node2d تغییراتی ایجاد و اون رو تکمیل کنیم. اسکریپت در آخر اینجوری میشه:

به این موارد توجه کنید:

  • وقتی دکمه افزایش عدد زده(button2) میشه، مقدار coin ده تا افزایش پیدا میکنه و متن لیبل هم به روز میشه، یعنی دوباره مقدار جدید میگیره. دقت کنید که کلمه score و علامت : به مقدار عدد سکه اضافه میشه. 
  • وقتی دکمه ذخیره (button) زده میشه، اول مقدار G_coin برابر با مقدار coin میشه. به این دلیل که ما مقدار coin رو تغییر دادیم. میخوایم مقدار G_coin  که قراره ذخیره بشه هم بروز بشه. و بعد تابع save_coin فراخوانی میشه و مقدار رو ذخیره میکنه. به طور کلی coin  در G_coin ذخیره میشه و بعد در فایل ذخیره میشه. 
  • در تابع ready  که در ابتدای برنامه لود میشه، قراره عمل لود کردن رو انجام بدیم. پس اول تابع load رو از general فراخوانی میکنیم. بعد مقدرا coin رو برابر با مقدار G_coin که تازه از فایل لود شده میکنیم. و در نهایت هم متن لیبل رو بروزرسانی میکنیم. چون تا مقدار جدید رو نمایش ندیم نمیتونیم بفهمیم که سیو و لود به درستی انجام شده یا نه. 

حالا وقتی پروژه رو اجرا کنید باید با چنین چیزی روبرو بشید:

میبینید که هر بار که عدد رو افزایش میدم و ذخیره میکنیم، وقتی که برنامه میبندیم و دوباره باز میکنیم، مقدار سکه ذخیره شده. 

در نهایت اگه خواستید مقدار ذخیره شده رو ریست کنید یا صفر کنید، تابع reset_coin رو در ready از حالت کامنت خارج کنید و pass  رو کامنت کنید، یک بار برنامه رو اجرا کنید و خارج بشید. و دوباره reset_coin رو به حالت کامنت دربیارید و pass  رو از کامنت خارج کنید.به این شکل:

آموزش به آخر رسید. امیدوارم براتون مفید باشه. سوال داشتید حتما بپرسید و نظرتون رو هم بگیدو موفق باشید.

فایل پروژه:

دانلود