no-img
سامنتا

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


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

ادامه مطلب

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

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


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

ساخت یک بازیکن و دشمنان آن 

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

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

show-iconحجم و کیفیت فایل ها : ۱۸۲ مگابایت با کیفیت اچ دی عالی
show-iconمدت زمان آموزش : ۵۰ دقیقه به زبان فارسی توسط عباس نیک زاد
show-icon
۷,۰۰۰ تومان – خرید Loading

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

ساخت بازیکن

ساخت ماهیت یک بازیکن قابل کنترل در یونیتی ، نیازمند  برخی عناصر هست  : یک اسپرایت ، راهی برای کنترل کردن آن تا با محیط بازی ارتباط برقرار بکند . 

ما تمام این پروسه را قدم به قدم پیش خواهیم رفت. 

اضافه کردن اسپرایت 

در این جا تصویری هست که میخواهیم بعنوان بازیکن استفاده کنیم آنزا ذخیره کنید 

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

 

  • تصوير بالا را درون پوشه ی Textures کپی کنید
  • Sprite جدیدی را درست کنید و نام آنرا Player بگذارید
  • Sprite که ساختید را انتخاب کنید تا در قسمت inspector  کامپوننت Sprite Renderer مشاهده کنید از آنجا گزینه ی sprite را انتخاب کنید 

اگر در این موارد مشکل دارید به آموزش های قبلی مراجعه کنید 

  • Player را انتخاب کنید 
  • player را در Foreground قرار دهید 
  • scale آنرا به 0.2, 0.2, 1) تغییر دهید 

کمی درباره ی کامپوننت های یونیتی 

ما فقط درباره ی Sprite Renderer سخن گفتیم . هر آبجکت تعداد زیادی کامپوننت دارد که همه ی آنها را در پنجره ی inspector آن میتوانید مشاهده کنید و عملیات ویرایش و پاک کردن و اضاف کردن را روی آنها انجام دهید 

بصورت پیشفرض هر شی خالی که بسازید دارای inspector مشابه تصویر زیر خواهد بود 

کامپوننت های یونیتی

تنها کامپوننت متصل شده به این شی ، Transform میباشد که حالت و مکان قرارگیری شی را مشخص میکند این کامپوننت قابل حذف شدن نیست و باید باشد 

شما میتوانید با استفاده از زدن دکمه ی Add Component کامپوننت های جدیدی را به شی خود اختصاص دهید . هر اسکریپتی که مینویسید هم یک کامپوننت حساب میشود و از اینجا نیز میتوانید اضافه کنید 

برای غیر فعال کردن یک کامپاننت هم به سادگی میتوانید روی تیک ابتدای نام آن کلیک کنید .

کامپوننت های یونیتی 2

Sprite Renderer هم کامپوننتی برای تغییر texture های یک sprite هست 

حالا ما با مفهوم کامپوننت ها آشنا شدیم . کمی در ادامه با افزودن کامپوننت ها تمرین میکنیم 

اضافه کردن Box Collider به شی

روی گزینه ی Add Component کلیک کنید و گزینه ی Box Collider 2D را انتخاب کنید . در قسمت سرچ میتوانید بنویسید تا زودتر برای شما پیدا شود 

این گزینه یک جعبه دور تا دور player ما میکشد و از قسمت Scene میتوانید به رنگ سبز آنرا مشاهده کنید که مانند مرزی در اطراف شی میباشد 

همچنین شما میتوانید سایز و خصوصیات دیگر آنرا از inspector شی مشاهده و ویرایش کنید 

سایز collider را به (10, 10) تغییر دادیم 

آموزش Box Collider در یونیتی برای شروع همینقدر کافیست 

player را بعنوان یک prefab ذخیره کنید شما حالا اساس یک بازیکن را دارید

 

Polygon Collider 2D در یونیتی

یونیتی کامپوننت دیگری برای ساخت مرز اشیا آماده کرده است که دقت بیشتری نسبت به Box Collider 2D دارد . Polygon Collider 2D باعث میشود دقیقا دور تا دور اسپریت مرز درست شود نه بصورت مربعی

Rigidbody  در یونیتی

کامپوننت دیگری وجود دارد که میخواهیم به شی مون اضافه کنیم به نام Rigidbody 2D 

این کامپوننت مربوط به موتور فیزیک یونیتی هست و باعث میشود ما بتونیم رویدادهای اصابت شی با اشیای دیگر را نیز پیاده کنیم 

  • Player  را از قسمت Hierarchy انتخاب کنید 
  • کامپوننت Rigidbody 2D را اضافه کنید 

بعد از اجرا مشاهده خواهید کرد که پلایر سقوط میکند و دلیلش هم وجود فیزیک در پلایر هست که باعث میشود جاذبه آنرا جذب کند

RigidBody 2D در یونیتی

شما جاذبه را توانستید پیاده کنید و در بسیاری از بازی ها این به درد شما خواهد خورد ولی چون فعلا به آن نیازی نداریم gravity را از inspector غیر فعال کنید 

شما میتوانید به سادگی مقدار Gravity Scale را به ۰ تغییر دهید و مجددا اگر بازی را اجرا کنید میبیند که سفینه ی ما سقوط نمیکند 

همچنین گزینه ی Fixed Angles را تیک بزنید چون نمیخواهیم پلایر ما توسط نیروهای فیزیک چرخانده شود 

تنظیمات کامل پلایر بازی ما بدین شکل خواهد بود : 

تنظیمات player درون یونیتی

 

حرکت دادن player 

کم کم وقت کدنویسی رسیده است ! تا حالا ما برای هیچ چیزی کدی ننوشته ایم . این هم یکی از قدرت های یونیتی میتونه باشه 

درون یونیتی یک اسکریپت از نوع C#  درون پوشه ی Scripts باز کنید  و نام آنرا PlayerScript بگذارید 

روی اسکریپت کلیک کنید تا توسط Mono Develop باز شود و میتوانید کدهای خود را درون آن بنویسید 

بصورت پیشفرض دو متد درون اسکریپت شما با نام های Start و Update ساخته شده است . این متد ها و متدهایی که در زیر می آیند متدهای پیشفرض Mono هستند که در زمان ها و رویداد های مختلف به اجرا در می آیند . 

  • Awake() زمانی که شی تولید میشود برای اولین بار این متد اجرا میشود . این متد میتواند جایگزین متد سازنده ی کلاس باشد 
  • Start() که بعد از متد Awake() اجرا میشود و تفاوتش با Awake در این هست که متد Start زمانی که اسکریپت غیرفعال (قسمت بالا را به یاد بیاورید که از inspector تیک فعال یک کامپوننت را برمیداشتیم)هست اجرا نمیشود ولی Awake اجرا میشود و تفاوتی ندارد که اسکریپت فعال باشد یا نه !
  • Update() برای هر فریم درون بازی این متد یکبار اجرا میشود 
  • FixedUpdate() در فریم های ثابتی از بازی اجرا میشود . برای کدهایی که با موتور فیزیک یونیتی سروکار دارند بجای استفاده از متد Update باید از این متد استفاده کرد . با توقف زمان اجرای محتویات درون این فریم نیز متوقف میشود
  • Destroy()  زمانی که شی تخریب یا نابود میشود این متد اجرا میشود . این آخرین شانس شما برای پاک کردن یا اجرای عملیات خاصی قبل از نابود شی هست 

تعداد زیادی متد هم برای collisions  ها در یونیتی وجود دارد که در زمان های مختلف میتوانیم آنها را استفاده کنیم : 

  • OnCollisionEnter2D(CollisionInfo2D info)  زمانی اجرا میشود که یک کلایدر دیگر ، شی مورد نظر را لمس یا با آن برخوردی داشته باشد
  • OnCollisionExit2D(CollisionInfo2D info) وقتی اجرا میشود که کلایدر دیگر ، با شی ما هیچ برخوردی نداشته باشد دیگر ! (قبلا حتما باید برخوردی داشته باشد تا این متد اجرا شود)
  • OnTriggerEnter2D(Collider2D otherCollider) دقیقا مثل متد اول هست تنها تفاوتش این هست که وقتی یک کلایدر که نوع Trigger هست به شی جاری ما برخورد بکند 
  • OnTriggerExit2D(Collider2D otherCollider) و این متد هم در ادامه ی متد قبلی زمانی اجرا میشود که کلایدر شی ما را ترک بکند و دیگر با آن هیچ برخوردی نداشته باشد 

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

در ادامه ما به جزئیات هر کدام از این ها خواهیم پرداخت و کاربرد عملی آنها را نشان خواهیم داد 

برای اسکریپت کاراکتر اصلی ما ، ما نیاز داریم که چند کنترل ساده ای را اضافه کنیم . دکمه های جهت که کاراکتر را جابجا میکنند 

using UnityEngine;
/// <summary>
/// Player controller and behavior
/// </summary>
public class PlayerScript : MonoBehaviour
{ /// <summary> /// ۱ - The speed of the ship /// </summary> public Vector2 speed = new Vector2(50, 50); // ۲ - Store the movement and the component private Vector2 movement; private Rigidbody2D rigidbodyComponent; void Update() { // ۳ - Retrieve axis information float inputX = Input.GetAxis("Horizontal"); float inputY = Input.GetAxis("Vertical"); // ۴ - Movement per direction movement = new Vector2( speed.x * inputX, speed.y * inputY); } void FixedUpdate() { // ۵ - Get the component and store the reference if (rigidbodyComponent == null) rigidbodyComponent = GetComponent<Rigidbody2D>(); // ۶ - Move the game object rigidbodyComponent.velocity = movement; }
}

شماره های درون اسکریپت به توضیحات زیر اشاره میکنند . توضیحات هر شماره را بخوانید تا متوجه آن شوید 

توضیحات : 

۱ ما متغیری بعنوان public تعریف کردیم که بتوانیم از درون یونیتی نیز مقدار آن را تغییر دهیم این متغیر برای سرعت کاراکتر ما میباشد 

۲ فیلد هایی که نیاز داریم

۳ ما از axis یا محور های پیشفرض استفاده میکنیم که قابل ویرایش هم هست و میتوانید مجددا تعریف کنید کافیست به Edit>Project Setting>Input بروید

۴ سرعت را به میزان حرکت ضرب میکنیم 

۵ ما نیاز داریم به rigidbody دسترسی داشته باشیم بخاطر همین یک رفرنس به آن درست کردیم که هر فریم مجددا آن را صدا نزنیم 

۶ velocity مربوط به rigidbody را جهت حرکت دادن به کاراکتر تغییر دادیم . این کار به موتور فیزیک اعلام میکند که حرکت را انجام دهد 

تمام عملیات مربوط به فیزیک بهتر است درون متد FixedUpdate() انجام گیرد 

 

خب الان اسکریپ رو ذخیره کنید و با درگ کردن به کاراکتر بازیمون اختصاص بدهید

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

تبریک ! شما فیزیک بازیتون رو هم پیاده کردید 

سعی کنید speed را از درون یونیتی تغییر دهید و مجددا کاراکتر را جابجا کنید تغییر سرعت کاراکتر در بازی یونیتی

 

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

تصویر هشت پای زیر را ذخیره کنید . یک شی جدید بسازید و همانند آموزش قبلی که برای کاراکتر اصلی بازی آموزش دادیم . نام شی را Poulpi و تصویر زیر را به آن اختصاص دهید 

ساخت دشمن در یونیتی

  • تصویر را در پوشه ی sprites کپی کنید 
  • Sprite  با استفاده از این تصویر درست کنید (آموزش قبلا داده شده است)
  • لایه ای به sprite به نام Enemies بدهید 
  • قسمت scale و transform را به (0.3, 0.3, 1) تغییر دهید 
  • یک Box Collider 2D به اندازه ی ۴*۴ بسازید
  • Rigidbody 2D را اضافه کنید و مقدار Gravity Scale را به ۰ و Fixed Angles را تیک بزنید
  • prefab ذخیره کنید و کار تمام هست 

ساخت دشمن در یونیتی

 

اسکریپت : 

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

اسکریپت جدیدی ایجاد کنید و نام آنرا MoveScript قرار دهید 

میتوانستیم EnemyScript را فراخوانی کنیم اما میخواهیم از این اسکریپ در جاهای دیگر هم استفاده بکنیم 

برای ایجاد حرکت در کاراکتر دشمن باید کمی از کدهای اسکریپت PlayerScript را درون اسکریپت MoveScript کپی کنیم  . 

ما مقدار جدیدی را تعریف کردیم که بصورت public هست و از ادیتور یونیتی قابل ویرایش هست که برای مشخص کردن جهت کاراکتر می باشد به نام direction 

using UnityEngine;
/// <summary>
/// Simply moves the current game object
/// </summary>
public class MoveScript : MonoBehaviour
{ // ۱ - Designer variables /// <summary> /// Object speed /// </summary> public Vector2 speed = new Vector2(10, 10); /// <summary> /// Moving direction /// </summary> public Vector2 direction = new Vector2(-1, 0); private Vector2 movement; private Rigidbody2D rigidbodyComponent; void Update() { // ۲ - Movement movement = new Vector2( speed.x * direction.x, speed.y * direction.y); } void FixedUpdate() { if (rigidbodyComponent == null) rigidbodyComponent = GetComponent<Rigidbody2D>(); // Apply movement to the rigidbody rigidbodyComponent.velocity = movement; }
}

 

اسکریپت را ذخیره کنید و به کاراکتر دشمن اختصاص دهید و دکمه ی play را در ادیتور بزنید 

حرگت دشمن در یونیتی

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

درس بعدی : 

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

درس بعدی قصد دداریم چیزهایی که حرکت میکنند را نابود کنیم و برای آن نیاز به مهمات داریم !!!

 

موفق باشید 

عباس نیکزاد 

 



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

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

تیم آموزشی سامنتا 70 نوشته در سامنتا دارد . مشاهده تمام نوشته های

دیدگاه ها


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

  1. عاطفه گفت:

    توضیحات عالی بود ممنون

  2. احمدرضا گفت:

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


    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class PlayerScript : MonoBehaviour {

    public Vector2 speed = new Vector2(50, 50);

    private Vector2 movement;

    private Rigidbody2D rigidbodyComponent;

    void Update()

    {     

    float inputX = Input.GetAxis("Horizontal");

    float inputY = Input.GetAxis("Vertical");

     new Vector2( speed.x * inputX, speed.y * inputY);

    }         

    void FixedUpdate()  

     {         

    if (rigidbodyComponent == null) rigidbodyComponent = GetComponent<Rigidbody2D>();

      rigidbodyComponent.velocity = movement;

        }

    }             

پاسخ دهید

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