no-img
سامنتا

آموزش ساخت بازی دو بعدی (جلسه ی سوم)


سامنتا
دانلودهای ویژه
اطلاعیه های سایت

ادامه مطلب

آموزش ساخت بازی دو بعدی (جلسه ی سوم)
zip
مهر ۱, ۱۳۹۵

آموزش ساخت بازی دو بعدی (جلسه ی سوم)


برای دیدن جزئیات تمام جلسه های این دوره اینجا کلیک کنید .

شلیک (قسمت اول)

تا اینجا ، پلایر ساخته شده توسط ما ، با هشت پاهای وحشتناک برخورد میکند ولی هیچ کاری نمیتواند انجام دهد . 

بیایید به پلایر سلاح و مهمات اختصاص دهیم تا دشمنان خودش را نابود کند ، این حرکت با کدنویسی زیادی همراه خواهد شد ولی نتیجه ی کار مطمئنا خوب خواهد بود . ارزشش را دارد !

Projectile در یونیتی 

قبل از هر چیزی ، ما به یک شی درون بازی نیاز داریم که وقتی پلایر شلیک میکند پرتاپ شود باید یک projectiles را آماده کنیم 

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

آماده کردن prefab : 

  • تصویر را ایمپورت کنید 
  • sprite جدیدی از آن روی صحنه ایجاد کنید 
  • تصویر را به sprite اختصاص دهید 
  • لایه (layer ) را به Bullets تغییر دهید 
  • Rigidbody 2D را به sprite اضافه کنید و مقدار Gravity Scale و Fixed Angles را به ۰  تغییر دهید 
  • Box Collider 2D را به sprite اضافه کنید 

scale را به (0.5, 0.5, 1) تغییر دهید 

برای این شی ، باید پارامتر های اضافه ای را تعریف کنیم 

۱ در قسمت Box Collider 2D در تنظیمات شی بروید و Is Trigger را تیک بزنید 

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

به عبارتی دیگر ، وقتی یک گلوله توسط کاراکتر اصلی ما شلیک میشود هیچ اتفاق فیزیکی در صحنه نمی افتد و فقط هنگام ورود collider به دشمن متد OnTriggerEnter2D فراخوانی میشود .

حال ما یک گلوله داریم که باید برایش برنامه نویسی را انجام دهیم

اسکریپت سی شارپ جدید ایجاد کنید و محتویات آنرا بصورت زیر بنویسید 

using UnityEngine;
/// <summary>
/// Projectile behavior
/// </summary>
public class ShotScript : MonoBehaviour
{ // ۱ - Designer variables /// <summary> /// Damage inflicted /// </summary> public int damage = 1; /// <summary> /// Projectile damage player or enemies? /// </summary> public bool isEnemyShot = false; void Start() { // ۲ - Limited time to live to avoid any leak Destroy(gameObject, 20); // 20sec }
}
  1. برخی از متغیرها برای تعیین سرعت ، مسیر و میزان خسارت بودند 
  2. ما آبجکت را بعد از ۲۰ ثانیه از بین میبریم تا بار اضافه روی بازی ایجاد نشود 

اسکریپت ShotScript  را به بازیکن اتچ کنید . اضافه کردن MoveScript باعث میشود که گلوله حرکت کند

شی shot  را درگ کنید تا از آن یک prefab بسازید برای اینکه ما نیاز داریم مجددا از این شی استفاده کنیم 

 

تنظیمات شی گلوله ی شما باید مثل زیر باشد : 

تنظیمات شی دو بعدی در یونیتی

حال اگر بازی را اجرا کنید میبینید که گلوله حرکت میکند 

 

ایجاد برخورد و وارد کردن صدمه 

تا به اینجا گلوله ی ما به چیزی صدمه ای وارد نمیکند 

ما به یک اسکریپت جدید به نام HealthScript نیاز داریم که محتویاتش همانند زیر هست :

