آموزش ویدئویی بازی‌سازی با Unity - جلسه پنج: برخورد
1398/02/17 11:27 , میلاد صاحب نظر

آموزش ویدئویی بازی‌سازی با Unity - جلسه پنج: برخورد

در این ویدئو، انواع اتفاقاتی که در هنگام برخورد اشیاء با یکدیگر می‌توانند اتفاق بیفتند را بررسی می‌کنیم و بیشتر با کد نویسی برای برخورد اشیاء آشنا خواهیم شد. با ما همراه باشید!

مقدمه: آشنایی با موتور بازی‌سازی Unity قسمت سوم: حرکات قسمت ششم: GAMEPLAY قسمت نهم: تغییر مراحل و انیمیشن
قسمت اول: اصول اولیه Unity قسمت چهارم: دوربین دنبال‌گر قسمت هفتم: امتیاز‌دهی (SCORE) و UI قسمت دهم: پایان بازی
قسمت دوم: برنامه‌نویسی در Unity قسمت پنجم: برخورد قسمت هشتم: Game Over  

تا اینجای کار ما برخورد و اتفاقاتی که پس از برخورد می‌افتند را به عهده قوانین فیزیک یونیتی گذاشتیم و خودمان هیچ کدی برای تغییر این وضعیت یا اضافه کردن ویژگی‌های خاص اضافه ننوشتیم.

بسیار خب بریم سراغ پروژه بازی خودمان. در پروژه اسکریپتی به نام player movement داریم و می‌توانیم خیلی راحت کدهای مرتبط با برخورد را در آن بنویسیم، اما فعلا برای شفافیت بهتر اجازه دهید یک اسکریپت جدید ایجاد کنیم.

پس روی add a component کلیک کنید، یک نام مثلا player collition برای آن انتخاب کنید، روی new script کلیک کنید، زبان را روی سی‌شارپ تنظیم کنید و روی create and add کلیک کنید تا اسکریپت شما ایجاد شود.

روی اسکریپت دبل کلیک کنید تا وارد ویژوال استودیو شوید. کدهای اضافه مثل دو تگ using همیشگی و هر دو توابع Start و update را حذف کنید.

 برای نوشتن کدهای مرتبط با برخورد، یونیتی یک تابع خاص در اختیار ما قرار داده است که اصطلاحا به آن "وقتی دو شیء برخورد کردند" گفته می‌شود. 

تابع به این شکل نوشته می‌شود: 

()void OnCollitionEnter

}

