اسکریپتنویسی (Scripting)
اسکریپتها (Scripts) پروندههای متنی سادهای هستند که برای بازیهای شما رفتارهای سفارشی و پویا ایجاد میکنند. میتوانید با آنها رویدادهای درونبازی (in-game events) را اجرا کنید، به ورودی بازیکن (player input) پاسخ دهید، دادههای بازیکن (player data) را ذخیره کنید، جدولهای امتیاز (leaderboards) بسازید، دشمنها را به صحنه بیاورید، رفتار شخصیتهای غیربازیکن (NPCs) را کنترل کنید و کارهای بسیار دیگری انجام دهید.
این بخش برای سازندگانی است که کمی تجربهٔ کدنویسی دارند و میخواهند با جزئیات اسکریپتنویسی در آریوسنس آشنا شوند. اگر پیش از این کدنویسی نکردهاید و میخواهید با برنامهنویسی آشنا شوید، راهنمای «مبانی کدنویسی» موضوعهایی مانند متغیرها (variables)، تابعها (functions)، شرطها (conditionals)، حلقهها (loops) و آرایهها (arrays) را توضیح میدهد. برای یادگیری گامبهگامتر هم میتوانید آموزش «گیمپلی پایه» را دنبال کنید.
Luau
اسکریپتهای آریوسنس از زبان برنامهنویسی (programming language) Luau استفاده میکنند؛ زبانی که بر پایهٔ Lua 5.1 ساخته شده است.
- در مقایسه با Lua 5.1، Luau بهبودهای عملکردی و قابلیتهای کاربردی زیادی دارد؛ از جمله سامانهٔ نوعدهی اختیاری (optional typing system)، جایگذاری مقدارها در رشته (string interpolation) و پیمایش تعمیمیافته (generalized iteration) برای جدولها (tables).
- هر کدی که در Lua 5.1 معتبر باشد، در Luau هم معتبر است؛ اما این موضوع در جهت عکس صدق نمیکند.
بیشتر کتابها و منابع آنلاین Lua همچنان برای یادگیری Luau کاربرد دارند. برای دیدن تفاوتهای این دو زبان، مستندات Luau صفحهٔ سازگاری (Compatibility) را دارد. برای آشنایی با دستور زبان (syntax)، «مرجع Luau» را ببینید.
مبانی Luau (Luau basics)
Luau از نوعدهی تدریجی (gradual typing) پشتیبانی میکند؛ بنابراین لازم نیست هنگام ساخت متغیر (variable)، نوع آن را مشخص کنید. برای بررسی نوع یک مقدار (value) میتوانید از type() استفاده کنید:
logMessage = "User has more than 10 items!"
print(logMessage) --> User has more than 10 items!
print(type(logMessage)) --> stringLuau از محدودهٔ دسترسی سراسری و محلی (global and local scopes) پشتیبانی میکند، اما تقریباً همیشه بهتر است متغیرها و تابعها (functions) را با کلیدواژهٔ local بهصورت محلی تعریف کنید:
local logMessage = "User has more than 10 items!"
local function printMessage()
print(logMessage)
end
printMessage() --> User has more than 10 items!در Luau، nil نشاندهندهٔ نبود مقدار است و در عبارتهای شرطی (conditional statements) مانند false ارزیابی میشود:
local messageToUser
print(messageToUser) --> nil
print(type(messageToUser)) --> nil
if messageToUser then
-- statement evaluates to false
endهمانطور که شاید متوجه شده باشید، -- یک توضیح تکخطی (one-line comment) را آغاز میکند. --[[]] برای نوشتن توضیح چندخطی (block comment) است:
--[[
Shuts off the cosmic moon ray immediately.
Should only be called within 15 minutes of midnight Mountain Standard
Time to avoid damage to the cosmic moon ray.
]]
local function stopCosmicMoonRay()
-- add this later, it might prove important
endجدولها (Tables) اصطلاحی کلی برای آرایهها (arrays) و دیکشنریها (dictionaries) هستند. شمارهگذاری آرایهها از ۱ شروع میشود، نه از ۰؛ پس نخستین عضو آرایه در جایگاه [1] قرار دارد. برای تعریف آرایه و دیکشنری، از یک جفت آکولاد استفاده کنید:
local myArray = {"chips", "sparkling water", "salsa"}
local myDictionary = {
snack = "chips",
drink = "sparkling water",
dip = "salsa"
}
print(myArray[1]) --> chips
print(myDictionary.dip) --> salsaبرای پیمایش جدولها میتوانید از حلقههای for (for loops) بههمراه تابع ipairs() برای آرایهها و تابع pairs() برای دیکشنریها استفاده کنید. Luau امکان حذف این تابعها را هم برای نوشتن کدی سادهتر فراهم میکند:
for index, value in ipairs(myArray) do -- standard Lua
print(index, value)
end
for key, value in pairs(myDictionary) do -- standard Lua
print(key, value)
end
for key, value in myDictionary do -- Luau generalized iteration
print(key, value)
endنخستین اسکریپت شما (Your first script)
- در استودیوی آریوسنس (Studio)، نشانگر را روی ServerScriptService در پنجرهٔ کاوشگر (Explorer) ببرید و روی + کلیک کنید.
- برای افزودن اسکریپت (Script) جدید، Script را انتخاب کنید.
- روی اسکریپت راستکلیک کنید و نام آن را به HelloScript تغییر دهید.
- برای بازکردن اسکریپت در ویرایشگر اسکریپت (Script Editor)، روی آن دوبار کلیک کنید.
- کد زیر را در پرونده وارد کنید:
`lua local helloArray = {"h", "e", "l", "l", "o"} local worldArray = {"w", "o", "r", "l", "d"}
for index, value in helloArray do print(value) end
print(table.concat(worldArray)) `
- مطمئن شوید پنجرهٔ خروجی (Output) باز است.
- بازی را اجرا کنید و خروجی را ببینید:
text h e l (x2) o world
با محیط کار راحت شوید (Get comfortable)
بخش مهمی از سازگارشدن با یک محیط توسعهٔ جدید (development environment)، تنظیم آن مطابق نیازهایتان و شناخت ابزارهای در دسترس است:
- در بخش ویرایشگر اسکریپت (Script Editor) از تنظیمات استودیو (Studio Settings) میتوانید ویژگیهایی مانند قلم (font)، رنگها (colors)، تورفتگی (indentation)، تکمیل خودکار (autocomplete)، براکتها (brackets) و راهنماهای شناور (tooltips) را تنظیم کنید. شاید بخواهید حالت تاریک (dark mode) را هم در بخش Studio فعال کنید.
- با نگهداشتن Ctrl یا Command و کلیک روی یک تابع یا متغیر، به محل تعریف آن در کدتان یا مستندات آنلاینش میروید. قابلیت «یافتن و یافتن همه (Find and Find All)» هم برای جابهجایی در پروژههای بزرگتر مفید است.
- پنجرهٔ خروجی (Output) سادهترین ابزار برای فهمیدن رفتار اسکریپتهاست. از منوی ⋯ گزینههای Show Context و Show Source را فعال کنید.
- پنجرهٔ تحلیل اسکریپت (Script Analysis) خلاصهای از خطاها و هشدارها را نشان میدهد؛ بااینحال ممکن است کاربرد آن محدود باشد، چون ویرایشگر اسکریپت هنگام تایپ این موارد را مشخص میکند.
- امکانات ثبت گزارش (logging) محدود است و سطحهایی مانند DEBUG یا FATAL ندارد. از print() و warn() استفاده کنید.
برای اطلاعات بیشتر دربارهٔ تنظیم Studio برای اسکریپتنویسی، به راهنمای ویرایشگر اسکریپت (Script Editor) مراجعه کنید.
بسیاری از توسعهدهندگان ترجیح میدهند بهجای ویرایشگر داخلی، از ویرایشگر متن بیرونی (external text editor) و سامانهٔ کنترل نسخه (version control system) استفاده کنند. برای این کار میتوانید «همگامسازی اسکریپت (Script Sync)» و «ابزارهای شخص ثالث (third-party tools)» را ببینید.
دومین اسکریپت شما (Your second script)
- در استودیوی آریوسنس، در پنجرهٔ کاوشگر (Explorer) به ReplicatedStorage اسکریپت اضافه کنید و نام آن را OhNo بگذارید.
- کد زیر را در پرونده وارد کنید:
lua print("Hello script types and locations!")
- بازی را اجرا کنید.
- توجه کنید که خروجی با اجرای «نخستین اسکریپت شما» تفاوتی ندارد.
برای اینکه بفهمید چرا اسکریپت اجرا نشد، راهنمای «انواع و جایگاه اسکریپتها (Script Types and Locations)» را ببینید.