صفر تا صد برنامه نویسی به زبان سی شارپ در یونیتی
اسکریپت نویسی مقدماتی به زبان #C در Unity
دیگر فکر کردن به آرزوهایتان کافی است! همین الان برای ساخت بازی خودتان قدم در مسیر حرفهای بگذارید!
محدودیتهایی که برای ساخت بازی جلویتان را میگیرند، کنار بزنید و برنامهنویسی یاد بگیرید تا بتوانید بازی خودتان را بسازید!
اگر به ساخت بازی علاقهمند هستید و دوست دارید بازیِ خودتان را بسازید، بارها پیش آمده که با محدودیتهایی روبرو شدید و ناچار بودید اسکریپتنویسی کنید. احتمالا فکر میکنید باید زمان بسیار زیادی صرف کنید تا وارد دنیای برنامهنویسی شوید باید بگوییم که به هیچ وجه اینطور نیست. مطمئن باشید با دنبال کردنِ آموزشهای این دوره متوجه خواهید شد که از همان ابتدای کار مشغول برنامهنویسی هستید و کاری که از ورود به آن ترس داشتید برایتان لذتبخش خواهد شد.
تردید و جستجو را تمام کنید و همین الان ساخت بازی خودتان را شروع کنید!
آیا تا به حال ایدهای برای ساخت بازی داشتهاید اما نمیدانستید که چطور داراییهایتان را به کُد متصل کنید و دقیقا چیزی که میخواهید را پیادهسازی کنید؟
آیا فکر میکنید برنامهنویسی یک کار جادویی است یا برنامهنویس ها افراد نابغهای هستند و هر کسی نمیتواند برنامهنویس باشد؟ پس این دوره برای شما تهیه شده تا ببینید که با یادگیریِ اصولِ برنامهنویسی به راحتی میتوانید واردِ دنیای برنامهنویسی شوید تا رویاهای خودتان را به بازی تبدیل کنید.
حتی اگر برنامهنویسی را به تازگی شروع کردهاید و میخواهید مطمئن شوید که تمامیِ اصول پایهای برنامهنویسی و اسکریپتنویسی را بدانید، این دوره چیزی است که دنبالش هستید. این مجموعهی ویدیوهای آموزشی، منبعِ باارزشی از مفاهیمِ پایهایِ اسکریپتنویسی برای ساختِ بازی با یونیتی است.
Unity موتور قدرتمند بازیسازی
موتور بازیسازی (Game Engine) یونیتی (Unity) یک نرمافزار قدرتمند در زمینه بازیسازی به حساب میآید که امکانات زیاد و متنوع، جامعهی فعال و بزرگی از کاربران، پشتیبانی و به روز رسانیهای متعدد آن را همواره در زُمرهی بهترین موتورهای بازیسازیِ دنیا قرار داده است.
بازیسازی با یونیتی بسیار جذاب و لذتبخش است و شما با یونیتی میتوانید هر ایدهای که در سر دارید را به راحتی تبدیل به بازی کنید. فرقی نمیکند بازیتان دوبعدی باشد یا سه بعدی، با یونیتی به راحتی میتوانید آن را بسازید.
سی شارپ (#C) نیز یکی از محبوبترین زبانهای برنامهنویسی مورد استفاده است که برای اسکریپتنویسی در یونیتی از آن استفاده میکنیم.
قدرت یونیتی
در وصف قدرت یونیتی همین بس که از این موتور در بزرگترین شرکتهای بازیسازی دنیا و در ساخت بازیهای به نامِ زیادی استفاده شده است. بازیهایی نظیر Hearthstone, Monument Valley, Ori and The Blind Forest, Inside, Cuphead, بازی ایرانی Children of Morta (که برای PC و کنسولهای PS4 و Nintendo Switch ساخته شده است) و بسیاری از بازیهای دیگر همگی با گیم انجین یونیتی ساخته شدهاند.
آموزش صفر تا صد برنامهنویسی به زبان سی شارپ در یونیتی فقط یک ادعا نیست!
یکی از نگرانیها در مورد آموزشهای صفر تا صد فارسی این هست که آیا واقعا صفر تا صد هستند؟
آیا آموزشها تمام امکانات موجود در ابزار را به طور کامل بررسی میکنند؟
آیا این پکیجها ارزش قیمتی را که باید برای آنها بپردازیم دارند؟
در ادامه به صورت کامل این دوره آموزشی را معرفی میکنیم. تمام تلاشمان را کردهایم تا بعد از پرسیدنِ هرکدام از سوالهای بالا در مورد این پکیج جوابی جز یک “بله” قاطعانه از شما دریافت نکنیم.
تمام قسمتهای این آموزش علاوه بر توضیحاتِ نظری، در قالب مثالهای عملی در موتور بازیسازی یونیتی پیادهسازی شدهاند. بنابراین در این دوره برخلاف دورههای رایج که مفاهیمِ برنامهنویسی فقط به صورت تئوری بیان میشوند یا مثالهایی غیرمرتبط به بازیسازی دارند، شما در هر قسمت که با یک مفهوم یا دستور برنامهنویسی آشنا میشوید، پیادهسازی آن را در قالب مثالی مرتبط به بازی و بازیسازی در یونیتی میبینید. پس علاوه بر یادگرفتنِ تمامی سرفصلهای پایهای و مورد نیاز برای شروعِ برنامهنویسی، مثالهای کاربردی از آنها در بازیسازی را فرامیگیرید.
بعد از مشاهده ی این دوره، نه تنها میتوانید به راحتی اسکریپتهای پایهای بنویسید، بلکه آماده هستید که به اسکریپتنویسیِ پیشرفته تر در یونیتی وارد شوید.
مجموعه صفر تا صدِ برنامهنویسی به زبان سیشارپ در یونیتی شامل سه پکیج در سه سطح مقدماتی، متوسط و پیشرفته است که به مرور جهت تهیه بر روی سایتِ بازی ساز باش قرار میگیرند. در این مطلب به توضیح مفصل در رابطه با دوره اول یعنی اسکریپتنویسی مقدماتی در یونیتی میپردازیم.
در این دوره شما با مفاهیمِ پایهای مثل اصولِ برنامهنویسی شیء گرا (object-oriented)، کلاسها، توابع، متغیرها، کار با ورودیها، انواع عملگرها، پیادهسازی منطق بازی با استفاده از عبارات شرطی، حلقهها و توابع یونیتی، ریاضیات بردارها و موارد دیگر آشنا میشوید و آنها را در عمل استفاده میکنید.
سرفصلهای صفر تا صد برنامهنویسی به زبان سیشارپ در یونیتی
1- اصول و مقدمات اسکریپت نویسی
در این فصل ابتدا با متغیرها (Variables) و انواع آنها آشنا میشویم. سپس سراغ انواع عملگرها (عملگرهای ریاضی (Arithmetic Operators)، عملگرهای تخصیص (Assignment Operators)، عملگرهای مقایسهای (Comparison Operators)، عملگرهای منطقی (Logical Operators)) میرویم. در ادامه سراغ تعریف تابع (Function) و عملکرد آن و برخی از توابع یونیتی خواهیم رفت. در انتها به سراغ تعریف کلاس (Class) و کاربرد آن در قالب یک مثال کاربردی میرویم.
2- کنترل مسیر حرکتِ کُد
در این بخش دستوراتی را یاد میگیریم که با استفاده از آنها میتوانیم ترتیب اجرای دستورات و خطوط کُد را تغییر دهیم.
بعضی مواقع نیاز داریم با بررسیِ شرایط، دستوراتی را اجرا کنیم یا اجرا نکنیم که میتوانیم از شروط استفاده کنیم، یا برخی اوقات لازم داریم که یکسری از دستورات را به دفعات متعدد اجرا کنیم که در این مواقع حلقهها به کمک ما میآیند تا از تکرار جلوگیری کنند.
در این قسمت دستورات شرطی و حلقههای مختلف را یاد میگیریم.
3 کار با ورودیها
بازی به عنوان یک رسانهی تعاملی، شاملِ دریافت ورودی، پردازش و نمایشِ خروجی است که ورودی گرفتن یکی از بخشهای اساسیِ بازی است.
در این بخش روشِ گرفتنِ ورودی (input) و استفاده از آن را با استفاده از توابع GetButton ،GetKey و GetAxis آموزش میدهیم.
4- ریاضیات بردارها
بردارها یکی از مهمترین اِلِمان ها از اصول گرافیک کامپیوتری و بازیها هستند و یادگیری اصولی و دقیقِ آنها لازم و ضروریست. به علت این که برداشتِ صحیح از بردارها و عملیاتِ روی آنها، نیاز به درکِ فضایی و سه بُعدی دارد معمولاً آموزشهای موجود و کتابها آن را به خوبی منتقل نمیکنند. در این بخش از آموزش، تئوریها، تعاریف و عملیاتها با استفاده از انیمیشنها و تصاویرِ پویا قابل فهمتر و جذابتر شدهاند.
در این بخش با تعریف بردار شروع میکنیم و در ادامه بُردارهای دو بُعدی (2D Vectors) و بُردارهای سه بُعدی (3D Vectors) را به صورت پویا و مُصَوَّر میآموزیم. در انتها نیز عملیاتهای مهمِ بردارها را در محیط یونیتی پیادهسازی میکنیم تا این موارد به صورت عملی درک شوند.
5- توابعِ پرکاربردِ Transform
کلاسِ Transform، یکی از کاربردیترین کلاسهای یونیتی است. با استفاده از این کلاس ما میتوانیم اشیاءِ داخل بازی را جا به جا کنیم، بچرخانیم یا بزرگ و کوچک کنیم. در این بخش توابعِ Translate ،Rotate و LookAt را با نمونههای عملی بررسی میکنیم.
6- درون یابیِ خطی
با عملیاتِ درون یابیِ خطی (Linear Interpolation) در ریاضیات آشنا میشویم و کاربردِ آن در بازی سازی را در قالب مثال هایی در یونیتی پیاده سازی میکنیم.
7- تعامل با Game Object ها
در یونیتی هر موجودیت یا شئ به صورت یک گِیم آبجکت (Game Object) تعریف میشود که ویژگی های آن به عنوان اجزائی (Components) به آن اضافه میشوند. با استفاده از توابعی که برای کار کردن با این گیم آبجکت ها وجود دارند میتوان به گیم آبجکت های دیگر دسترسی داشت، گیم آبجکت های جدید ساخت یا آنها را حذف کرد.
sinapirzade3 (مالک تایید شده) –
دوره ی خوبیه.
اگه میخایین برنامه نویسی رو به خاطر بازی سازی یاد بگیرین قطعا این دوره عالیه براتون توضیح مدرس هم عالیه بهترین قابلیتش هم اینکه مدرس توی مدت کم آموزش رو داده و این واقعا خوبه 🤩
چون واقعا آموزش زبان سیشارپ یکم کار سختیه ولی با این آموزش ، خیلی راحت میشه یادش گرفت
از نظر من که عالی بود
امیر نظری –
سلام دوست عزیز
خوشحالیم که آموزش های بازی ساز باش براتون مفید بوده. امیدوارم در ادامه مسیر تبدیل رویای خودتون به بازی موفق باشید.
محمدعلی (مالک تایید شده) –
سلام نظر شخصیم رو در رابطه با این دوره بگم:
تمام دروس تئوری دارای یک پاورپوینت به همراه توضیحات کامل هستش اما اگر از برنامه نویسی هیچی سرتون نمیشه این دروس تئوری یک مقداری سخت توضیح داده شده، به صورتی که مثلا های متعددی زده شده که اغلب به دلیل متفاوت بودن از بحث جدا میشه.
برای همین از ابتدا تا ورودی ها این مورد وجود داره و بعضاً اذیت می کنه.
من هیچکدوم از فایل ها درس ها نتونستم دانلود کنم و همش ارور 404 داشت.
از درس ورودی ها به بعد که کار های عملی با موتور یونیتی بیشتر شد بسیار تدریس روان تر و بهتر شد.
در کل اگر یک پیش زمینه برنامه نویسی بسیار ساده داشته باشید این دوره در ادامه به شما توابع بسیار مهم و کاربردی یونیتی رو تدریس میده (البته اگر یک مقداری توابع بیشتری تدریس میشد خیلی کامل تر بود)
در رابطه با قیمت بنده این دوره رو در تخفیف خریداری کردم و به نظرم 300 تومن برای 5 ساعت یک مقداری زیاد است با توجه به اینکه دوره مقدماتی است.
درس 39 به دلیل هم نام بودن متغیر ها و گیم آبجکت ها نامفهوم بود.
perfectmohsen (مالک تایید شده) –
من یه سوالی دارم، به این کلاس نگاه کنید
public class Car
{
;public int speed
}
بعد داخل کد این طور می نویسم
public class Class_Test : MonoBehaviour
{
;public Car pride
void Start()
{
;Pride.score = 5
;print(“speed is ” + Car.speed)
}
الان من یه متغیر به نام pride از کلاس Car ساختم
بعد با وجود اینکه از دستور new استفاده نکردم داخل
ویژوال استودیو به فیلد یا اتریبوت speed دسترسی دارم… آیا من در این مرحله بدون نوشتن دستور New از کلاس کار یه نمونه ساختم که داخل ویژوال استودیو بدون مشکل به فیلد داخل کلاس car دسترسی دارم؟
سوال دوم اینکه داخل ویژول استودیو بدون دستور new به فیلد speed دسترسی دارم ولی داخل یونیتی با این مشکل موجه می شم..
NullReferenceException: Object reference not set to an instance of an object
خوب پس بالاخره من بدون ساختن نمونه با استفاده از newیه نمونه از کلاس ساختم یا نه، اگه نساختم پس چرا به فیلد speed از کلاس Car داخل ویژوال استودیو دسترسی دارم? اگه نمونه نساختم چرا یونیتی این ایراد می گیره؟ وقتی از دستور new استفاده می کنم و یه نمونه از کلاس car می سازم دیگه unity این ایراد رو نمی گیره
مهدی صدری –
سلام دوست عزیز
سوالی که شما مطرح کردین مربوط به موضوع تخصیص حافظه پویا به یک متغییر از کلاس هست.
جنس متغییرهای کلاس از جنس متغییرهای Reference Type هستند نه Value Type به این معنی که وقتی شما یک متغییر از یک کلاس تعریف میکنین، تا زمانی که از دستور New استفاده نکنید، در زمان اجرای برنامه، حافظهای برای متغییر شما در Memory اختصاص داده نمیشه. برای همین یونیتی در زمان اجرا پیغام خطا داده.
اینکه در زمان نوشتن کد به خصیصههای کلاس دسترسی دارین به این خاطر هست که در این زمان نیازی به دریافت حافظه نیست و حافظه ی مورد نیاز متغییرهای کلاس در زمان اجرای برنامه تخصیص داده میشن.
jalal.a.51214 (مالک تایید شده) –
سلام
یک ابهام وجود داره که ممنون میشم بفرمایید.
در (5.2.1-Translate_And_Rotate) گفته شد چون اسکریپت رو به همون ابجکتی میدیم که کامپوننت Transform رو داره پس میشه با نوشتن transform به این کامپوننت دسترسی داشت، که انجام میشه و همه چیز خوبه.
ولی در (5.3-Linear_Interpolation) برای دسترسی داشتن به کامپوننت Light باید یک پابلیک لایت تعریف کنیم و کامپوننت رو به اسکریپت نسبت بدیم و غیر از این حالت ارور میده.
لطفا بفرمایید چرا این دو متفاوت هستند و چرا؟
ممنون
مهدی صدری –
سلام و درود بر شما
پاسخ سوال شما مربوط به حوزه پیشرفتهتر هست و نیاز به دونستن اطلاعات تخصصیتر از علم برنامهنویسی داره که در آموزشهای متوسط و پیشرفتهی این دوره آموزشی بهشون پرداخته میشه. این مقدمه رو گفتم که اگر پاسخی که در ادامه میگم رو متوجه نشدید نگران نباشید چون باید برخی از مطالب پیشرفتهتر رو یاد بگیرید.
از اونجاییکه تمام گیمآبجکتها کامپوننت Transform رو به صورت پیشفرض دارند و این کامپوننت کاربرد زیادی داره، توسعه دهندگان یونیتی متغیری به عنوان پیشفرض در کلاس Component (که کلاس MonoBehaviour از اون ارثبری میکنه) قرار دادن که دیگه لازم نباشه برای دسترسی به کامپوننت Transform ِ گیمآبجکت در هر اسکریپت یک متغیر از این کلاس تعریف کنیم. بنابراین با استفاده از نام این متغیر که transform هست (هم نام با کامپوننت Transform با این تفاوت که حرف اول آن کوچک است) میتونیم به کامپوننت Transform دسترسی داشته باشیم. در صورتی که از کامپوننتهای دیگه مثل Light که مثال زدید به صورت پیشفرض متغیری تعریف نشده و باید برای دسترسی به اینها خودمان متغیرشون رو تعریف کنیم.
جلال (مالک تایید شده) –
سلامی دیگر بار
ممنون از توضیحاتتون
همچین توضیحاتی مختصر و مفیدی از کلاس ها و توابعی که بار اول ازشون استفاده میشه لازمه بنظرم. ماهیت چیزی رو باید یاد گرفت تا بشه استفاده کرد.
من فقط یک اشکال دیگه داشتم اگه بشه راهنمایی کنید خوب و عالی میشه …
بنده اول visual studio رو ریختم و اشکالی داشتم که monobehaviour رو نمی فهمید.
بعدش پاکش کردم و vs code رو ریختم و کلا اوکی شد.
الان va code کتابخونه unity رو میفهمه ولی موقع کد زدن پیشنهاداتش رو نمیاره.
Expentions ها رو هم درست نصب کردم ولی کاری نتونستم از پیش ببرم. اگر تجربه ای در این رابطه دارید خوشحال میشم در اختیار بزارید.
باتشکر
مهدی صدری –
سلام دوست عزیز
خواهش میکنم
بله درسته، بابت پیشنهادتون ممنون. حتما بیش از پیش لحاظ میکنم.
در مورد مشکلی که با IDE ویژوآل استودیو پیدا کردید، پیشنهاد میکنم به لینک زیر بروید و .NET Framework 4.6 Targeting Pack رو دانلود و نصب کنید:
https://www.microsoft.com/en-us/download/details.aspx?id=48136
jalal.a.51214 (مالک تایید شده) –
سلام
مقدار زیادی از قسمت 5.1.3-Vector_Math_In_Unity مبهم بود به عنوان مثال با کلاس Transform، Vector3 اشنا نشدم. بنظر لازم میاد قبل از استفاده توضیحاتی در مورد این ها داده شود. یا نوع استفاده از تابع localScale هنوز برای من نامفهوم بنظر میرسه. بطور کلی با اینکه طریقه استفاده از این کلاس ها رو به طور عملی دیدم ولی هنوز نمی تونم به صورت مستقل از اون ها استفاده کنم و این یعنی یاد نگرفتم.
مهدی صدری –
سلام دوست عزیز
امیدوارم حالتون خوب باشه
در مورد عناوینی که مطرح کردید در ابتدا باید بگم که ریاضیات بردار و مفاهیم مرتبط به این سرفصل نیازمند به داشتن پیشزمینهای از علم ریاضیات(حداقل در حد ریاضیات دبیرستان) هست و همونطور که مشاهده کردید در ویدیوهای مربوط به بردارها تمام سعیمون رو کردیم تا این مفاهیم رو سادهسازی کنیم و عملکرد توابع ریاضیاتی بردارها رو به صورت تصویری و جذاب بیان کنیم تا اگر مخاطب اطلاعات کمی از عملیاتهای ریاضیاتیاش داره، کاربرد مبحث رو یاد بگیره. در جهت تایید این ادعا همین بس که طولانی ترین ویدیوها و پاورپوینتها مربوط به همین مبحث هست.
بنابراین پیشنهاد میکنم اگر محاسبات انجام شده براتون خیلی مبهم هست، نگاهی به دروس جبر خطی ریاضیات بیاندازید.
اما در مورد کلاسهای Vector3 و Transform، توضیحاتی که مناسب با سطح مقدماتی دوره بوده در ویدیوهای این دوره گفته شده (به عنوان مثال در مورد کلاس Transform در قسمت 5.2.1-Translate_And_Rotate توضیح داده شده) . اما اگر بخوام به صورت خلاصه مرور کنم، کلاس Transform اطلاعات و عملیات مربوط به مکان، زاویه و ابعاد یک آبجکت در یونیتی رو داره.
کلاس Vector3 همونطور که از اسمش مشخصه مربوط به بردارهای سهبُعدی و عملیات آنهاست.
تعریف این کلاسها به همین اندازه کوتاه هست و اتفاقا استفاده از اونهاست که باعث میشه کاربردشون رو بهتر یادبگیریم. بنابراین مدل طراحی این دوره به شکلی بوده که تمرکز بر کاربرد کلاسها و توابع و تمام عناوینی باشه که در طول دوره ارائه میشه.
اگه اطلاعات بیشتری از جزئیات این کلاسها میخواین بدونین پیشنهاد میکنم به توضیحاتشون در مستندات یونیتی مراجعه کنید:
https://docs.unity3d.com/ScriptReference/Transform.html
https://docs.unity3d.com/ScriptReference/Vector3.html
در مورد localScale ، در این قسمت (که مربوط به ضرب دوبردار بود) فقط جهت نمایش نتیجهی ضربها نیاز به استفاده از localscale بوده؛ نه در عنوان و نه در محتوای تئوریِ درس هیچ نامی از این پارامتر برده نمیشه چون قرار نیست در این قسمت از آموزش بهش پرداخته بشه. برای همین اصلا از این بابت نگران نباشید چون ارتباط مستقیم با مطالب این درس نداره و به همین دلیل هم به صورت کوتاه بهش پرداخته شده.
امیدوارم توضیحاتم کافی بوده باشه.
اگر هنوز هم ابهام یا سوالی دارید در خدمتتون هستم.