{

نکته: حتما دقت کنید که بزرگی و کوچکی حروف و همچنین درستی املای کد را رعایت کنید. چون اگر از لحاظ بزرگی و کوچکی حروف اشتباه کنید برنامه یا یک تابع اشتباه را ممکن است در نظر بگیرید یا ارور دهد و اگر املا را اشتباه کنید، هیچ اروری نخواهید داشت اما کد شما نیز اجرا نمی‌شود.

حالا، هر کدی که بین این دو آکولاد نوشته شود، اصطلاحا "وقتی دو شیء با هم برخورد کردند" نامیده می‌شود. حالا اسکریپت را save کنید و به یونیتی بازگردید.

اگر اسکریپت player collition را بگیرید و به هر شیئی اضافه کنید، به شرطی که آن شیء دارای componentهای rigidbody و collide باشند، این تابع در آن‌ها فراخوانی می‌شود. 

می‌توانید برای تست درستی عملکرد تابعتان، یک کد debug.log بنویسید و یک پیام در کنسول چاپ کنید. مثلا چنین پیامی:

Debug.Log("we hit something");

حالا اسکریپت را save کنید و به یونیتی بروید و play کنید ممکن است پیام را در کنسول مشاهده کنید. اگر مشاهده کردید تعجب نکنید، درست است که هنوز هیچ مانعی ایجاد نکرده‌ایم، اما شیء ابتدا با زمین برخورد می‌کند پس احتمالا پیام چاپ می‌شود. اگر نشد یک مانع ایجاد کنید.

برای ایجاد مانع به hierarchy بروید، کلیک راست کنید، به قسمت 3d object بروید و یک cube انتخاب کنید. مثل دفعات قبل transform شیء جدید را reset کنید، و آن را در زمین بازی با فاصله در مقابل شیء قبلی قرار دهید و اندازه آن را به هر روش که دوست دارید تغییر دهید.

نکته: الان شیء شما سفید است. قبلا روش تغییر رنگ و این موارد را توضیح دادیم، اما برای یادآوری دوباره بازگو می‌کنیم: روی پنل پروژه کلیک راست کنید، به بخش create بروید و material را انتخاب کنید.
حالا می‌توانید برای material به وجود آمده نام انتخاب کنید و هر رنگی که می‌خواهید، شفافیت و غیره را تنظیم کنید. 

فراموش نکنید که برای فراخوانی شدن تابع، لازم است که شیء شما دارای دو component اصلی یعنی rigidbody و collide باشد پس حتما در شیء جدید بررسی کنید که این دو وجود داشته باشند.

حالا که مانع را ایجاد کردید، وقتی بازی را play می‌کنید باید حداکثر دو پیام مشاهده کنید: یکی برای برخورد با زمین و دیگری برای برخورد با شیء جدید.

اما این کد فقط به شما پیام برخورد را ارائه می‌دهد. اگر لازم شد بدانید به چه چیزی برخورد کردید آنگاه چه می‌کنید؟

برای حل این مشکل می‌توانید به یونیتی بگویید که دقیقا راجع به چه شیئی اطلاعات می‌‌خواهید. برای این منظور به اسکریپت بروید  در پرانتز و بین آکولد‌های تابعی که ایجاد کردید کدهای زیر را بنویسید:

void OnCollationEnter(Collition collitionInfo)
{
Debug.Log(collitionInfo.name);
}

در تابع بالا، کلیدواژه Collition به یونیتی می‌گوید که ما اطلاعاتی راجع به برخورد یا collition می‌خواهیم. collitionInfo هم نام این اطلاعات است.

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

با این کار، مشخص می‌شود که شیء ما به چه چیزی برخورد کرده است و بسته به این اطلاعات می‌توانیم برای اتفاقات مختلفی که برای برخورد با آن شیء مد نظرمان است کد بنویسیم. برای مثال می‌توانیم بنویسیم:

void OnCollitionEnter (Collition collitionInfo)
{
if(collitionInfo.collider.name == "obstacle")
{
Debug.log("we hit an abstacle");
{
}

تابع بالا همان تابع قبلی است با این تفاوت که درون آن یک شرط if نوشته شده است و این شرط بیان می‌کند که اگر شیئی که با آن برخورد کردیم obstacle نام داشت، آنگاه دستورات درون if را اجرا کن (که در حال حاضر چاپ پیام we hit an obstacle است). 

این کد از نظر فنی هیچ مشکلی ندارد، اما یک لحظه تصور کنید که در آینده یک بازی بزرگ با محیط شلوغ ایجاد کردید و اشیاء زیادی وجود دارند و برخوردها فراوان هستند. آیا می‌خواهید تک‌تک اشیاء را نام ببرید و برای آن‌ها دستور بنویسید؟

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

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

در نتیجه، در این پروژه که فقط با موانع سر و کار داریم، می‌توانیم یک تگ به نام obstacle ایجاد کنیم و آن را به تمام اشیائی که نقش مانع دارند اختصاص دهیم.

برای این منظور به قسمت بالا سمت راست یونیتی بروید و در بخش inspector، گزینه‌ای که نوشته tag را بیابید. حالا اگر روی untagged کلیک کنید، مشاهده می‌کنید که تگ‌های پیشنهادی توسط یونیتی به شما ارائه می‌شوند.

اما ما باید یک تگ به نام obstacle ایجاد کنیم پس روی Add Tag کلیک کنید. روی علامت به علاوه (+) کلیک کنید تا یک ورودی جدید ظاهر شود و نام آن را obstacle بگذارید. 

حالا شیء یا اشیاء مانع را انتخاب و مقدار tag آن‌ها را روی obstacle تنظیم کنید. 

حالا در اسکریپت به جای name بنویسید tag. حالا برنامه به جای اینکه به دنبال نام obstacle باشد، به دنبال تگ obstacle می‌گردد. 

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

آخرین کاری که در این قسمت انجام می‌دهیم این است که وقتی بازیکن با مانع برخورد می‌کند، به جای اینکه به حرکتش ادامه دهد، کاملا متوقف شود. سپس در قسمت‌های بعدی برای آن یک صفحه Game over و قابلیت Restart نیز ایجاد خواهیم کرد.

برای اینکه حرکت شیء پس از برخورد متوقف شود، باید اسکریپت player movement در لحظه برخورد غیرفعال یا خاموش شود.

 برای این منظور،  درون اسکریپت مخصوص برخورد اشیاء به رفرنسی نیاز دارید که به اسکریپت player movement اشاره کند. پس در اسکریپت یک متغیر به شکل زیر ایجاد می‌کنیم:

Public PlayerMovement movement;

متغیر بالا بیان می‌کند که به اسکریپت PlayeMovement اشاره می‌کند و نام آن movement است.

کد را Save کنید و به یونیتی بازگردید، باید یک جایگاه خالی در زیر اسکریپت player collition ببینید که نام آن movement است. حالا فقط کافی است که اسکریپت player movement را drag کنید و درون آن جایگاه رها کنید.

حالا یک رفرنس به اسکریپت player movement ایجاد شد.

حالا به اسکریپت در ویژوال استودیو بروید و به جای دستور Debug کد زیر را بنویسید: 

movement.enabled = false;

در نتیجه، وقتی شیء با مانع برخورد می‌کند، اسکریپت player movement غیر فعال می‌شود.

خلاصه

در این جلسه روش‌های کد نویسی بهینه برای دستورات برخورد اشیاء با همیدگر را آموختید. در جلسه بعدی در مورد game play بازی صحبت خواهیم کرد.

با MUG همراه باشید!

منبع: Brackey

 مطالب مرتبط

 مقدمه ای بر زبان برنامه نویسی #C و پلتفرم NET Framework.
 آموزش گام به گام #C
 طبقه بندی زبان های برنامه نویسی
۷ زبان توسعه بازی Unity برای آموختن: کدام بهترین است؟
۸ بازی ساخته شده با unity توسط تیم‌های کوچک یا تک‌نفره
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامعSQL Server(جلسه۲۳:Stored Procedureها-بخش۳)
آموزش جامعSQL Server(جلسه۲۳:Stored Procedureها-بخش۳)

در جلسه قبل به بررسی عبارات کنترل جریان و cursor در SQL Server پرداختیم. کار با دستورات نام ...

۹ شغل مرتبط با تکنولوژی که نیاز به مهارت کد نویسی ندارند
۹ شغل مرتبط با تکنولوژی که نیاز به مهارت کد نویسی ندارند

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

آموزش مقدماتیHTMLوCSS(جلسه۲۲:سازماندهی داده با جدول–بخش۲)
آموزش مقدماتیHTMLوCSS(جلسه۲۲:سازماندهی داده با جدول–بخش۲)

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

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات