ساخت بازی آنلاین رایگان — آموزش پروژه محور یونیتی | به زبان ساده

۲۲۸۰ بازدید
آخرین به‌روزرسانی: ۲۲ اسفند ۱۴۰۲
زمان مطالعه: ۱۲ دقیقه
ساخت بازی آنلاین رایگان — آموزش پروژه محور یونیتی | به زبان ساده

در این راهنمای ساخت بازی آنلاین رایگان قصد داریم به طور عملی یک بازی دموی ساده در یونیتی بسازیم تا با شیوه استفاده از قابلیت‌های چندبازیکنه Unity آشنا شویم. این بازی یک صحنه ثابت دارد که یک بازی شلیک فضایی چندبازیکنه در آن اجرا می‌شود. در این دمو چند بازیکن می‌توانند به یک بازی بپردازند و به دشمن‌هایی که به صورت تصادفی جابجا می‌شوند شلیک کنند. با ما همراه باشید تا با شیوه ساخت بازی آنلاین رایگان آشنا شوید.

ساخت بازی آنلاین رایگان

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

  • برنامه‌نویسی سی شارپ (#C)
  • استفاده از ادیتور یونیتی و اجرای کارهایی مانند ایمپورت کردن فایل‌ها، ایجاد prefab و افزودن کامپوننت.

ما از یک asset به نام Mirror استفاده می‌کنیم. این asset یک استثنا در سیستم شبکه‌بندی پیش‌فرض یونیتی محسوب می‌شود و قابلیت‌های جدیدی اضافه کرده و مقدار زیادی از باگ‌ها و مشکلات را حل کرده است.

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

ایجاد پروژه و ایمپورت فایل‌ها

پیش از آغاز مطالعه این راهنمای ساخت بازی آنلاین رایگان باید یک پروژه یونیتی ایجاد کرده و همه اسپرایت‌های موجود را از طریق سورس کد ایمپورت کنید. به این منظور باید پوشه‌ای به نام Sprites ایجاد کرده و همه اسپرایت‌ها را در این پوشه کپی کنید. ابزار Unity Inspector به طور خودکار همه آن‌ها را در پروژه ایمپورت خواهد کرد.

با این حال برخی از اسپرایت‌ها درون اسپرایت‌شیت‌ها مانند اسپرایت‌شیت enemies هستند و باید برش (slice) پیدا کنند. برای انجام این کار باید گزینه «حالت اسپرایت» (Sprite Mode) را روی Sprite Mode قرار داده و ادیتور اسپرایت را باز کنیم.

ساخت بازی آنلاین رایگان

در ادیتور اسپرایت (که در تصویر زیر می‌بینید) باید منوی Slice را باز کرده و روی دکمه Slice بزنید و نوع اسلایس را نیز روی اتوماتیک قرار دهید. در نهایت پیش از خروج روی دکمه Apply بزنید.

ساخت بازی آنلاین رایگان

همچنین باید یک asset به نام Mirror را ایمپورت کنیم. به این منظور به Asset Store بروید و Mirror را دانلود کنید.

دانلود فایل‌های سورس کد

برای دانلود فایل‌های سورس کد می‌توانید روی این لینک (+) کلیک کنید.

بوم پس‌زمینه

نخستین کاری که در این راهنمای ساخت بازی آنلاین رایگان باید انجام دهیم، ایجاد «بوم پس‌زمینه» (Background Canvas) برای نمایش تصویر پس‌زمینه است. این کار با استفاده از یک تصویر جدید در «سلسله مراتب» (Hierarchy) انجام می‌شود و به طور خودکار یک بوم جدید ایجاد می‌کند که باید نام آن را به BackgroundCanvas عوض کنید.

در بوم BackgroundCanvas باید حالت رندر را روی Screen Space – Camera قرار دهیم و دوربین اصلی را به آن الصاق کنیم. به این ترتیب بوم در پس‌زمینه و نه در جلوی اشیای دیگر ظاهر می‌شود.

در پس‌زمینه تنها باید تصویر Source را تنظیم کنیم که تصویر فضا خواهد بود.

اکنون تلاش کنید بازی را اجرا نمایید تا ببینید که پس‌زمینه فضا در بازی دیده می‌شود.

Network Manager

برای این که یک بازی چندبازیکنه داشته باشیم، باید از GameObject به همراه کامپوننت‌های NetworkManager و NetworkManagerHUD استفاده کنیم. پس آن را می‌سازیم.

ساخت بازی آنلاین رایگان

این شیء مسئول مدیریت اتصال کلاینت‌های مختلف در یک بازی و همگام‌سازی اشیای بازی در میان همه کلاینت‌ها است. بخش HUD ابزار Network Manager یک HUD ساده برای بازیکنان نمایش می‌‌دهد تا به یک بازی وصل شوند. برای نمونه اگر یک بازیکن، بازی را شروع کند، باید صفحه زیر را ببینید:

ساخت بازی آنلاین رایگان

در این راهنمای ساخت بازی آنلاین رایگان قصد داریم از LAN Host و LAN Client استفاده کنیم. بازی‌های چندبازیکنه یونیتی به صورت زیر عمل می‌کنند: ابتدا یک بازیکن گیم را به عنوان میزبان (با انتخاب گزینه LAN Host) آغاز می‌کند. میزبان همزمان به عنوان یک سرور و یک کلاینت عمل می‌کند. سپس بازیکن‌های دیگر می‌توانند به عنوان کلاینت (با انتخاب گزینه LAN Client) به این میزبان وصل شوند. ارتباط کلاینت با سرور صورت می‌گیرد، اما هیچ نوع کد صرفاً سروری را اجرا نمی‌کند. بنابراین برای این که بتوانیم بازی را تست کنیم باید دو وهله از آن داشته باشیم که یکی به عنوان Host و دیگری Client باشد.

اما باید بدانید که امکان باز کردن دو کلاینت از بازی در ادیتور یونیتی وجود ندارد. برای انجام این کار باید ابتدا بازی را ایجاد کنید و وهله نخست را از طریق فایل اجرایی تولید شده اجرا کنید. سپس وهله دو می‌تواند از داخل ادیتور یونیتی (در حالت Play) باز شود.

برای این که بازی را بیلد کنید باید صحنه بازی را به بیلد اضافه نمایید. به این منظور به مسیر File -> Build Settings بروید و صحنه Game را به بیلد اضافه کنید. در ادامه می‌توانید فایل اجرایی را تولید کرده و آن را با کلیک روی منوی File -> Build & Run اجرا نمایید. به این ترتیب یک پنجره جدید از بازی باز می‌شود. بعد از انجام این کار می‌توانید در ادیتور یونیتی وارد حالت Play شده و وهله دوم بازی را اجرا نمایید. هر زمان که قرار باشد یک بازی چندبازیکنه را تست کنید، باید از این روش استفاده نمایید.

ساخت بازی آنلاین رایگان

جابجایی سفینه فضایی

اکنون که بخش NetworkManager را در اختیار داریم، می‌توانیم اقدام به ایجاد اشیای بازی که قرار است NetworkManager مدیریت کند بشویم. نخستین شیئی که می‌سازیم سفینه فضایی بازیکن است.فعلاً این سفینه تنها به طور افقی روی صفحه حرکت می‌کند و موقعیت آن به وسیله NetworkManager به‌روزرسانی خواهد شد. در ادامه امکان جابجایی و شلیک تیر و آسیب دیدن را نیز به آن اضافه خواهیم کرد.

بنابراین در نخستین گام یکشی GameObject به نام Ship ایجاد کرده و آن را به صورت prefab تنظیم می‌کنیم. شکل زیر کامپوننت‌های prefab شیء Ship را نمایش می‌دهد که در ادامه این راهنمای ساخت بازی آنلاین رایگان در موردش توضیح خواهیم داد.

ساخت بازی آنلاین رایگان

برای این که یک شیء در گیم به وسیله NetworkManager مدیریت شود، باید کامپوننت NetworkIdentity را به آن اضافه کنیم. به علاوه از آنجا که این سفینه از سوی بازیکن کنترل خواهد شد باید تیک گزینه Local Player Authority را نیز برای آن بزنیم.

کامپوننت NetworkTransform به نوبه خود مسئول به‌روزرسانی موقعیت سفینه در همه موارد سرور و کلاینت‌ها‌ است. اگر از این کامپوننت استفاده نکنیم، سفینه تنها در یک صفحه جابجا خواهد شد و موقعیت آن در صفحه‌های دیگر به‌روزرسانی نمی‌شود. NetworkIdentity و NetworkTransform دو کامپوننت ضروری برای پیاده‌سازی قابلیت چندبازیکنه هستند. بنابراین باید Client Authority را در کامپوننت NetworkTransform فعال کنید.

اکنون برای مدیریت جابجایی‌ها و تصادم‌ها باید یک RigidBody2D و یک BoxCollider2D اضافه کنیم. به علاوه BoxCollider2D یک ماشه است و از این رو باید مقدار آن برابر با True شود، چون نمی‌خواهیم تصادم‌ها روی فیزیک سفینه تأثیر بگذارند.

در نهایت باید یک اسکریپت MoveShip اضافه کنیم که پارامتر Speed دارد. اسکریپت‌ها دیگر نیز در ادامه اضافه خواهند شد، اما فعلاً این مقدار کفایت می‌کند.

اسکریپت MoveShip بسیار ساده است. در متد FixedUpdate مقدار جابجایی را از محور افقی دریافت کرده و سرعت سفینه را بر آن اساس تنظیم می‌کنیم. با این حال، دو نکته مهم در ارتباط با شبکه وجود دارند که باید توضیح داده شوند.

نکته نخست این است که به طور معمول همه اسکریپت‌ها در یک بازی یونیتی از MonoBehaviour ارث‌بری می‌کنند تا از API آن بهره بگیرند. با این حال برای این که از Network API نیز استفاده کنیم، اسکریپت باید از NetworkBehaviour به جای MonoBehaviour ارث‌بری کند. شما باید فضای نام Networking را با استفاده از UnityEngine.Networking بگنجانید تا بتوانید از آن استفاده کنید.

نکته دیگر این است که در یک بازی چندبازیکنه یونیتی، کد یکسانی روی همه وهله‌های بازی (چه هاست و چه کلاینت) اجرا می‌شود. برای این که بازیکنان بتوانند تنها سفینه خود و نه همه سفینه‌های داخل بازی را کنترل کنند، باید یک شرط if در ابتدای متد FixedUpdate اضافه کنیم تا مطمئن شویم آیا این بازیکن لوکال است یا نه. اگر کنجکاو هستید که بازی بدون این شرط if چطور عمل می‌کند، می‌توانید آن را حذف کرده و بازی را امتحان کنید. زمانی که یک سفینه در صفحه جابجا می‌شود، همه سفینه‌های دیگر نیز همراه با آن جابجا خواهند شد.

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using Mirror;
5 
6public class MoveShip : NetworkBehaviour 
7{
8    [SerializeField]
9    private float speed;
10 
11    void FixedUpdate () 
12    {
13        if(this.isLocalPlayer) 
14        {
15            float movement = Input.GetAxis("Horizontal");	
16            GetComponent<Rigidbody2D>().velocity = new Vector2(movement * speed, 0.0f);
17        }
18    }
19}

پیش از بازی کردن این گیم، باید به NetworkManager اعلام کنیم که prefab به نام Ship در واقع Prefab بازیکن است. این کار با انتخاب کردن آن در خصوصیت Player Prefab در کامپوننت NetworkManager انجام می‌شود. با انجام این کار، هر بار که یک بازیکن وهله‌ای از بازی را آغاز کند، یک سفینه فضایی را وهله‌سازی می‌کند.

ساخت بازی آنلاین رایگان

اکنون می‌توانید بازی را اجرا کنید و جابجایی سفینه فضایی باید بین دو وهله بازی همگام‌سازی شود.

ساخت بازی آنلاین رایگان

تولید سفینه‌ها

تا به اینجا همه سفینه‌ها در میانه صفحه تولید می‌شدند. با این حال تعریف کردن برخی مکان‌های از پیش‌تعریف‌شده برای ظاهر شدن سفینه‌ها باعث جذاب‌تر شدن بازی می‌شود. انجام این کار با بهره‌گیری از Unity multiplayer API کار آسانی محسوب می‌شود.

ابتدا باید یک شیء جدید Game ایجاد کنیم تا محل تولید سفینه ما باشد و در مکان مطلوب خود قرار دهیم. در ادامه کامپوننت NetworkStartPosition را به آن اضافه می‌کنیم. ما قصد داریم دو موقعیت تولید سفینه ایجاد کنیم که یکی در مختصات (4-, 4-) و دیگری در مختصات (4-, 4) قرار دارد.

ساخت بازی آنلاین رایگان

ساخت بازی آنلاین رایگان

در این مرحله از راهنمای ساخت بازی آنلاین رایگان با یونیتی باید شیوه استفاده NetworkManager از این موقعیت‌ها را تعریف کنیم. این کار را با پیکربندی خصوصیت Player Spawn Method انجام می‌دهیم. دو گزینه پیش روی ما قرار دارند: Random و Round Robin.

در گزینه Random برای هر وهله بازی، manager موقعیت آغاز بازیکن را در یک مکان تصادفی میان موقعیت‌های تعریف‌شده انتخاب می‌کند. در روش Round Robin موقعیت ظاهر شدن سفینه‌ها به طور متوالی بین مکان‌های تعریف‌شده جابجا می‌شود تا این که همه آن‌ها استفاده شوند و دوباره از نو آغاز کند. ما از این روش دوم یعنی روش Round Robin استفاده می‌کنیم.

ساخت بازی آنلاین رایگان

اکنون می‌توانید بازی را دوباره اجرا کرده و ببینید که آیا سفینه‌ها در مکان‌های صحیحی تولید می‌شوند یا نه.

ساخت بازی آنلاین رایگان

شلیک تیر

در این بخش از راهنمای ساخت بازی آنلاین رایگان یک قابلیت دیگر می‌خواهیم به بازی اضافه کنیم و آن توانایی شلیک کردن تیر است. ضمناً این تیرها باید بین همه وهله‌های بازی همگام‌سازی شوند. قبل از هر کار باید یک prefab به نام Bullet ایجاد کنیم. از این رو یک GameObject جدید به نام Bullet ایجاد کرده و آن را به یک prefab تبدیل می‌کنیم. برای این که آن را در شبکه مدیریت کنیم، همانند شیء سفینه به کامپوننت‌های NetworkIdentiy و NetworkTransform نیاز داریم.

زمانی که یک تیر ایجاد شد، لازم نیست که بازی مکان آن را به همه شبکه اطلاع دهد، چون موقعیت تیر به وسیله موتور فیزیک آپدیت می‌شود. بنابراین باید Network Send Rate را در کامپوننت Network Transform روی مقدار 0 تنظیم کنیم تا تحمیل بار غیر ضروری به شبکه خودداری شود.

ضمناً تیرها یک مقدار سرعت دارند و باید در ادامه به دشمن‌ها بخورند. بنابراین باید یک RigidBody2D و یک CircleCollider2D به prefab اضافه کنیم. در این مورد نیز باید توجه کنیم که CircleCollider2D یک ماشه (Trigger) است.

ساخت بازی آنلاین رایگان

اکنون که bullet prefab را در اختیار داریم، می‌توانیم یک اسکریپت به نام ShootBullets به سفینه اضافه کنیم. این اسکریپت دارای پارامترهای Bullet Prefab و Bullet Speed است.

ساخت بازی آنلاین رایگان

اسکریپت ShootBullets یک NetworkBehaviour است که در ادامه ملاحظه می‌کنید. در متد آپدیت، بررسی می‌کنیم آیا بازیکن لوکال کلید اسپیس را زده یا نه و اگر زده باشد، یک متد برای شلیک تیر فراخوانی می‌شود. این متد یک تیر جدید را وهله‌سازی کرده و سرعت آن را تنظیم می‌کند و پس از یک ثانیه (یعنی زمانی که تیر عملاً از صفحه خارج شده) آن را تخریب می‌کند.

در این مورد نیز برخی جنبه‌های مهم در خصوص شبکه وجود دارند که باید توضیح داده شوند. ابتدا یک تگ [Command] بالاتر از متد CmdShoot وجود دارد. این تگ و Cmd در ابتدای نام متد موجب شده که به متد خاصی به نام Command تبدیل شود. در یونیتی متد Command یا متد فرمان در سرور اجرا می‌شود، هر چند در کلاینت فراخوانی شده باشد. در این مورد زمانی که بازیکن لوکال یک تیر شلیک می‌کند، به جای فراخوانی کردن متد در کلاینت، بازی یک درخواست فرمان به سرور ارسال می‌کند و سرور آن متد را اجرا می‌کند.

ضمناً یک فراخوانی به NetworkServer.Spawn در متد CmdShoot وجود دارد. متد Spawn مسئول ایجاد کردن تیر در همه وهله‌های بازی است. بنابراین یک تیر در سرور ایجاد می‌کند و سپس سرور این تیر را در میان همه کلاینت‌ها تکرار می‌کند. توجه کنید که این قابلیت تنها به این جهت ممکن شده که CmdShoot یک Command و نه یک متد معمولی است.

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using Mirror;
5 
6public class ShootBullets : NetworkBehaviour
7{
8    [SerializeField]
9    private GameObject bulletPrefab;
10 
11    [SerializeField]
12    private float bulletSpeed;
13 
14    void Update () 
15    {
16        if(this.isLocalPlayer && Input.GetKeyDown(KeyCode.Space)) 
17        {
18            this.CmdShoot();
19        }
20    }
21 
22    [Command]
23    void CmdShoot ()
24    {
25        GameObject bullet = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity);
26        bullet.GetComponent<Rigidbody2D>().velocity = Vector2.up * bulletSpeed;
27        NetworkServer.Spawn(bullet);
28        Destroy(bullet, 1.0f);
29    }
30}