using UnityEngine;
/// <summary>
/// Handle hitpoints and damages
/// </summary>
public class HealthScript : MonoBehaviour
{ /// <summary> /// Total hitpoints /// </summary> public int hp = 1; /// <summary> /// Enemy or player? /// </summary> public bool isEnemy = true; /// <summary> /// Inflicts damage and check if the object should be destroyed /// </summary> /// <param name="damageCount"></param> public void Damage(int damageCount) { hp -= damageCount; if (hp <= 0) { // Dead! Destroy(gameObject); } } void OnTriggerEnter2D(Collider2D otherCollider) { // Is this a shot? ShotScript shot = otherCollider.gameObject.GetComponent<ShotScript>(); if (shot != null) { // Avoid friendly fire if (shot.isEnemyShot != isEnemy) { Damage(shot.damage); // Destroy the shot Destroy(shot.gameObject); // Remember to always target the game object, otherwise you will just remove the script } } }
}

اسکریپت HealthScript را به prefab دشمن یا همان Poulpi  که ساختیم اختصاص دهید .

نکته : بهتر هست وقتی یک prefab داریم بطور مستقیم با prefab کار کنیم . 

 

سعی کنید روی صحنه ، گلوله و کاراکتر دشمن را در یک خط قرار دهید 

توجه کنید که فیزیک دو بعدی در یونیتی از مقدار پوزیشن Z استفاده ای نمیکند پس نگران مختصات سوم نباشید و هر انچه در نمای دو بعدی میبینید فیزیک نیز همان را میبیند

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

کشتن دشمن در یونیتی

 

اگر دشمن ، سلامتی بیشتری داشته باشد زنده میماند . مقدار hp  را تغییر میدهیم که درون اسکریپت HealthScript قرار دارد .

سلامتی در یونیتی

 

ایجاد شلیک کردن 

shot را که قبلا روی صحنه ایجاد کرده بودیم پاک کنید . 

ما به اسکریپت جدیدی نیاز داریم تا عمل شلیک کردن را پیاده کند پس یک اسکریپت جدید با نام WeaponScript ایجاد کنید 

این اسکریپت را میخواهیم در جاهای زیادی استفاده کنیم (بازیکن ، دشمن و …). هدف ما از این اسکریپت ایجاد projectile برای شلیک به سمت جلو از طرف شی ای هست که اسکریپت به ان اختصاص داده شده است 

کد این اسکریپت در زیر آمده است : 

using UnityEngine;
/// <summary>
/// Launch projectile
/// </summary>
public class WeaponScript : MonoBehaviour
{ //-------------------------------- // ۱ - Designer variables //-------------------------------- /// <summary> /// Projectile prefab for shooting /// </summary> public Transform shotPrefab; /// <summary> /// Cooldown in seconds between two shots /// </summary> public float shootingRate = 0.25f; //-------------------------------- // ۲ - Cooldown //-------------------------------- private float shootCooldown; void Start() { shootCooldown = 0f; } void Update() { if (shootCooldown > 0) { shootCooldown -= Time.deltaTime; } } //-------------------------------- // ۳ - Shooting from another script //-------------------------------- /// <summary> /// Create a new projectile if possible /// </summary> public void Attack(bool isEnemy) { if (CanAttack) { shootCooldown = shootingRate; // Create a new shot var shotTransform = Instantiate(shotPrefab) as Transform; // Assign position shotTransform.position = transform.position; // The is enemy property ShotScript shot = shotTransform.gameObject.GetComponent<ShotScript>(); if (shot != null) { shot.isEnemyShot = isEnemy; } // Make the weapon shot always towards it MoveScript move = shotTransform.gameObject.GetComponent<MoveScript>(); if (move != null) { move.direction = this.transform.right; // towards in 2D space is the right of the sprite } } } /// <summary> /// Is the weapon ready to create a new projectile? /// </summary> public bool CanAttack { get { return shootCooldown <= 0f; } }
}

 

اسکریپت را به بازیکن اختصاص دهید (منظور از بازیکن یا پلایر همان شخصیت و کاراکتر اصلی ماست که کشتی پرنده هست)

اسکریپت به سه بخش تقسیم شده است 

۱ متغیرهایی که در inspector قابل مشاهده و مقداردهی هستند 

ما دو عضو در این قسمت داریم shotPrefab  و shootingRate .

متغیر اولی گلوله ای که قرار هست شلیک شود را از شما میگیرد 

بازیکن را از Hierarchy انتخاب کنید و به inspector بروید . در قسمتی که اسکریپت WeaponScript وجود دارد قسمتی با نام Shot Prefab میبینید که خالی هست و در کادر مستطیلی کوچک روبروی آن کلمه ی None نوشته شده است . شما باید prefab گلوله را به این کادر درگ کنید

اختصاص دادن prefab ها به اسکریپت در یونیتی

به همین راحتی درگ کردن ، یونیتی به اسکریپت شما متغیر را مقدار دهی میکند 

متغیر shootingRate  یک متغیر پیش تعریف شده در اسکریپت هست ما فعلا نیازی به تغییر آن نداریم . ولی شما میتوانید بازی را اجرا کنید و سپس با تغییر آن تست کنید تا ببینید چه اتفاقی میافتد (عملیاتی که در هنگام اجرای بازی در یونیتی انجام میگیرد ذخیره نمیشوند)

۲ Cooldown

حال گلوله ای که از تفنگ شلیک میشود یک مقدار rate دارد وگرنه شما توانایی کنترل تعداد گلوله های شلیک شده در میان هر فریم بازی را خواهید داشت 

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

۳ متد Attack که بصورت public هست 

هدف اصلی این اسکریپت  اینجاست :  قابل فراخوانی توسط دیگران باشد . دلیل اینکه متد را public تعریف کردیم همین هست . 

زمانی که projectile ساخته شد ما اسکریپت شی shot را بازیابی میکنیم و مقداردهی جدیدی را روی متغیر ها انجام میدهیم 

 

استفاده کردن تفنگ توسط پلایر بازی 

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

حتی اگر اسکریپت WeaponScript روی یک شی اختصاص دهیم متد Attack(bool) هرگز فراخوانی نخواهد شد .

پس بیایید به اسکریپت PlayerScript برگردیم 

در متد Update() کدهای زیر را وارد کنید : 

 void Update() { // ... // ۵ - Shooting bool shoot = Input.GetButtonDown("Fire1"); shoot |= Input.GetButtonDown("Fire2"); // Careful: For Mac users, ctrl + arrow is a bad idea if (shoot) { WeaponScript weapon = GetComponent<WeaponScript>(); if (weapon != null) { // false because the player is not an enemy weapon.Attack(false); } } // ... }

مهم نیست شما این کدها را قبل یا بعد از کدهای حرکت کپی کرده باشید

چه کاری انجام دادیم ؟ 

  1.  ما دکمه ای را برای شلیک کردن گرفتیم و رویداد فشرده شدن آنرا تست کردیم (click  یا ctrl بصورت پیشفرض)
  2. ما اسکریپت WeaponScript را بازیابی کردیم 
  3. متد Attack(false) را فراخوانی کردیم 

بازی را اجرا کنید. بازی باید مثل تصویر زیر باشد 

شلیک کردن در یونیتی

 

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

جایزه : این کار را فقط برای اینکه جالب هست انجام دهید ، rotation پلایر را به (0, 0, 45) تغییر دهید . گلوله ها در زاویه ۴۵ درجه ای حرکت خواهند کرد با وجود اینکه rotation گلوله ها درست نیست بخاطر اینکه ما مقدار انها را تغییر ندادیم 

ساخت بازی دو بعدی در یونیتی

درس بعدی :

ما یک پلایر داریم که شلیک میکنه ! یاد گرفتیم که چطور اسلحه ای بسازیم که شلیک بکند . 

شاید بهتر باشه که دشمن های زیادی را خودتان هم به صحنه اضافه کنید 

ولی این مرحله کامل نیست و ما میخواهیم دشمن ها هم شلیک بکنند .  با درس بعدی در خدمت شما خواهیم بود 

موفق باشید




درباره نویسنده

تیم سامنتا 75 نوشته در سامنتا دارد . مشاهده تمام نوشته های

دیدگاه ها


2 پاسخ به “آموزش ساخت بازی دو بعدی (جلسه ی سوم)”

  1. fatima گفت:

    نیست  hierarchyسلام من قسمت اول و دوم برنامه رو اجرا کردم ولی بعد اینکه پروژه رو بستم الان باز میکنم هیچ چیزی تو 

     پریفب ها و اسپرایت هایی که ساخته بودم هستن و اسکریپت هایی که آخر اضافه کرده بودم ولی  سین و قسمت بالای صفحه چیزی نیست 

    خواهش میکنم کمکم کنید

پاسخ دهید

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