بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

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

آنچه در این مطلب می‌آموزید:
  • روش نصب یونیتی‌هاب و راه‌اندازی پروژه جدید در محیط کار یونیتی را یاد می‌گیرید.
  • با سبک بازی Endless Runner آشنا شده و قوانین آن را می‌آموزید.
  • می‌آموزید که چگونه زمین بازی را ساخته و بر روی آن مانع ایجاد کنید.
  • با روش نوشتن اسکریپت برای فعال‌سازی موانع بازی در زبان #C شارپ آشنا می‌شوید.
  • روش نوشتن اسکریپت‌های مختلف #C و استفاده از آن‌ها در محیط یونیتی را یاد می‌گیرید.
  • روش تنظیم ویژگی‌های مربوط به اندازه، موقعیت و رنگ اشیاء بازی را در یونیتی یا می‌گیرید.

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

فهرست مطالب این نوشته

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

در این مطلب از مجله فرادرس، فرایند بازی سازی با یونیتی را بررسی می‌کنیم. در این آموزش، روش ساخت بازی ساده‌ای به سبک «Endless Runner» را گام‌به‌گام توضیح می‌دهیم. تمام مراحل ساخت بازی از طراحی زمین بازی و موانع آن تا نوشتن اسکریپت‌های مختلف و کنترل بازیکن را خودمان پیاده‌سازی می‌کنیم.

ساخت بازی به سبک Endless Runner

بازی‌های سبک «دونده بی‌پایان‌» (Endless Runner) به این صورت هستند که کاراکتر بازی به طور دائم حرکت کرده و امتیازات موجود در سر راه خود را جمع‌آوری می‌کند. در حین بازی موانعی بر سر راه بازیکن ظاهر می‌شوند که باید از برخورد با آن‌ها دوری کند.

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

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

در ادامه مطلب، برای تمرین کار با یونیتی، بازی سه‌بعدی و ساده‌ای را در سبک «Endless Runner» پیاده‌سازی می‌کنیم.

نمودار ویژگی‌های سبک Endless Runner در بازی‌هامهم‌ترین ویژگی‌های مشترک در بازی‌‌های Endless Runner

شروع به ساخت بازی

ابتدا باید پروژه جدیدی را شروع کنیم. به این منظور نرم‌افزار یونیتی هاب را باز کرده و در بخش «Projects» بر روی دکمه آبی «New Project» کلیک می‌کنیم.

تصویر اول برای تعریف پروژه برای بازی سازی با یونیتی

در صفحه باز شده باید نوع بازی را انتخاب کنیم. از آنجا که می‌خواهیم بازی سه‌بعدی بسازیم، بر روی گزینه «3D» کلیک می‌کنیم. سپس در کادر مشخص شده، نام دلخواه خود را برای بازی می‌نویسیم. در این مطلب، نام «3DRunner» را برای پروژه انتخاب کرده‌ایم. بعد از آن باید آدرس محلی را انتخاب کنیم که می‌خواهیم پروژه در آنجا ساخته شود. در نهایت هم بر روی دکمه «Create project» کلیک می‌کنیم.

تعیین کردن مشخصات پروژه تازه در یونیتی

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

راه‌اندازی موتور بازی سازی یونیتی

بعد از اینکه ادیتور باز شد، در بخش «Assets»، فولدر‌هایی با نام‌های «Prefab» و «Materials» و «Scripts» ایجاد می‌کنیم. از این فایل‌ها در ساخت پروژه بازی دونده بی‌نهایت، استفاده خواهیم کرد.

چند مرحله از قدم‌های اولیه برای بازی سازی با یونیتیچند مرحله از قدم‌های اولیه برای بازی سازی با یونیتی

در بخش بعدی بازی می‌خواهیم سکویی را درست کنیم که بازیکن بر روی آن می‌دود.

ساخت زمین بازی

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

تمام مراحل ساخت زمین بازیهر کدام از مراحل بالا شامل جزئیاتی است که در ادامه این بخش، توضیح داده شده‌اند.

  • گام اول: بر روی فضای خالی پنجره سمت چپ، راست کلیک کرده و گزینه «Create Empty» را انتخاب می‌کنیم. با این کار شیء‌ خامی می‌سازیم و نام آن را «PlatformPrefab» می‌گذاریم.