در نهایت باید به network manager اعلام کنیم که می‌توانید تیرها را تولید کند. این کار را با افزودن bullet prefab در لیست Registered Spawnable انجام می‌دهیم.

ساخت بازی آنلاین رایگان

در این مرحله از راهنمای ساخت بازی آنلاین رایگان می‌توانیم بازی را اجرا کرده و اقدام به شلیک تیر کنیم. این تیرها در میان همه وهله‌های بازی همگام‌سازی خواهند شد.

ساخت بازی آنلاین رایگان

تولید دشمن

گام بعدی در ساخت بازی آنلاین رایگان، افزودن دشمن‌ها است. ابتدا باید یک Enemy prefab داشته باشیم. از این رو یک GameObject جدید به نام Enemy ایجاد کرده و آن را به یک prefab تبدیل می‌کنیم. دشمن‌ها نیز مانند سفینه‌ها دارای پارامترهای Rigidbody2D و BoxCollider2D هستند تا بتوانیم جابجایی و تصادمشان را کنترل کنیم. ضمناً به کامپوننت‌های NetworkIdentity و NetworkTransform نیاز داریم که از سوی NetworkManager مدیریت می‌شوند. در ادامه باید یک اسکریپت نیز به آن اضافه کنیم، اما فعلاً به این مقدار بسنده می‌کنیم.

