دوره آموزش یونیتی مقدماتی (بخش دوم)
فهرست مطالب
آخرین به روزرسانی در 21/10/2022
در بخش دوم آموزش مقدماتی یونیتی قصد داریم به معرفی و آموزش sprite ها ، transform ، asset های داخلی و در نهایت اسکریپت ها بپردازیم.
پیش نیاز این سری از دوره های آموزشی تسلط به زبان برنامه نویسی سی شارپ می باشد.
آشنایی با Sprites (اسپرایت ها)
اسپرایت ها اشیاء دو بعدی ساده ای هستند که تصاویر گرافیکی (به نام تکسچر) روی خود دارند.
زمانی که موتور در حالت دو بعدی است، یونیتی به طور پیش فرض از اسپرایت استفاده می کند.
اگر یونیتی در فضای سه بعدی باشد، اسپرایتها مانند کاغذ نازک به نظر میرسند، زیرا فاقد محور Z هستند.
اسپرایت ها همیشه با زاویه عمود به دوربین رو به رو هستند مگر اینکه در فضای سه بعدی بچرخند.
هر زمان که یونیتی یک sprite جدید می سازد، از یک تکسچر استفاده می کند.
سپس این تکسچر روی یک GameObject جدید اعمال می شود و یک کامپوننت Sprite Renderer به آن متصل می شود.
این باعث میشود که GameObject ما با تکسچر ما قابل مشاهده باشد، و همچنین ویژگیهای مربوط به ظاهر آن روی صفحه را به آن میدهد.
برای ایجاد یک اسپرایت در یونیتی باید موتور را با یک تکسچر تامین کنیم.
اجازه دهید ابتدا تکسچر خود را ایجاد کنیم. یک فایل تصویر استاندارد مانند PNG یا JPG را که میخواهید استفاده کنید فراهم کنید، آن را ذخیره کنید و سپس تصویر را به قسمت Assets Unity بکشید.
بعد، تصویر را از Assets به Scene Hierarchy صحنه بکشید. متوجه خواهید شد که به محض رها کردن دکمه ماوس ، یک GameObject جدید با نام texture (تکسچر) شما در لیست ظاهر می شود.
همچنین اکنون تصویر را در وسط صفحه در نمای صحنه خواهید دید.
لازم به ذکر است هنگام ایجاد یک sprite باید نکات زیر را در نظر بگیریم :
- با کشیدن از یک منبع خارجی به Unity، یک assets نیز اضافه می کنیم.
- این asset یک تصویر است، بنابراین تبدیل به یک تکسچر می شود.
- با کشیدن این تکسچر به Scene Hierarchy ، یک GameObject جدید با همان نام تکسچر خود و با یک Sprite Renderer ایجاد می کنیم.
- این رندر sprite از آن تکسچر برای ترسیم تصویر در بازی استفاده می کند.
دستکاری اسپرایت ها
اسپرایتی که وارد کرده ایم را نیز می توان به روش های مختلفی دستکاری کرد تا ظاهر آن را تغییر دهد.
اگر به گوشه سمت چپ بالای رابط موتور نگاه کنید، یک نوار ابزار مطابق شکل زیر پیدا خواهید کرد.
عملکرد این ابزارها به ترتیب به شرح زیر می باشد :
ابزار Hand برای حرکت در صحنه بدون تأثیر بر هیچ شیئی استفاده می شود.
ابزار Move برای جابجایی اشیاء در دنیای بازی به اطراف استفاده می شود.
در وسط کار ابزار Rotate را داریم تا اشیا را در امتداد محور Z دنیای بازی (یا شی والد) بچرخانیم.
ابزار Scaling به شما امکان می دهد اندازه (مقیاس) اشیاء را در امتداد محورهای خاص تغییر دهید.
در نهایت ابزار Rect را داریم. این ابزار مانند ترکیبی از ابزار Move و Scaling عمل می کند، اما با دقت کمتری می باشد.
لازم به ذکر است در چیدمان عناصر UI مفیدتر است.
Transform ها و Object Parenting
Transform ها دارای سه ویژگی قابل مشاهده هستند : موقعیت، چرخش و مقیاس.
هر کدام از اینها سه مقدار برای سه محور دارند.
بازیهای دوبعدی معمولاً در مورد موقعیتیابی روی محور Z تمرکز نمیکنند.
رایج ترین استفاده از محور Z در بازی های دو بعدی در ایجاد اختلاف منظر است.
ما مفهوم ویژگی های مقیاس ، چرخش و موقعیت را در بخش اسپرایت توضیح دادیم.
در واقع تمرکز ما در این بخش Object Parenting می باشد.
Object Parenting چیست ؟
در Unity، اشیا از یک سیستم سلسله مراتبی پیروی می کنند.
با استفاده از این سیستم، GameObjects می تواند به “والد” GameObject های دیگر تبدیل شود.
هنگامی که یک GameObject یک والد داشته باشد، تمامی حرکات و transform هارا از والد خود ارث بری و به اصطلاح تقلید می کند.
GameObject ها را می توان به سادگی با کشیدن و رها کردن آنها روی والد مورد نظر، والد کرد.
یک شی ” child ” (شیئی که زیر مجموعه ی والد است) در لیست شی با یک فرورفتگی کوچک همراه با یک فلش در کنار شی والد به تصویر کشیده می شود.
Parenting GameObjects کاربردهای بسیار زیادی دارد.
به عنوان مثال شما یک تانک را در نظر بگیرید.
تمام قسمتهای مختلف یک تانک میتوانند GameObjectهای مجزا باشند که تحت یک GameObject به نام تانک قرار میگیرند.
به این ترتیب، هنگامی که این GameObject والد “تانک” حرکت می کند، تمام قطعات همراه با آن حرکت می کنند زیرا موقعیت آنها به طور مداوم مطابق با والد آنها به روز می شود.
Internal Assets
در کنار Assets های خارجی که از برنامه های دیگر مانند فایل های صوتی، تصاویر، مدل های سه بعدی و … وارد می کنید، یونیتی به شما قابلیت استفاده و ساخت asset های داخلی را نیز می دهد.
این asset ها در خود یونیتی ایجاد می شوند و به این ترتیب نیازی به هیچ برنامه خارجی برای ایجاد یا تغییر ندارند.
چند نمونه از مهم ترین asset های داخلی به شرح زیر می باشد :
Scenes : این asset ها به عنوان مراحل بازی مورد استفاده قرار می گیرند.
Animations : این ها حاوی داده هایی برای انیمیشن های GameObject هستند.
Materials : اینها چگونگی تأثیر نور بر ظاهر یک شی را مشخص می کنند.
Scripts : کدی که برای GameObjects نوشته می شود.
Prefabs : اینها به عنوان نقشه برای GameObjects عمل می کنند تا بتوانند در زمان اجرا تولید شوند.
چند asset مهم دیگر عبارتند از Placeholder، Sprites وModels اینها زمانی استفاده میشوند که به متغیرهای سریع نیاز دارید، بنابراین ممکن است بعداً با گرافیکها و مدلهای مناسب جایگزین شوند.
برای ایجاد یک Internal Assets ، در پوشه Assets کلیک راست کرده و به Create بروید.
در این مثال یک مثلث و یک مربع ایجاد می کنیم.
روی بخش Sprites بروید و روی Triangle کلیک کنید.
این روند را برای Square تکرار کنید و باید در نهایت دو asset گرافیکی جدید داشته باشید.
( در ادامه ی این دوره ی آموزشی به مرور با asset های بیشتری آشنا خواهیم شد.)
اسکریپت ها در یونیتی
وارد کردن یک سری تصاویر و آبجکت های ثابت در بازی بدون هیچ کنترل خاصی اصلا جذابیتی ندارد.
اسکریپت برای بازی سازی در یونیتی ضروری است.
اسکریپتنویسی فرآیند نوشتن بلوکهای کد است که مانند اجزایی به GameObjects در صحنه متصل میشوند.
اسکریپت یکی از قدرتمندترین ابزارهایی است که در اختیار شماست و می تواند هسته ی اصلی یک بازی را بسازد.
اسکریپت نویسی در یونیتی از طریق زبان برنامه نویسی C# یا اجرای Unity از جاوا اسکریپت، معروف به UnityScript انجام می شود (اما، با cycle 2018، UnityScript اکنون در مرحله منسوخ شدن قرار دارد، بنابراین توصیه می شود از آن استفاده نکرده و سی شارپ بهترین گزینه است).
برای ایجاد یک اسکریپت جدید، روی Assets خود راست کلیک کرده و به Create → C# Script بروید.
همچنین می توانید از تب Assets در نوار بالای یونیتی استفاده کنید.
هنگامی که یک اسکریپت جدید ایجاد می کنید، یک Asset جدید باید نمایش داده شود.
فعلاً نام را همانطور که هست بگذارید و روی آن دوبار کلیک کنید.
IDE پیش فرض شما باید همراه با اسکریپت باز شود.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
}
}
نام اسکریپت خود را به صورت کلاسی می بینید که از MonoBehaviour برگرفته شده است.
MonoBehaviour چیست؟ این یک کتابخانه وسیع از کلاس ها و متد ها می باشد.
این کمک می کند تا تمام اسکریپت های موجود در Unity از یک راه یا روش دیگر برگرفته شوند.
هر چه بیشتر اسکریپت ها را در Unity بنویسید، بیشتر متوجه می شوید که واقعاً MonoBehaviour چقدر مفید است.
همانطور که ادامه می دهیم، دو اسکریپت خصوصی داریم که هیچ نوع بازگشتی ندارند، یعنی متدهای Start و Update متد Start یک بار برای اولین فریمی که gameObject که روی آن استفاده می شود در صحنه فعال است اجرا می شود.
متد Update هر فریم بازی را بعد از متد Start اجرا می کند.
به طور معمول، بازیهای Unity با سرعت 60 فریم در ثانیه یا فریم بر ثانیه اجرا میشوند.
به این معنی که در زمانی که شی فعال است، متد Update 60 بار در ثانیه فراخوانی میشود.
اسکریپت نویسی Unity به شما این امکان را می دهد که از کل کلاس MonoBehaviour و همچنین ویژگی های اصلی C# مانند مجموعه های عمومی، عبارات lambda وparsing XML استفاده کنید.
اسکریپت ها و transform
در این بخش، کدی را می نویسیم که باعث می شود GameObject بر اساس ورودی (کنترلر) کاربر به بالا، پایین، چپ و راست حرکت کند.
این مثال به شما کمک می کند پروسه ی اسکریپت نویسی در یونیتی را بهتر بیاموزید.
به یاد داشته باشید که هر GameObject حداقل یک جزء دارد.
نکته ی لازم به ذکر این است که Transform یک GameObject نیز به عنوان متغیر در سمت اسکریپت یونیتی نشان داده می شود تا بتوانیم آن را از طریق کد تغییر دهیم.
این به Transform نیز محدود نمی شود. همه کامپوننت های یونیتی دارای ویژگی هایی هستند که از طریق متغیرهای موجود در اسکریپت قابل دسترسی هستند.
اجازه دهید تمرین خود را شروع کنیم.
یک اسکریپت جدید ایجاد کنید و نام آن را “Movement” بگذارید.
حالا اسکریپت را باز کنید و باید همان چیزهایی را که در بخش گذشته دیدید ببینید.
اجازه دهید یک متغیر float عمومی به نام speed ایجاد کنیم.
عمومی کردن یک متغیر در Unity یک مزیت بزرگ دارد و این است که متغیر به عنوان یک فیلد قابل تغییر در ویرایشگر نشان داده میشود، بنابراین نیازی به تنظیم دستی مقادیر در کد ندارید.
public class Movement : MonoBehaviour {
public float speed;
}
اگر این اسکریپت را بدون استفاده از روش های دیگر ذخیره کنیم، باید در Unity کامپایل شود.
(می توانید زمان کامپایل شدن آن را توسط Buffericon در گوشه سمت راست پایین مشاهده کنید.)
سپس اسکریپت را از Assets روی GameObject بکشید و رها کنید.
اگر آن را به درستی انجام دهید، این همان چیزی است که باید در ویژگی های GameObject مشاهده کنید.
از آنجایی که مقدار سرعت قابل تنظیم است و نیازی به تغییر کد دائمی نیست، می توانیم در اسکریپت نویسی یونیتی به جای () start از متد () update استفاده کنیم.
ورودی کاربر را بررسی کنید.
اگر ورودی کاربر وجود دارد، دستورالعمل های ورودی را بخوانید.
مقادیر موقعیت حرکت جسم را بر اساس سرعت و جهت آن تغییر دهید.
برای انجام این کار، کد زیر را اضافه می کنیم.
void Update() {
float h = Input.GetAxisRaw(“Horizontal”);
float v = Input.GetAxisRaw(“Vertical”);
gameObject.transform.position = new Vector2 (transform.position.x + (h * speed),
transform.position.y + (v * speed));
اکنون اجازه دهید در مورد کد بالا توضیحاتی را ارائه دهیم.
ابتدا یک متغیر float به نام h برای حرکت افقی تعریف می کنیم.
و مقدار آن با روش Input.GetAxisRaw داده می شود.
این روش بسته به اینکه بازیکن کدام کلید را روی فلش های بالا/پایین/چپ/راست فشار داده است، -1 ، 0 یا 1 را برمی گرداند.
کلاس Input وظیفه دریافت ورودی از کاربر به صورت فشار کلید، ورودی ماوس، ورودی کنترلر و غیره را بر عهده دارد.
درک متد GetAxisRaw کمی سختتر است، بنابراین بعداً و در آموزش های بعدی به آن خواهیم پرداخت.
در مرحله بعد، ما موقعیت GameObject خود را به موقعیت جدیدی که با ایجاد Vector2 جدید تعریف شده است، به روز می کنیم.
Vector2 دو پارامتر می گیرد که به ترتیب مقادیر x و y آن هستند.
برای مقدار x، مجموع موقعیت فعلی جسم و سرعت آن را ارائه می کنیم، به طور موثری مقداری را به هر فریمی که کلید فشار داده می شود به موقعیت آن اضافه می کنیم.
این اسکریپت را ذخیره کنید و به Unity برگردید.
یونیتی پس از کامپایل شدن با موفقیت تمام اسکریپتها را بهطور خودکار بهروزرسانی میکند، بنابراین نیازی نیست که اسکریپت را دوباره و دوباره وصل کنید.
اکنون که کارتان تمام شد، مقدار سرعت را در ویژگی های GameObject به 0.8 تغییر دهید.
این مهم است زیرا مقدار بالاتر باعث می شود بازیکن خیلی سریع حرکت کند.
اکنون، روی Play کلیک کنید و اولین بازی کوچک خود را مشاهده کنید.
سعی کنید کلیدهای جهت دار را فشار داده و در اطراف صحنه حرکت کنید.
برای توقف بازی، کافی است دوباره Play را فشار دهید.
حتی میتوانید سرعت را به صورت ریل تایم تنظیم کنید تا مجبور نباشید همیشه آن را متوقف و شروع کنید.
مهرشاد شادان مهر
مدرس سئو ، طراح سایت ، انیماتور
قهرمان زندگی شما در چند سال آینده ی شما می باشد