شروع به ساخت فضای لازم برای دونده بازی

  • گام دوم:‌ اکنون بر روی شیء‌ PlatformPrefab راست کلیک می‌کنیم. سپس بر روی قسمت اشیا سه‌بعدی «3D Object» رفته و در پنجره باز شده، گزینه «Cube» را انتخاب می‌کنیم. با انجام این کار، مکعب خامی می‌سازیم و آن را به فضای بازی اضافه می‌کنیم. در ادامه مطلب با کمک این مکعب المان‌های فضای سه‌بعدی بازی را ایجاد می‌کنیم.

انتخاب مواد لازم برای ساخت زمین بازی

  • گام سوم: نام این مکعب را «Platform» می‌گذاریم. مختصات «موقعیت» (Position) آن را به صورت (0, 0, 0) و مشخصات مقیاس آن را به شکل (8, 0.4, 20) تنظیم می‌کنیم. برای تنظیم این مختصات ابتدا باید شیء مورد نظر خود را در صفحه انتخاب کنیم. سپس از پنجره سمت راست، در بخش «Transform» این تنظیمات را پیدا می‌کنیم.

ساخت زمین بازی دونده سه بعدی

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

یادگیری بازی سازی با یونیتی

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

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

برای این پروژه از ۶ نوع مانع مختلف استفاده خواهیم کرد. اما هیچ محدودیتی در تعداد موانع یا عناصر بازی وجود ندارد.

ساخت موانع مختلف برای بازی سه بعدی

در پنجره سمت راست بر روی گزینه «PlatformPrefab» راست کلیک می‌کنیم. سپس ۶ عنصر «GameObjects» جدید در این قسمت می‌سازیم. تمام آن‌ها را به ترتیب «Obstacle1» و «Obstacle2» و «Obstacle3» تا «Obstacle6» نام‌گذاری می‌کنیم. هر کدام از این اشيا یکی از موانع بازی است. در بخش‌های بعد، روش ساخت و استفاده از تمام موانع را توضیح داده‌ایم.

فیلم آموزش پروژه محور یونیتی – طراحی و ساخت بازی دوز پیشرفته (رایگان) + گواهینامه در فرادرس
بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

مانع اول Obstacle1

برای ساخت اولین مانع، ابتدا باید «مکعب» (Cube) جدیدی را در داخل شیء Obstacle1 ایجاد کنیم.

استفاده از معکعب برای بازی سازی با یونیتی

نام مکعب ساخته شده را «Obst1-Cube1» می‌گذاریم. سپس اعداد مربوط به تنظیمات مقیاس آن را به صورت (8, 0.5, 3) تنظیم می‌کنیم. در آخر هم آن را بر روی سکوی بازی قرار می‌دهیم.

قرار دادن اولین مانع بر روی زمین بازی

برای رنگ‌آمیزی این مکعب، در بخش Assests «ماده» یا (Material) جدیدی ایجاد می‌کنیم. نام این Material را «BlackMaterial» می‌گذاریم. سپس رنگ آن را به رنگ سیاه تنظیم می‌کنیم.

ساخت ماده سیاه برای رنگ دادن به مانع در بازی

اکنون باید ماده سیاه ساخته شده را به شیء «Obst1-Cube1» تخصیص بدهیم. این کار برای آن است که بازیکن به راحتی بتواند مانع را از سکو تشخیص دهد.

اضافه کردن رنگ سیاه به مانع ساخته شده

مانع دوم Obstacle2

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

ستون‌های مربوط به مانع در بازی

برای ساخت این مانع ابتدا دو مکعب را با نام‌های «Obst2-Cube1» و «Obst2-Cube2» ایجاد می‌کنیم. سپس مقدار ویژگی «Scale» را در آن‌ها برابر با (1, 8, 1.5) تنظیم می‌کنیم.

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