اکنون یک GameObject به نام EnemySpawner ایجاد می‌کنیم. EnemySpawner نیز دارای پارامتر NetworkIdentity است، اما اکنون باید فیلد Server Only را در کامپوننت انتخاب کنیم. به این ترتیب spawner تنها در سرور وجود خواهد داشت، چون نمی‌خواهیم دشمن‌ها در همه کلاینت‌ها ایجاد شوند. همچنین یک اسکریپت SpawnEnemies نیز دارد که دشمن‌ها را در بازه‌های مرتب تولید می‌کند. پارامترهای آن enemy prefab، بازه تولید و سرعت دشمن هستند.

اسکریپت SpawnEnemies در ادامه ارائه شده است. توجه کنید که ما در این جا از یک متد جدید یونیتی به نام OnStartServer استفاده کرده‌ایم. این متد بسیار مشابه OnStart است و تنها تفاوتش این است که تنها برای سرور فراخوانی می‌شود. وقتی این اتفاق بیفتد، ما باید InovkeRepeating را فراخوانی کنیم تا متد SpawnEnemy را بر اساس spawnInterval هر ثانیه یک بار فراخوانی کند.

متد SpawnEnemy یک دشمن جدید را در موقعیتی تصادفی وهله‌سازی می‌کند و از NetworkServer.Spawn برای تکرار آن در میان همه وهله‌های بازی بهره می‌گیرد. در نهایت دشمن پس از 10 ثانیه تخریب خواهد شد.

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using Mirror;
5 
6public class SpawnEnemies : NetworkBehaviour 
7{
8    [SerializeField]
9    private GameObject enemyPrefab;
10 
11    [SerializeField]
12    private float spawnInterval = 1.0f;
13 
14    [SerializeField]
15    private float enemySpeed = 1.0f;
16 
17    public override void OnStartServer () 
18    {
19        InvokeRepeating("SpawnEnemy", this.spawnInterval, this.spawnInterval);
20    }
21 
22    void SpawnEnemy () 
23    {
24        Vector2 spawnPosition = new Vector2(Random.Range(-4.0f, 4.0f), this.transform.position.y);
25        GameObject enemy = Instantiate(enemyPrefab, spawnPosition, Quaternion.identity) as GameObject;
26        enemy.GetComponent<Rigidbody2D>().velocity = new Vector2(0.0f, -this.enemySpeed);
27        NetworkServer.Spawn(enemy);
28        Destroy(enemy, 10);
29    }
30}

