درود مهمان گرامی! ثبت نام


امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش جاوا اسکریپت در یونیتی
#1
یکی از مهمترین کارهای شما بعنوان یک بازیساز، اسکریپت نویسی است. یونیتی به شما این امکان را میدهد که با داشتن کمترین دانش از سورس کد موتور، بازیهای مختلفی بسازید با اینحال باید نحوۀ نوشتن کد دستور دهنده به موتور یونیتی را درک کنید. کد نوشته شده برای استفاده در یونیتی،...

مبانی اسکریپت نویسی

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

در این کتاب ابتدا بر موضوع نوشتن اسکریپتها در JavaScript یونیتی تمرکز خواهیم کرد زیرا ساده ترین زبان برای شروع برنامه نویسی است و بیشترین تمرکز اسکریپت نویسی یونیتی، بر روی آن قرار دارد. در این کتاب با مبانی اسکریپت نویسی آشنا میشوید ولی اکیداً توصیه می کنیم که در کنار آن، مرجع برنامه نویسی یونیتی تحت عنوان Scripting Reference را مطالعه کنید



اغلب میتوانید مشکلاتی که طی اسکریپت نویسی با آنها مواجه میشویم را با مراجعه به این مرجع حل کنیم و اگر این کار کارساز نشد، میتوانید به اجتماعات یونیتی یا کانال Internet Relay Chat (IRC) مراجعه کرده و کمک بگیرید. 



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

بمنظور درک بهتر اسکریپتهایی که در ادامه بررسی خواهیم کرد، اجازه دهید تا بعضی از اساسی ترین قواعد اسکریپت نویسی را مرور کنیم.

 شما میتوانید از سایت هایرنت پکیج های یونیتی خریداری کنید و روند ساخت بازی را سریع تر پیش ببرید!

فرامین (Commands)

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

speed = 5;

متغیرها (Variables)

به زبان ساده، متغیرها ظرفهای حاوی اطلاعات هستند. آنها با استفاده از واژۀ var و یک لغت یا عبارت بدون فاصله، که بعد از آن قرار دارد، اعلان (تنظیم) میشوند. میتوانید با در نظر گرفتن شرایط زیر، برای متغیرها هر نامی را که مایلید، انتخاب کنید:

·         نباید از هیچیک از کلمات کلیدی موجود در کد موتور یونیتی برای نام گذاری متغیرها استفاده کرد.

·         نام متغیر می تواند شامل حروف الفبا ، اعداد و کاراکتر زیر خط ( underscore ) باشد و نباید با یک عدد آغاز شود

·         برای مثال، لغت transform نشاندهندۀ کامپوننت Transform یک شیئی است بنابراین استفاده از این کلمه برای نامگذاری یک متغیر یا یک تابع، مشکل ساز خواهد بود.

متغیرها می توانند شامل متن، اعداد، و مرجعی برای اشیاء، دارائیها یا کامپوننتها باشند. در زیر مثالی از اعلان یک متغییر ارائه شده است:

var speed = 9.0;

انواع داده ها

با تعریف نوع داده یا data type ،می توانید اطلاعات را در هنگام اعلان متغیر تعریف کنید

var speed : float = 9.0;

پیش از اعلان متغیر، از یک کالن (علامت دو نقطه ) برای تعریف نوع داده استفاده می کنیم. در این مثال، مقداری که متغیر روی آن تنظیم شده، عددی اعشاری است و بیان کرده ایم که باید نوع دادۀ float (کلمۀ اختصاریfloating point  - به معنی عدد اعشاری) را داشته باشد. 

با تعریف کردن نوع داده برای هر متغیر، میتوانیم اسکریپت خود را مؤثرتر کنیم زیرا موتوربازی دیگر نیازی ندارد برای متغیری که در حال خواندن آن است، یک نوع مناسب انتخاب کند. در زیر چند نوع دادۀ مرسوم، که در شروع اسکریپت نویسی با یونینی نیاز دارید توضیح داده شده است:
  • رشته (string): ترکیبی از متن و اعداد که در داخل علامت نقل قول ذخیره میشوند مانند "Unity".
  • عدد صحیح (int): int مخفف integer به معنی عدد صحیح و بدون اعشار است.
  • عدد اعشاری (float): نقطه ای شناور یا یک عدد اعشاری
  • متغیر منطقی (boolean): یک ارزش درست یا غلط که معمولاً بعنوان یک سوئیچ از آن استفاده میشود.
  • وکتور3 (Vector3): تنظیم مقادیر XYZ
 

استفاده از متغیرها:

پس از اعلان متغیرها، میتوان با استفاده از نام متغیر، آنها را بازیابی یا تنظیم کرد.بعنوان مثال، اگر بخواهیم متغیر سرعت را تنظیم کنیم، براحتی میگوئیم:

speed = 20;

پیش از این با var، متغیر را اعلان کرده بودیم. از var فقط برای اعلان استفاده میشود زیرا یک نوع داده است.

در ضمن میتوانیم ازمقدار یک متغیر در بخشهایی از اسکریپت خود استفاده کنیم. بعنوان مثال،  برای ذخیره سازی مقدار نصف متغیر سرعت فعلی، میتوانیم مطابق مثال زیر، یک متغیر جدید تعریف کنیم.

var speed : float = 9.0;
var halfSpeed : float;
halfSpeed
= speed/2;

توجه داشته باشید که برای متغیر halfSpeed هیچ مقداری تعریف نشده است. دلیلش آنستکه طبق آخرین فرمان،  مقدار متغیرspeed ، باید بر 2 تقسیم شود.

 

 متغیر عمومی (public )  و محلی (private )

متغیرهایی که خارج از یک تابع در اسکریپت تعریف میشوند، متغیرهای عمومی نام دارند زیرا بطور خودکار بعنوان پارامترهای کامپوننت در Inspector نمایش داده میشوند. برای مثال، هنگامیکه یک اسکریپت  CharacterMotorبعنوان یک کامپوننت شیئی،First Person Controller ضمیمه شده باشد، می توانیم متغیرهای عمومی canControl، useFixedUpdate و دیگر متغیرهای عمومی آنرا ببینیم.

resim

میتوان مقدار هر یک از این متغیرها را در Inspector تنظیم کرد.

اگر نمی خواهید مقدار یک متغیر را در Inspector تنظیم کنید، در اینصورت باید آنرا با استفاده از پیشوند private پنهان کنید. بعنوان مثال، اگر بخواهیم متغیر canControl را پنهان کنیم، باید تعریف متغیرها در اسکریپت را بصورت زیر انجام دهید.

private var canControl : boolean = true;

var useFixedUpdate : boolean = true;

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

resim

نکته: توجه داشته باشید که مقدار تنظیم شده در Inspector، مقدار اولیۀ متغیر در اسکریپت را لغو می کند. در این حالت، مقدار بیان شده در اسکریپت، بازنویسی نمیشود بلکه بسادگی طی زمان اجرای بازی، جایگزین میشود. همچنین میتوانید با کلیک کردن بر روی نماد چرخ دنده در سمت راست کاپوننت و انتخاب Reset از منوی پائین جهنده ،مقادیر را به مقادیر پیش فرض اسکریپت برگشت داد.

توابع (Functions)

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

تعریف یک تابع ،با تعیین یک نام و اضافه کردن پرانتز باز و بسته ، نوشته میشوند.و بازیساز میتواند پارامترهای اضافی را در پرانتزها قرار دهد

Update()

زمانیکه یک فایل JavaScript در یونیتی می سازید،آن سند با تابع Update() آغاز شده و چنین ظاهری دارد:

function Update(){
}
تمام دستورات یا فرامین یک تابع، باید در بین دو علامت کروشۀ باز و کروشۀ بسته قرار بگیرند. مانند مورد زیر:
function Update(){
speed
= 5;

}

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

بازیها با تعداد معینی فریم در ثانیه (FPS: frames per second) اجراء میشوند و تابع Update() در زمان رندر شدن هر یک از فریم های بازی، فراخوانده میشود. در نتیجه این تابع بیشتر در دو مورد فراخوانی می شود. یکی برای فرامینی که باید پیوسته اجراء شوند و دیگری، برای شناسایی تغییراتی از قبیل فرامین ورودی، مثل فشردن کلیدها یا کلیکهای مأوس که بطور همزمان در محیط بازی بوجود می آیند. هنگام کار کردن با فرامین فیزیکی، بجای این تابع از تابع دیگری بنام FixedUpdate() استفاده میشود زیرا این تابع با موتور فیزیکی همگام باقی می ماند در حالیکه خود تابع Update()، میتواند بر اساس نرخ فریم، متغیر باشد.

OnMouseDown()
این تابع، نمونه ای از توابعیست که در زمانی مشخص، فراخوانی میشوند. تابع OnMouseDown() تنها هنگامی فراخوانده میشود که مأوس بر روی یک شیئی یا یک عنصر GUI در بازی کلیک می کند.
از این تابع، بیشتر برای بازیهای تحت کنترل مأوس یا شناسایی کلیکها در منوها استفاده میشود. در زیر از تابع OnMouseDown()مثالی ارائه شده است. در صورت پیوستن این تابع به یک شیئی بازی، با کلیک کردن بر روی این شیئی، از بازی خارج میشویم:
function OnMouseDown(){
Application.Quit();
}

نوشتن توابع

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

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

function PlayerDeath(){
transform
.position = Vector3(0,10,50);
score
-=50;
lives
--;
}

هنگام فراخوانی تابع PlayerDeath()، هر سه فرمان آن اجراء خواهند شد. ابتدا مکان شخصیت در مختصات X=0، Y=10 و Z=50تنظیم میشود. سپس از متغیر score، 50 واحد کسر میشود و در ادامه، 1 واحد از متغیر lives کم میشود. دو علامت منهایی که در اینجا می بینید به مفهوم کم شدن 1 واحد است و بر عکس، اگر در یک اسکریپت با + + مواجه شدید، مفهومش اضافه شدن یک واحد است.

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

PlayerDeath();

 

عبارات if else

در اسکریپت نویسی برای بررسی شرایط از عبارت if استفاده میشود. اگر شرایط مورد نظر درست باشد، عبارت if مجموعه ای از دستورات تو در تو را اجراء خواهد کرد. در غیر اینصورت، مجموعه دستوراتی موسوم به else اجراء خواهد شد. در مثال زیر، عبارت if، قرار داشتن متغیر منطقی grounded در وضعیت درست (true) را بررسی می کند:

var grounded : boolean = false;
var speed : float;
function Update(){
 
if(grounded==true){
speed
= 5;
 
}

}

اگر شرط مطرح شده در کروشۀ عبارت if موجود باشد، یعنی اگر متغیر grounded درست باشد، در آنصورت متغیر speed بر روی 5 تنظیم میشود. در غیر اینصورت، مقداری برای آن در نظر گرفته نمیشود.

نکته: توجه داشته باشید که هنگام تنظیم یک متغیر، از یک نماد مساوی سادۀ "=" استفاده میشود ولی هنگام بررسی شرایط یک متغیر، از "= =" استفاده می کنیم. این علامت دو مساوی، مساویهای تطبیقی نامیده میشود. در این حالت، اطلاعات ذخیره شده در یک متغیر را با ارزش آنطرف دو علامت مساوی مقایسه می کنیم.

برای تنظیم یک شرط یدکی، میتوانیم یک عبارت else بعد از if اضافه کنیم. به این ترتیب، اظهار می کنیم که اگر این شرایط محرز نشوند، باید کار دیگری انجام شود:

var grounded : boolean = false;
var speed : float;
function Update(){
 
if(grounded==true){
speed
= 5;
 
}
 
else{
speed
= 0;
 
}
}

بنابراین مقدار speed صفر خواهد بود مگر آنکه grounded  درست (true) باشد.

برای ساخت خروجیهای بالقوۀ دیگر بمنظور بررسی شرایط، میتوانیم از یک else if پیش از else یدکی استفاده کنیم. برای بررسی مقادیر، میتوانیم بنویسیم:

if(speed >= 6){
 
//do something
}
else
 
if(speed >= 3){
//do something different
 
}
 
else{
//if neither of the above are true, do this
}

به خاطر بسپارید که هدف از نوشتن //، نوشتن کدی است که بصورت یک توضیح (نه یک کد اجراء شده) ظاهر خواهد شد. 

شما میتوانید از سایت هایرنت پکیج های یونیتی خریداری کنید و روند ساخت بازی را سریع تر پیش ببرید!
 

شرایط چند گانه

همچنین میتوانیم با استفاده از دو نماد امپرسند (&&) در یک عبارت if، بیش از یک شرایط را بررسی کنیم.

بعنوان مثال، شاید بخواهیم شرایط دو متغییر را همزمان بررسی کرده و تنها در صورتی دستوراتمان را اجراء کنیم که مقادیر متغیرها تعیین شده درست باشند. در اینصورت خواهیم نوشت:

if(speed >= 3 && grounded == true){
 
//do something
}

برای بررسی یکی از دو شرایط، میتوانیم از دو کاراکتر خط عمودی"اا" استفاده کنیم که به معنی OR (یا) است. پس به این صورت می نویسیم:

if(speed >= 3 || grounded == true){
 
//do something
}

متغیرهای Global و دات سینتکس

در این بخش، با روش استفاده از یک متغیر global (عمومی) برای ارسال اطلاعات بین اسکریپتها و روش کد نویسی Dot Syntaxبرای آدرس دهی سلسله مرتبه ای اطلاعات آشنا میشویم.

 

استفاده از استاتیک برای تعریف متغیر global

هنگام نوشتن اسکریپتها در JavaScript، نام اسکریپت شما، همان نام کلاس شماست. این به این معناست که هنگام آدرس دهی متغیرها یا توابع در دیگر اسکریپتها ، میتوانید با استفاده از نام اسکریپت که در ادامۀ آن، نام متغیر یا نام تابع نیز با استفاده از دات سینتکس آمده است، رجوع کنید.

در اصطلاح اسکریپت نویسی، یک متغیر global، بعنوان ارزش یا فرمانی در دسترس هر یک از اسکریپتها تعریف شده و تنها به توابع یا متغیرهای موجود در آن اسکریپت محدود نمیشود. برای بیان یک global در یک فایل JavaScript یونیتی، از پیشوند static استفاده میشود. بعنوان مثال:

static var canControl : boolean = true;

اگر این متغیر canControl همان متغیری بود که در اسکریپت CharacterMotor دیده بودیم، در آنصورت میتوانستیم با استفاده از نام اسکریپت و یه نقطه، از طریق یک اسکریپت دیگر به مقدار این متغییر دسترسی پیدا کرده و آنرا تنظیم کنیم. بنابراین پس از نام متغیر، مقدار آن بصورت زیر نوشته میشود:

CharacterMotor.canControl=false;

این نوع متغیر، متغیر عمومی نامیده میشود ولی همچنین، میتوانیم توابع عمومی نیز داشته باشیم که آنها را میتوان از اسکریپتهای دیگر فراخوانی کرد. برای مثال، تابع PlayerDeath() که قبلاً به آن اشاره کردیم، میتواند یک تابع استاتیک باشد و میتوانید آنرا از هر اسکریپت دیگری در بازی، فراخوانی کنید.

 

Dot Syntax

در مثال قبلی، از یک روش اسکریپت نویسی به نام dot syntax استفاده کردیم. این اصطلاح ممکن است از آنچه واقعاً هست، پیچیده تر بنظر برسد در حالیکه تنها به این معنی است که با استفاده از یک نقطه، میتوان عناصر آدرس داده شده در یک سلسله مراتب را از یکدیگر جدا کرد.

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

بعنوان مثال، برای تنظیم مکان عمودی شیئی بازی، باید مختصات Y آنرا تغییر دهیم. در واقع، باید پارامترهای مکانی یک کامپوننتTransform شیئی را آدرس دهی کنیم بنابراین می نویسیم:

transform.position.y = 50;

مفهومش این است که برای ارجاع دادن به هر پارامتر، کافیست تا با استفاده از dot syntax، کامپوننتی را که به آن تعلق دارد، پیدا کنیم.

 Comments (توضیحات):

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

مطالعۀ بیشتر

ضمن ادامۀ کار با یونیتی، بسیار مهم است که به سند Scripting Reference آن مراجعه کنید. این سند را میتوانید در راهنمای نرم افزار نصب شدۀ یونیتی خود یا در آدرس اینترنتی زیر پیدا کنید:

میتوانید از این مرجع اسکریپت نویسی، برای جستجوی کاربرد صحیح هر یک از کلاسها در موتور یونیتی استفاده کنید. اکنون که با مقدمات اسکریپت نویسی آشنا شده اید، اجازه دهید تا به اسکریپت FPSWalker نگاهی بیندازیم. این اسکریپت مسئول به حرکت درآوردن شخصیت اول شخص بازی ما است CharacterMotor از نسخه یونتی 3 به بعد جایگزین این اسکریپت شد شما می توانید این اسکریپت را از اینترنت دانلود کنید.

 
شما میتوانید از سایت هایرنت پکیج های یونیتی خریداری کنید و روند ساخت بازی را سریع تر پیش ببرید!

منبع :

http://www.ozhantasvir.ir/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C/unity3d/item/11-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C.html

 
پاسخ
 سپاس شده توسط NorthEmpire ، Milad_Hyper


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  طراحی سایت با جاوا اسکریپت mmmonire 10 4,026 3/6/1395، 02:16 صبح
آخرین ارسال: saraanistions
  آموزش جاوا اسکریپ بازی سازی masoodgiryaii 1 1,436 28/7/1393، 03:33 عصر
آخرین ارسال: sajjad3011
  آموزش ساخت بازی با جاوا اسکریپت (نظرسنجی) camry 7 3,593 23/3/1393، 01:49 صبح
آخرین ارسال: Milad_Hyper
Star جاوا نویس mm93 2 1,681 8/5/1392، 07:15 عصر
آخرین ارسال: qwerty13



کاربرانِ درحال بازدید از این موضوع: 1 مهمان