بایگانی برچسب: s

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

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

یکی از سبکهای مورد علاقه من در بازی‌سازی، سبک Role Playing عه که در این سبک، شما در واقع نقش ایفا می‌کنید، نقش هایی که به شما محول شده و یا این که شما هم میتونید در شکل‌گیری نقش دخیل باشید. بازی‌هایی مثل Elder Scrolls از این دست بازی ها هستند. چندی پیش، با یک ابزار آشنا شدم به اسم RPG Maker که به شما اجازه ساخت این دست بازی ها رو بدون کد زدن میده. اما یک مساله مهمی که احتمالا باهاش روبرو خواهید شد، اینه که این ابزار شدیدا محدوده و به سختی میشه شخصی‌سازیش کرد. به همین خاطر، سعی کردم دنبال این برم که یاد بگیرم چطور یک RPG دو بعدی ساده رو بسازم (حتی شده در حد کنترل کرکتر اصلی!).

نتیجه این شد که یک سری ویدئو دیدم و رفرنسهای برنامه نویسی یونیتی رو چند بار مطالعه کردم و تونستم چنین چیزی بسازم :

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

برنامه نویسی

برای کنترل کردن کرکترها در بازی، نیاز به کدی داریم که بتونه دیتا رو از کی‌برد، ماوس، صفحه لمسی و … دریافت کنه و حرکتی که مد نظر داریم رو برای ما، انجام بده. این حرکت میتونه صرفا جابجایی باشه، میتونه هم حرکت و انیمیشن با هم باشه. برای این که کد کامل باشه و بازی حرفه‌ای به نظر برسه، بهتره که انیمیشن هم لحاظ کنیم.

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : Entity {

    private Animator anim; 

	// Use this for initialization
	void Start () {
        anim = GetComponent<Animator>(); 
	}
	
	// Update is called once per frame
	void Update () {
		if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)){
			GetComponent<Rigidbody2D>().transform.position += Vector3.up * speed * Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.down * speed *Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.left * speed * Time.deltaTime; 
		}
		if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow) )
        {
			GetComponent<Rigidbody2D>().transform.position += Vector3.right * speed * Time.deltaTime; 
		}

        anim.SetFloat("MoveX", Input.GetAxis("Horizontal"));
        anim.SetFloat("MoveY", Input.GetAxis("Vertical")); 
	}
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

این کد نشون میده که کلاس PlayerController از کلاس دیگری به اسم Entity داره ارث بری میکنه. تنها چیزی که در Entity تعریف شده، یک متغیر برای سرعت کرکتره. البته، سایر ویژگی هایی که نیاز داریم تا در تمام کرکترها (چه Player و چه NPC ) به کار ببریم رو میتونیم در Entity بگنجونیم.

در Update اومدیم بهش گفتیم که اگر ورودی از کلیدهای خاصی بوده، با سرعت مشخصی در جهتهای مشخص، حرکت کنه. متغیر speed هم یک متغیر public بوده که در Entity تعریف کردیم. در انتها هم گفتیم که دو متغیر ممیز شناور برای حرکت در محور X و Y نیاز داریم که با Animator Controller هماهنگ باشن. این میشه کل چیزی که در متد Update داریم.

در متد اول، یعنی Setup هم صرفا به کد گفتیم که انیماتور رو از خود شیء Player بخونه و لود کنه. پس ما نیاز داریم که خودمون یک انیماتور براش بسازیم.

چطور این کد رو آزمایش کنیم؟

آزمایش کردن این کد، هیچ کاری نداره. چون کل انیمیشن و … رو در گیتهاب قرار دادم (لینک) و میتونید از گیتهاب دانلودش کرده و تست کنید. به زودی هم، این ابزار رو به صورت یک prefab برای یونیتی منتشر میکنم که بتونید مستقیما از همین دیزاین و انیمیشن، بدون چسبوندنشون به هم، استفاده کنید.

موفق باشید 🙂

Share

چگونه بازی‌ساز شویم؟

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

در سال ۹۶، حدود دو ماه در استودیویی مشغول کار شدم، بعنوان «آهنگساز» برای بازی کامپیوتری. اول که قرار بود کار آهنگسازی و دیزاین صدا به واسطه کامپیوتر رو براشون انجام بدم. یعنی طراحی ساندترک های بازی (موسیقی متن) و طراحی ساند افکت (صداهایی که می‌شنویم، مثل باد، صدای دستگاههای عجیب و غریب آخرالزمانی یا صدای هیولا و … ) ولی کم کم بخاطر کمبود نیرویی که به کار صدا وارد باشه، رُل «صدا گذار» هم به من داده شد. حالا دیگه صرفا کسی که کل روز وقتش پشت FL باشه نبودم و باید در یونیتی انجین کد میزدم و Sound Object و … وارد میکردم و با میکسرهای یونیتی بازی میکردم. برای من سخت بود چون اولا که به من گفته نشده بود قراره صداگذاری کنم، دوما زبان یونیتی سی شارپه و من هم چندان دل خوشی ازش ندارم. پس به شدت سعی میکردم تن ندم و از زیرش دربرم (حتی نیروی کمکی هم با خودم برده بودم 😀 ). ولی باگ قضیه این نبود. باگی که در این سیستم بود فراتر از این ماجراها بود. که در این مطلب قراره در موردش توضیح بدم!

از کجا شروع کنیم؟

برای بازی سازی، ما رُل های متعددی داریم. از برنامه نویسان و متخصصین هوش مصنوعی گرفته تا رُلهای کاملا سینمایی مثل نویسنده و کارگردان، همه حیاتی و مهم هستند و باید در یک تعادل حساس، کنار هم قرار بگیرند. نه این که یک یا دو نفر سعی کنند همه این رُل ها رو داشته باشند. حداقل وقتی که قراره بازی پدرمادر دار و درست و حسابی بسازیم، نیاز داریم برای هربخشی یک متخصص (یا یک تیم متخصص) داشته باشیم. در این قسمت، با هم کمی نقش ها رو بررسی میکنیم. از یک «ایده» ساده تا یک «بازی» کامل.

ایده خام

اگر همین لحظه که این متن رو میخونید یک دقیقه متوقف بشید و سعی کنید برای «موضوع آزاد» انشاء بنویسید، چه خواهید نوشت؟ مثلا آیا «یک سرباز رومی گرفتار شده در ایران» یا «یک سردار صفوی گرفتار شده در عثمانی»؟ یا حتی ساده تر، «کودکی که از سر کنجکاوی وارد یک قلعه ویکتوریایی شده». همه این ها جذابن. ولی زیادی خام هستند، شما نیاز دارید که کمی این ها رو پرورش بدید تا برسید به «ایده خام».

بیاید به «کودکی که از سر کنجکاوی وارد یک قلعه ویکتوریایی شده» رو با هم کاملش کنیم. میگیم «کودکی داشت در یکی از خیابانهای لندن، توپ بازی میکرد. ناگهان توپش درون قلعه افتاد. هیچ کس از بزرگترها – به خاطر داستانهایی که از آن قلعه شنیده بودند – داخل نمی‌شدند تا توپ را برای کودک بیاورند. حالا کودک بخاطر شجاعت و نترسی کودکانه‌اش، این خطر را به جان خرید و وارد قلعه شد». تا اینجا یک ایده بسیار خوب داریم. حالا لازم شد که روی ایده کار کنیم. پس این ایده رو با یک «نویسنده» در میان میگذاریم (یا خودمان، اگر توانش رو داریم، روی بسطش فکر میکنیم).

نویسندگی و بسط ایده

تا اینجا، ساخت فیلم و بازی بسیار شبیه بودند. اما از اینجا به بعد قراره که متفاوت تر بشن. بازی یک نوع رسانه «اینتراکتیو» یا «تعاملی» به حساب میاد ولی فیلم نه. کنترل بخشی از بازی دست پلیره ولی فیلم نیست. بنابراین باید اول تصمیم بگیریم «کجا قراره بازی مثل یک فیلم روند خودش رو طی کنه» و «کجا قراره بازی دست پلیر بیفته». حالا میتونیم ایده ها رو کنار هم بچینیم. ولی قبل از چیدن این مسائل کنار هم، نیاز داریم که یک سری المان ها را به خوبی کنار هم قرار بدیم :
۱. پیش زمینه و تاریخچه از موضوع کلی (چرا مردم حاضر نیستند در اون قلعه برن؟ حتی وقتی توپ کودک معصومی آنجا افتاده؟)
۲. طرح سوال کلی و شروع داستان (ورود کودک به قلعه)
۳. ایجاد تنش (رو به رو کردن کودک با چیزی که تا به حال با اون مواجه نشده، دیدن موجودات ماوراء الطبیعی و …)
۴. حل سوال توسط قهرمان و پایان داستان (جنگیدن کودک با توهماتی که درون قلعه با آن دچار شده، جنگیدن کودک با طرز تفکر مردم و غالب شدن یک طرز تفکر جدید).
بسیار خب، حالا بیایم با هم کل ایده رو به «طرح کلی» یا همون «پلات» تبدیل کنیم :

«سالیان سال، قلعه‌ای ویکتوریایی در جنوب شهر لندن بود که مردم منطقه شبها از آن صدای جیغ و داد می‌شنیدند. گاهی هم مردمی که در روز از کنار آن قلعه عبور می‌کردند، صدای گریه و زاری زنی را می‌شنیدند، گویی که به سوگ فرزندش نشسته باشد.
روزی، «آلن» ، کودک ۱۰ ساله‌ای که ساکن جنوب لندن است، به تنهایی با توپ خود بازی میکند، ناگهان توپ او از  دریچه قلعه، به درون آن میفتد. پسربچه از چند بزرگتر خواهش میکند که توپش را برای او بازگردانند، اما همه آنها با اتکا به اتفاقاتی که در آن قلعه افتاده است، می‌ترسند که داخل شوند؛ چرا که هراس از «زنده برنگشتن» در وجود آنان نهادینه شده است.
آلن، دیگر از دست آن آدم بزرگها به ستوه آمده و خودش وارد قلعه می‌شود. در اولین نگاه، اسکلت زنی را می‌بیند که با لباس عروسی کهنه و تارعنکبوت بسته، روبروی یک دست آینه و شمعدان نقره نشسته است؛ نماد های سلطنتی مجارستان و انگلیس را می‌بیند که تارعنکبوت بسته و از رنگ و رو افتاده اند. محو تماشای شکوه از دست رفته خاندانهای سلطنتی شده که ناگهان یادش میفتد به دنبال توپش آمده.
وقتی آلن در قلعه به دنبال توپش میگردد، ناگهان پایش روی یک چیزی – مانند یک تکه استخوان – رفته و صدای جیغی در محیط می‌پیچد. تمام افرادی که سالها در آن قلعه حبس شده و مُرده بودند، زنده می‌شوند و حالا وظیفه آلن است که به داستان آنها گوش دهد و و وقتی که به صورت کامل، هم داستانها را شنید و هم نامه ها و خاطرات را خواند، تازه می‌تواند از قلعه خارج شود و خارج از آن قلعه، ماجرای زنی که به انتظار دامادش نشسته بود را، برای آدم‌بزرگها تعریف کند و پلیس نیز جرات کند به قلعه ورود کرده و سپس ماجرا در تمام دنیا، پخش شود».

چیزی که در بالا خواندیم، یک پلات ساده بود. این پلات رو من بداهه نوشتم و شاید پلات درستی نباشه، ولی ممکنه سالها بعد به یک بازی تبدیل بشه. حالا نکته مهم اینه که این پلات باید به فیلمنامه تبدیل بشه، مثلا گشت و گذار صرف توی یک قلعه به اندازه کافی هیجان انگیز نیست، پس یک جا لازمه که مثل بازی «لایه های ترس» ، از بُردهای «وی‌یا» (برد Ouija که از دو کلمه Oui فرانسوی و Ja آلمانی تشکیل شده و برای احضار ارواح استفاده میشه) برای ارتباط با ارواح یا حل یک معما استفاده کنیم. یا مثلا، در کشوی میزکار افسر آلمانی – که چندین روز مهمان آن خانم ثروتمند و نجیب‌زاده بوده – یک کلید قایم کنیم که مربوط به یکی از درهای اصلی قلعه باشه. پس اینجا کار نویسنده به «طراحی گیم‌پلی» تغییر میکنه. معمول هم اینه که طراح گیم‌پلی شخص متفاوتی از نویسنده باشه، مگر این که تیم ما به قدر کافی بزرگ نباشه. بعد از این که گیم پلی طراحی شد، و حالا داستان و گیم پلی پخته ای داریم، وقتشه که از دو نفر کمک بگیریم : هد تیم برنامه نویس ها و کارگردان.

شروع به ساخت و کارگردانی

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

برنامه نویس ها هم وظیفشون ایجاب میکنه که در محیط بازی‌سازی (مثلا یونیتی) داستان رو به کد تبدیل کنند. انیماتور ها بخش های «غیر اینتراکتیو» رو میسازند و برنامه نویس بخش اینترکتیو رو. بعضی وقتها هم با هم همکاری میکنند (مثلا وقتی که قراره کاراکتر وارد یک Trigger خاصی بشه و مثلا سقف بریزه) و این مرحله تولید هم به خوبی پیش میره. تا این که یک بازی کامل ولی بدون صدا داریم. حالا وقتشه که «بازیگران صدا» و «صدا بردار» و «صدا گذار» هم وارد بشن. حالا بازی ما هم صدا داره هم گیم پلی. هم مکانیک بازی به خوبی در محصول ما پیاده شده. پس در «پس تولید» چه میکنیم؟

پس‌تولید

در پس تولید، موسیقیدان و آهنگساز وارد میشن و متناسب با سینماتیک، مکانیک و گیم پلی موسیقی میسازن. ممکنه صداگذار خود تیم، حاضر به صداگذاری نشه (چون کار اصلیش در تولید بوده و نه پس تولید) پس تیم آهنگسازی خودش یک صداگذار هم داره (شاید هم همون صداگذار تیم باشه ولی این بار بعنوان صداگذار تیم آهنگسازی!)، موسیقی روی بازی قرار داده میشه و بازی آماده عرضه برای بازار. ولی هنوز زوده پس عجله نکنید!

توی این مرحله از خوره بازی ها، کسانی که اون ژانر رو دوست دارند و حتی «کسی که صرفا بازی رو دوست داره ولی نه گیمره و نه اهمیتی به محتوای بازی میده» دعوت میشه که بازی رو تست کنن. تست هم معمولا یا از طریق اینترنت اطلاع رسانی میشه (تا جایی که میدونم فن‌افزار چنین کاری کرد) و یا از تیمهای دیگر درخواست میشه که تسترهاشون رو در اختیار تیم بذارن. تسترها تست میکنن. بازی میکنن و میگن «فلان جا بهتر بود معما سخت تر میشد» یا «بهمان جا موسیقی به صحنه نمیخورد». پس یک بازنگری میکنیم و اونجاهایی که واقعا توی ذوق میزنه رو تعویض میکنیم، اونجاهایی که از قصد یک تناقضی ایجاد کردیم (مثلا قرار دادن موسیقی جز امریکایی روی یک صحنه قتل پر خون) رو توضیح میدیم.

حالا وقتشه که بازی رو منتشر کنیم. چه روی استیم، چه مستقل، چه روی بازار یا هیولا، فرقی نداره. مهم اینه که باید مارکتینگ خوبی داشته باشیم (در مورد مارکتینگ خوب بازی کامپیوتری و جذب نیرو در استدیو هم خواهم نوشت) که مشتری جلب کنیم. با خارجی ها در ارتباط باشیم (چون اونها هم منتقدان خوبی دارند!) و فقط به داخل ایران محدود نشیم. ولی یادتون نره «نقدها باید شنیده بشن ولی الزامی در عمل کردن به اونها نیست». و آماده بشیم برای پروژه های بعدی.

یک کلام، برای بازی ساز شدن باید چه کار کنیم؟

اگر نظر من رو میخواید، هم باید بازی کنید، هم فیلم ببینید هم کتاب بخونید. خوندن داستانهایی مثل IT یا «برج سیاه» از استفن کینگ، دیدن فیلمهایی مثل «سگ اندلسی» از لوییس بونوئل یا حتی دیدن فیلمهای پرهیاهو و تجاری مثل «دانکرک»، بازی کردن بازیهای مستقل مثل «اینساید» یا «لایه های ترس» یا بازی های تجاری مثل «رزیدنت اویل» همه و همه کمکه. ایده ها از کره مریخ در ذهن ما نمیان، با دید ما از دنیای اطراف ساخته میشن. علاوه بر این آشنایی و کار با موتورهای بازی سازی (بخصوص یونیتی) شدیدا مهمه. حتی اگر شما صرفا تهیه کننده هستید و قرار نیست حتی یک خط هم کد بزنید، لازمه که آشنا باشید.

 

 

 

 

Share