پیش از اجرای بازی، باید Enemy prefab را به لیست Prefab-های Registered Spawnable اضافه کنیم.

ساخت بازی آنلاین رایگان

اکنون می‌توانید بازی را با حضور دشمن‌ها نیز بازی کنید. توجه کنید که بازی هنوز امکان مدیریت تصادم‌ها را ندارد. بنابراین نمی‌توانیم به دشمن‌ها شلیک کنیم. در گام بعدی این جنبه را نیز پیاده‌سازی خواهیم کرد.

آسیب دیدن

آخرین چیزی که در این راهنمای ساخت بازی آنلاین رایگان قصد داریم به بازی اضافه کنیم، توانایی ضربه زدن به دشمنان و متأسفانه کشتن آن‌ها است. برای این که مراحل این راهنما همچنان ساده بماند، می‌خواهیم از اسکریپت یکسانی برای سفینه‌ها و دشمنان استفاده کنیم.

اسکریپتی که قرار است بنویسیم، Registered Spawnable نام دارد و در ادامه آن را ملاحظه می‌کنید. این اسکریپت دارای پارامترهای maxHealth، enemyTag و destroyOnDeath است که قابل پیکربندی هستند. پارامتر اول برای تعریف سلامت اولیه شیء استفاده می‌شود پارامتر دوم برای تشخیص تصادم کاربرد دارد. برای نمونه برای سفینه‌ها به صورت Enemy خواهد بود، در حالی که مقدار enemyTag برای دشمن‌ها Bullet است. به این ترتیب می‌توانیم کاری کنیم که سفینه‌ها تنها با دشمنان تصادم داشته باشند و دشمن‌ها نیز با تیرها تصادم کنند. پارامتر آخر یعنی destroyOnDeath برای تشخیص این موضوع استفاده می‌شود که آیا یک شیء پس از مردن، باید بازتولید شود یا بمیرد.

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using Mirror;
5 
6public class ReceiveDamage : NetworkBehaviour 
7{
8    [SerializeField]
9    private int maxHealth = 10;
10 
11    [SyncVar]
12    private int currentHealth;
13 
14    [SerializeField]
15    private string enemyTag;
16 
17    [SerializeField]
18    private bool destroyOnDeath;
19 
20    private Vector2 initialPosition;
21 
22    // Use this for initialization
23    void Start () 
24    {
25        this.currentHealth = this.maxHealth;
26        this.initialPosition = this.transform.position;
27    }
28 
29    void OnTriggerEnter2D (Collider2D collider) 
30    {
31        if(collider.tag == this.enemyTag) 
32        {
33            this.TakeDamage(1);
34            Destroy(collider.gameObject);
35        }
36    }
37 
38    void TakeDamage (int amount) 
39    {
40        if(this.isServer) 
41        {
42            this.currentHealth -= amount;
43 
44            if(this.currentHealth <= 0) 
45            {
46                if(this.destroyOnDeath) 
47                {
48                    Destroy(this.gameObject);
49                } 
50                else 
51                {
52                    this.currentHealth = this.maxHealth;
53                    RpcRespawn();
54                }
55            }
56        }
57    }
58 
59    [ClientRpc]
60    void RpcRespawn () 
61    {
62        this.transform.position = this.initialPosition;
63    }
64}