نام مکعب سوم را «Obst2-Cube3» می‌گذاریم. مقدار ویژگی Scale را هم در این مکعب برابر با (6, 7, 1.5) تنظیم می‌کنیم.

استفاده از توب زرد برای رنگ آمیزی مانع دوم

برای رنگ‌آمیزی این مکعب، ابتدا شیء «Material» جدیدی می‌سازیم و نام آن را «YellowMaterial» می‌گذاریم. سپس مقدار ویژگی رنگ آن را به زرد تغییر می‌دهیم. در نهایت هم ماده ساخته شده را به شیء Obstacle2 اختصاص می‌دهیم. این کار نیز با هدف قابل تشخیص بودن این مانع از سکوی بازی انجام می‌‌شود.

قرار دادن مانع زرد رنگ بر روی زمین بازی

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

مانع سوم Obstacle3

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

ستون‌های مربوط به مانع در بازی

دو تا از مکعب‌ها را با عبارت‌های «Obst3-Cube1» و «Obst3-Cube2» نام‌گذاری می‌کنیم. سپس مقدار ویژگی Scale هر دوی آن‌ها را برابر با (1, 8, 1.5) تنظیم می‌کنیم.

تصویر طراحی مانع در نرم‌افزار یونیتی

نام مکعب سوم را «Obst3-Cube3» می‌گذاریم. از این مکعب برای ساختن بخش بالایی مانع استفاده خواهیم کرد. بنابراین مقدار صفت Scale آن را برابر با (6, 2, 1.5) تنظیم می‌کنیم.

روش ساخت مانع سوم بر روی زمین بازی

اکنون نوبت به مکعب چهارم رسیده است. این مکعب را با عبارت «Obst3-Cube4» نام‌گذاری می‌کنیم. مقدار صفت Scale آن را هم به صورت (6, 1, 1.5) تنظیم می‌کنیم. این مکعب در ارتفاع y=1.25 قرار می‌گیرد.

استفاده از ماده قرمز برای رنگ‌امیزی مانع سوم

برای رنگ‌آمیزی مانع سوم شیء‌ Material جدیدی ایجاد می‌کنیم. نام این شیء را «RedMaterial» می‌گذاریم. سپس رنگ آن را به قرمز تغییر می‌دهیم. وقتی شیء‌ Material آماده شد آن را به Obstacle3 اختصاص می‌دهیم. اکنون مانع سوم هم به راحتی از سکوی بازی تشخیص داده می‌شود. همین طور که می‌بینید در تصویر دوربین به پایین سکو منتقل شده است. به همین دلیل، جهت قرارگیری سایه در این تصویر با تصاویر بالایی فرق می‌کند.

روش رنگ‌امیزی مانع سوم بر روی زمین بازی

در تصویر بالا مانع سوم یا «Obstacle3» دیده می‌شود.

در بخش‌های بعدی نشان می‌دهیم که چطور موانع چهارم و پنجم و ششم را به صورت ترکیبی از موانع اول و دوم و سوم ایجاد کنیم.

مانع چهارم Obstacle4

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

ترکیب موانع مختلف برای ساخت مانع جدید

مانع پنجم Obstacle5

برای ساخت مانع پنجم هم موانع اول و سوم را با همدیگر ترکیب می‌کنیم.

ترکیب موانع مختلف برای ساخت مانع جدید

مانع ششم Obstacle6

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

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

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

ساخت موانع آخر با ترکیب موانع اول و دوم و سوم

ابتدا تمام اشیاء درون ساختار Obstacles را انتخاب کنید. سپس مقدار ویژگی «Tag» در آن‌ها را بر روی عبارت «Finish» تنظیم کنید. این ویژگی در پنجره «Inspector» در سمت راست تصویر قرار دارد. انجام این کار برای آن است که بتوانیم برخورد بازیکن و موانع به همدیگر را تشخیص دهیم.

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

اسکریپت فعال‌سازی موانع بازی 3D Runner

برای نوشتن اسکریپت‌های یونیتی از زبان برنامه نویسی سی‌شارپ استفاده می‌کنیم. اکنون به فولدر Script رفته و فایلی با نام «Simp_Platform.cs» ایجاد کنید. بهتر است برای ساخت این فایل از یکی از محیط‌های برنامه نویسی مناسب سی‌شارپ مانند ویژوال استودیو استفاده کنید.

مطلب پیشنهادی:

آموزش سی شارپ در یونیتی – از مبتدی تا ساخت اولین بازی

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Simp_Platform: MonoBehaviour
{
    public Transform start;
    public Transform end;
    public GameObject[] obst; //Objects that contain various forms of obstacles that will be activated at random.
    public void ActRandomObst()
    {
        DeactAllObst();
        System.Random rand = new System.Random();
        int randomNum = rand.Next(0, obst.Length);
        obst[randomNum].SetActive(true);
    }
    public void DeactAllObst()
    {
        for (int i = 0; i < obst.Length; i++)
        {
            obst[i].SetActive(false);
        }
    }
}
مشاهده کامل کدها

خط هشتم از کد بالا public GameObject[] obst; آرایه‌ای از نوع GameObject با نام obst تعریف می‌کند. این آرایه، لیستی از موانع بازی است. در زمان بازی دائما یکی از این موانع به طور تصادفی روشن شده و بقیه خاموش می‌شوند. برای درک هرچه بهتر این اسکریپت‌ها باید با معنی و مفهوم کدهای سی شارپ آشنا باشید. در آن صورت حتی می‌توانید اسکریپت‌ها را با سلیقه و نظر خود تغییر داده و ویژگی‌های جدیدی به بازی اضافه کنید. در صورت نیاز به یادگیری معنی کدهای سی شارپ پیشنهاد می‌کنیم که مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

با کلیک بر روی شیء «PlatformPrefab» در سمت چپ تصویر، پنجره Assets در پایین باز می‌شود. برای اختصاص دادن اسکریپت نوشته شده به این شیء فقط کافی است که بر روی آن کلیک کرده و به این پنجره بکشید.

انجام تنظیمات مربوط به موانع در بازی

دوباره شیء PlatformPrefab را در سمت چپ انتخاب کنید. اکنون به پنجره Inspector این شیء در سمت راست تصویر نگاه کنید. در این پنجره مولفه‌ای برای نشان دادن موانع وجود دارد. تمام موانع را در بخش سمت چپ تصویر انتخاب کرده و با تکنیک «Drag and Drop» به این بخش منتقل کنید. یعنی بر روی آن‌ها کلیک کرده و به اینجا بکشید.

کشیدن تنظیمات از سمت چپ محیط کار به سمت راست

در مرحله بعد هم باید اسکرپیتی بنویسیم که زمین بازی را تا بی‌نهایت تولید کند.

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

اکنون محیط کدنویسی خود را باز کرده و اسکریپتی به نام «Simp_GroundGen.cs» ایجاد کنید. وظیفه این اسکریپت آن است که همزمان با دویدن بازیکن به جلو به صورت بینهایت، ساخت زمین بازی را ادامه بدهد و رکورد بدست‌آمده را ذخیره کند.

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

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

کدهای زیر را در اسکریپتی با نام «Simp_GroundGen.cs» نوشته و آن را ذخیره کنید.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Simp_GroundGen: MonoBehaviour
{
    public Camera mainCamera;
    public Transform start; //this will Mark the location where the ground tiles will begin.
    public Simp_Platform PlatformPrefab;
    public float movingSpeed = 12;
    public int tilesToPreSpawn = 15; //no. of tiles should be pre-spawned
    public int tilesWithoutObst = 5; //How many tiles at the beginning should not have obstacles, good for warm-up

    List<Simp_Platform> spawnedTiles = new List<Simp_Platform>();
    int nextTileToAct = -1;
    [HideInInspector]
    public bool gameOver = false;
    static bool gameStarted = false;
    float score = 0;
    public static Simp_GroundGen instance;
    //start is always called before the first frame update

    void Start()
    {
        instance = this;
        Vector3 spawnPosition = start.position;
        int tilesWithNoObstTmp = tilesWithoutObst;
        for (int i = 0; i < tilesToPreSpawn; i++)
        {
            spawnPosition -= PlatformPrefab.start.localPosition;
            Simp_Platform spawnedTile = Instantiate(PlatformPrefab, spawnPosition, Quaternion.identity) as Simp_Platform;
            if(tilesWithNoObstTmp > 0)
            {
                spawnedTile.DeactAllObst();
                tilesWithNoObstTmp--;
            }
            else
            {
                spawnedTile.ActRandomObst();
            }
            spawnPosition = spawnedTile.end.position;
            spawnedTile.transform.SetParent(transform);
            spawnedTiles.Add(spawnedTile);
        }
    }

    // The Update is always called once per frame
    void Update()
    {
        // We will Move the object upward in world space x unit/second.
        //Increase speed the higher score we get
        if (!gameOver && gameStarted)
        {
//This will increase the speed as time passes
            transform.Translate(-spawnedTiles[0].transform.forward * Time.deltaTime * (movingSpeed + (score/500)), Space.World);
// this will keep track of score
score += Time.deltaTime * movingSpeed;
        }

        if (mainCamera.WorldToViewportPoint(spawnedTiles[0].end.position).z < 0)
        {
            //We will Move the tile to the front if it's behind the Camera
            Simp_Platform tileTmp = spawnedTiles[0];
            spawnedTiles.RemoveAt(0);
            tileTmp.transform.position = spawnedTiles[spawnedTiles.Count - 1].end.position - tileTmp.start.localPosition;
            tileTmp.ActRandomObst();
            spawnedTiles.Add(tileTmp);
        }

// if the game is over or did not start, then this will prompt us with instructions to press space to play again 
        if (gameOver || !gameStarted)
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
// if the game is over, then it will show the current score and give instructions to restart
                if (gameOver)
                {
                    //this will Restart the scene displayed currently
                    Scene scene = SceneManager.GetActiveScene();
                    SceneManager.LoadScene(scene.name);
                }
                else
                {
                    //This will Start the game file again
                    gameStarted = true;
                }
            }
        }
    }

// A function responsible for displaying instructions and score
    void OnGUI()
    {
// if game over
        if (gameOver)
        {
// to set the text color red
            GUI.color = Color.red;
// dimension for the text box 
            GUI.Label(new Rect(Screen.width / 2 - 99, Screen.height / 2 - 99, 198, 198), "Your Game is Over\nYou scored: " + ((int)score) + "\nYou can Press 'Space' to restart the game");
        }
        else
        {
            if (!gameStarted)
            {
                GUI.color = Color.red;
                GUI.Label(new Rect(Screen.width / 2 - 99, Screen.height / 2 - 99, 198, 198), "You can Press 'Space' to start");
            }
        }
// this will display real time score in green color
        GUI.color = Color.green;
// this will display the score
        GUI.Label(new Rect(5, 5, 200, 25), "Your Score: " + ((int)score));
    }
}
مشاهده کامل کدها

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

  1. متغیر‌های عمومی: در این بخش مهم‌ترین متغیر‌های کد تعریف شده‌اند.

    • mainCamera: دوربین بازی برای بررسی موقعیت زمین‌ها

    • PlatformPrefab: نمونه‌ای از زمین یا سکوی بازی

    • movingSpeed: سرعت دویدن بازیکن

    • tilesToPreSpawn: تعداد زمین‌های بازی ساخته شده در اول بازی

    • tilesWithoutObst: برای شروع آسان‌تر بازی چند زمین اول بدون مانع هستند. این متغیر، تعداد زمین‌های بدون مانع اول بازی را مشخص می‌کند.

  2. تابع Start(): این تابع در ابتدای بازی اجرا شده و تعدادی زمین پشت سرهم ایجاد می‌کند. زمین‌های اول بدون مانع هستند و بقیه زمین‌ها از موانع تصادفی تشکیل شده‌اند.

  3. تابع Update(): این تابع با فشردن کلید Space بازی را شروع می‌کند. سپس وظیفه مدیریت زمین‌های بازی و سرعت بازیکن را برعهده دارد.

  4. تابع OnGUI(): این تابع وظیفه نمایش اطلاعات بازی را برعهده دارد. اگر بازی هنوز شروع نشده است، پیغام «Press Space to start» را نمایش می‌دهد. اگر بازی تمام شده باشد، پیغام «Game Over» را نشان می‌دهد. در ضمن، نشان دادن امتیاز لحظه‌ای بازیکن در گوشه تصویر نیز بر عهده این تابع است.

مهم‌ترین بخش‌های اسکریپت زمین بازیاسکریپت زمین بازی با زبان سی‌شارپ نوشته شده است.

اکنون باید دو «GameObjects» دیگر بسازیم. یکی از آن‌ها برای مشخص کردن نقطه شروع و دیگری برای نشان دادن نقطه پایان به کار برده می‌شوند. باید این نقاط را در ابتدا و انتهای زمین بازی قرار بدهیم.

ساخت زمین بازی با کنار هم گذاشتن موانع

اول بر روی PlatformPrefab کلیک می‌کنیم. سپس اشیاء ساخته شده را به بخش «Simp_Platform» در پنجره سمت راست با نام Inspector اضافه می‌کنیم.

انجام تنظیمات مربوط به موانع بازی

شیء بازی یا «game object» جدیدی ایجاد می‌کنیم. نام آن را SimpGroundGen می‌گذاریم. سپس اسکریپت Simp_GroundGen.cs را به این شیء بازی اختصاص می‌دهیم.

نوشتن اسکریپت برای تنظیم دوربین بازی در یونیتی

حالا موقعیت دوربین اصلی بازی را به مختصات (10, 1, -9) تغییر می‌دهیم. مقدار ویژگی «Rotation» دوربین را هم برابر با (0, -55, 0) می‌گذاریم.

تنظیمات مربوط به مانع در یونیتی

برای مشخص کردن محل شروع زمین بازی، دوباره «GameObject» جدیدی ایجاد می‌کنیم. نام این شیء را «StartingPoint» می‌گذاریم. در آخر هم مقدار ویژگی Position آن را برابر با (0, -2, -15) تنظیم می‌کنیم.

تنظیمات مربوط به فضای بازی در یونیتی

اکنون باید به فولدر Prefab برویم. سپس شیء بازی PlatformPrefab را کشیده و به این فولدر منتقل می‌کنیم. با این کار، شیء PlatformPrefab را به قالب پیش‌ساخته‌ای تبدیل می‌کنیم که می‌توان بار‌ها و بار‌ها بدون نیاز به دوباره‌سازی از آن استفاده کرد.

انجام تنظیمات مربوط به زمین بازی در یونیتی

بعد از قرار دادن PlatformPrefab در فولدر Prefab، باید آن را از از تب «Hierarchy» حذف کنیم. حالا PlatformPrefab آماده است. یعنی به راحتی می‌توانیم از آن استفاده کنیم.

تنظیمات مربوط به فضای بازی در یونیتی

حلا نوبت به انجام تنظیمات نهایی زمین بازی است. برای این کار، شیء SimpGroundGen را انتخاب می‌کنیم. باید کارهای زیر را برای این شیء، انجام بدهیم.

  • ویژگی «Main Camera» را به دوربین بازی اختصاص می‌دهیم.

  • ویژگی «StartingPoint Object» را به محل شروع بازی تخصیص می‌دهیم.

  • ویژگی «PlatformPrefab» را هم به فولدر Prefab اختصاص می‌دهیم.

مشخصات شیء SimpGroundGen در بازی‌سازی

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

ساخت بازیکن در بازی 3D Runner

در این بخش از بازی، می‌خواهیم عنصر بازیکن را بسازیم.

فیلم آموزش طراحی سطوح سه بعدی در بازی سازی در Unity + گواهینامه در فرادرس
فیلم آموزش طراحی سطوح سه بعدی در بازی سازی در Unity + گواهینامه در فرادرس
کلیک کنید

برای این کار باید شیئی با نام «PlayerObject» ایجاد بکنیم.

تصویر از مسیر ساخته شده و موانع سه بعدی

نکته: تصویر بالا از مراحل ابتدایی بازی و قرارگیری تصادفی موانع آن گرفته شده است. شاید در پروژه شما موانع به شکل دیگری ظاهر شوند. زیرا این فرایند به صورت تصادفی انجام می‌شود.

ابتدا بر روی شیء PlayerObject راست کلیک می‌کنیم. سپس با انتخاب گزینه «3D Object» کره جدیدی را ایجاد می‌کنیم.

تنظیمات مربوط به دوربین در زمان بازی سازی با یونیتی

توجه: برای ساخت موانع از شکل «مکعب» (Cube) استفاده می‌کردیم. اما برای ساخت بازیکن از شکل «توپ» یا «کره» (Sphere) استفاده می‌کنیم.

برای این کره هم باید ماده جدیدی بسازیم. یعنی در پنجره پایین به نام Assets به بخش «Materials» رفته و ماده جدیدی ایجاد می‌کنیم. نام این ماده را «BlueMaterial» می‌گذاریم. رنگ آن‌ را هم بر روی آبی یا «Blue» تنظیم می‌کنیم.

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

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

تخصیص رنگ آبی به توپ بازیکن اصلی

اکنون باید ویژگی «برخورد دهنده کروی» (Sphere Collider) را از کره مورد نظر حذف کنیم. با این کار، عنصر بازیکن ساخته شده و آماده استفاده است. در بخش بعدی، کدهای مربوط به این عنصر را هم می‌نویسیم.

یادگیری رایگان اصول اولیه بازی سازی با یونیتی

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

اسکریپت کنترل بازیکن

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

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع
اکنون نوبت به نوشتن اسکریپت کنترل بازیکن رسیده‌ است. بنابراین فایلی با نام «Simp_Player.cs» ایجاد می‌کنیم. این اسکریپت به بازیکن امکان پریدن و خم شدن را می‌دهد. هر وقت که بازیکن بخواهد، می‌تواند با زدن دکمه «W» بپرد و هر وقت که تمایل داشته باشد با کمک دکمه «S» خم می‌شود.

توجه کنید که در این مطلب، برای اجرای فرایند بازی سازی با یونیتی تمام کدها را به زبان #C نوشته‌ایم.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class Simp_Player: MonoBehaviour
{
    public float gravity = 20.0f;
    public float jump_Height = 2f;
    Rigidbody r;
    bool grounded = false;
    Vector3 defaultScale;
    bool crouch = false;
    //method start is always called before the first frame update

    void Start()
    {
        r = GetComponent<Rigidbody>();
        r.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ;
        r.freezeRotation = true;
        r.useGravity = false;
        defaultScale = transform.localScale;
    }

    void Update()
    {
        // Jump
        if (Input.GetKeyDown(KeyCode.W) && grounded)
        {
            r.velocity = new Vector3(r.velocity.x, CalculateJumpVerticalSpeed(), r.velocity.z);
        }
        //Crouch
        crouch = Input.GetKey(KeyCode.S);
        if (crouch)
        {
            transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(defaultScale.x, defaultScale.y * 0.4f, defaultScale.z), Time.deltaTime * 7);
        }
        else
        {
            transform.localScale = Vector3.Lerp(transform.localScale, defaultScale, Time.deltaTime * 7);
        }
    }
    // Update is called once per frame

    void FixedUpdate()
    {
        // We apply gravity manually for more tuning control
        r.AddForce(new Vector3(0, -gravity * r.mass, 0));
        grounded = false;
    }
    void OnCollisionStay()
    {
        grounded = true;
    }
    float CalculateJumpVerticalSpeed()
    {
        // From the jump height and gravity, we deduce the upwards speed 
        // for the character to reach the apex.
        return Mathf.Sqrt(2 * jump_Height * gravity);
    }
    void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Finish")
        {
            //print("GameOver!");
            Simp_GroundGen.instance.gameOver = true;
        }
    }
}

مشاهده کامل کدها

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

در فهرست پایین عملکرد مهم‌ترین توابع نوشته شده در کدهای بالا را توضیح داده‌ایم.

  • تابع Start(): این تابع همیشه قبل از به‌روزرسانی اولین فریم از بازی فراخوانی می‌شود.

  • تابع Update(): این تابع در هر فریم یک بار فراخوانی می‌شود. در تابع Update() کدهای مربوط به عملیات پرش و خم شدن را نوشته‌ایم.

  • تابع FixedUpdate(): در تابع FixedUpdate() برای اعمال کنترل بیشتر، قوانین مربوط به جاذبه را به صورت دستی اعمال کرده‌ایم. از روی ارتفاع پرش و نیروی گرانش می‌تونیم سرعت حرکت به بالا و پایین را محاسبه کنیم. با این کار می‌توان بالاترین مقدار پرش کاراکتر را هم تشخیص داد.

انجام تنظمیات مربوط به برخورد دهنده کره

اکنون باید اسکریپت «Simp_Player» را به شیء «PlayerObject» اختصاص بدهیم.

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

حالا ابتدا گزینه «PlayerObject» را انتخاب می‌کنیم. در پنجره کناری صفحه کار باید تب Inspector را پیدا کنیم. سپس در این تب بر روی گزینه «Add Component» کلیک می‌کنیم. از منوی باز شده گزینه «Physics» را انتخاب می‌کنیم. سپس برای شیء «PlayerObject» باید عنصر «BoxCollider» را انتخاب کنیم.

انجام تنظیمات مربوط به اسکریپت در یونیتی

در نهایت هم شیء «Player» را کمی بالاتر از شیء «StartPoint» و دقیقا در مقابل دوربین قرار می‌دهیم.

قرار دادن بازیکن در زمین بازی

اکنون با فشار دادن دکمه «W» توپ آبی بازیکن می‌پرد.

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

با فشار دادن دکمه «S» هم توپ خم شده و روی زمین می‌خوابد.

توپ آبی بر روی زمین و در حال خم‌شدن بر روی زمین بازی

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

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

جمع‌بندی

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

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع
بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع
بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

فرم ثبت نام در دوره

بازی سازی با یونیتی – به زبان ساده + پروژه برای شروع

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

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

در اینستاگرام

پیج ما را دنبال کنید!

در تلگرام

کانال ما را دنبال کنید!

لیست جامع بهترین ابزارهای هوش مصنوعی ۲۰۲۵ (دانلود رایگان)

لیست جامع بهترین ابزارهای هوش مصنوعی ۲۰۲۵ (دانلود رایگان) هر روز هزاران ابزار و پلتفرم جدید با برچسب هوش مصنوعی…

6 آبان 1405
زمان مطالعه: 25 دقیقه

یادگیری هوش مصنوعی برای کودکان، راهنمای کامل برای والدین سال 1405

یادگیری هوش مصنوعی برای کودکان، راهنمای کامل برای والدین دنیای امروز با سرعتی باورنکردنی در حال تغییر است و هوش

…
23 شهریور 1405
زمان مطالعه: 10 دقیقه
بهترین آموزشگاه کامپیوتر مشهد | دوره‌های تابستان ۱۴۰۵ ICDL، پایتون و هوش مصنوعی (نزدیک مترو)

بهترین آموزشگاه کامپیوتر مشهد | دوره‌های تابستان ۱۴۰۵ ICDL، پایتون و هوش مصنوعی (نزدیک مترو)

بهترین آموزشگاه کامپیوتر مشهد | دوره‌های تابستان ۱۴۰۵ ICDL، پایتون و هوش مصنوعی (نزدیک مترو) بهترین آموزشگاه کامپیوتر مشهد با

…
18 تیر 1405
زمان مطالعه: 5 دقیقه

شروع دوره های تابستان 1405

17 تیر 1405
زمان مطالعه: 1 دقیقه
منوی دسته های خود را در هدرساز -> موبایل -> منوی اصلی موبایل -> نمایش/مخفی -> انتخاب منو، تنظیم کنید.
سبد خرید
برای دیدن نوشته هایی که دنبال آن هستید تایپ کنید.