در این بخش از راهنمای ساخت بازی آنلاین رایگان به بررسی متدها می‌پردازیم. در متد Start، اسکریپت مقدار currentHealth را روی بیشینه تنظیم و موقعیت اولیه را ذخیره می‌کند. موقعیت اولیه برای بازتولید مجدد سفینه استفاده خواهد شد. همچنین توجه کنید که یک تگ [SyncVar] بالاتر از تعریف خصوصیت currentHealth وجود دارد. این بدان معنی است که مقدار این خصوصیت باید میان همه وهله‌های بازی همگام‌سازی شود. بنابراین اگر یک شیء در یک وهله آسیب ببیند، این آسیب باید به همه وهله‌ها انتشار داده شود.

متد OnTriggerEnter2D مسئول مدیریت تصادم‌ها است، چون تصادم‌ها به صورت trigger اضافه شده‌اند. ابتدا بررسی می‌کنیم آیا تگ triggers آن enemyTag است که به دنبالش هستیم یا نه تا تصادم‌ها را تنها در برابر اشیایی که به دنبالشان هستیم (دشمنان در برابر سفینه‌ها و تیرها در برابر دشمنان) مدیریت کنیم. اگر چنین باشد، متد TakeDamage را فراخوانی کرده و تصادم‌کننده را تخریب می‌کنیم.

متد TakeDamage به نوبه خود تنها در سرور فراخوانی می‌شود. دلیل این امر آن است که currentHealth یک SyncVar است و از این رو تنها باید در سرور آپدیت شود و بین همه کلاینت‌ها همگام‌سازی گردد. علاوه بر آن متد TakeDamage ساده است و تنها currentHealth را کاهش می‌دهد و بررسی می‌کند آیا کمتر از 0 شده یا نه. اگر چنین باشد، در صورتی که destroyOnDeath مقدار true داشته باشد، اگر شیء تخریب شود و یا اگر currentHealth ریست شده باشد شیء باز‌تولید می‌شود.

متد آخر متد respawn است. در این متد از قابلیت چندبازیکنه دیگر به نام ClientRpc استفاده می‌کنیم. این وضعیت مخالف تگ [Command] است. زمانی که فرمان‌ها از کلاینت‌ها به سرور ارسال می‌شوند، یک ClientRpc در کلاینت اجرا می‌شود، هر چند متد از سرور فراخوانی شده است. بنابراین وقتی شیئی نیاز به بازتولید داشته باشد، سرور یک درخواست به کلاینت ارسال می‌کند تا متد RpcRespawn را اجرا کند که صرفاً موقعیت سفینه را به موقعیت اولیه ریست می‌کند. این متد باید در کلاینت اجرا شود، زیرا می‌خواهیم برای سفینه‌هایی اجرا شود که تحت کنترل بازیکن هستند.

در نهایت باید این اسکریپت را به هر دو prefab به نام‌های Ship و Enemy اضافه کنیم. توجه کنید که برای سفینه فضایی باید تگ Enemy را به صورت Enemy تعریف کنیم، در حالی که برای دشمن این خصوصیت برابر با Bullet است. همچنین در prefab دشمن خصوصیت Destroy On Death را فعال می‌کنیم.

ساخت بازی آنلاین رایگان

ساخت بازی آنلاین رایگان

اکنون می‌توانید بازی را با قابلیت شلیک به دشمنان اجرا کنید. اجازه بدهید دشمنان بتوانند با سفینه شما تصادم کنند تا ببینید آیا سفینه‌ها به درستی بازتولید می‌شوند یا نه.

سخن پایانی

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

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
gamedevacademy
۲ دیدگاه برای «ساخت بازی آنلاین رایگان — آموزش پروژه محور یونیتی | به زبان ساده»

ممنون از این مطلب کاربردی

سلام
آخه چرا ویدئو نمی سازید
موضوع برای من خیلی جذاب بود
اما خوندن این همه متن واقعا سخته 🤕همه ی این رو توی یه ویدئو یک ربعی میشه جمعش کرد

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *