کدنویسی بازی روبلاکس با ChatGPT: ساخت اسکریپتهای Lua بدون برنامهنویسی پیشرفته
- دستهبندی: مجله آسانجم
روبلاکس (Roblox) یکی از قدرتمندترین پلتفرمهای ساخت بازی چندنفره در دنیاست و زبان زیربنایی آن نسخهای بهینهشده و منحصربهفرد از زبان لوآ به نام Luau است. در گذشته، ورود به عرصه توسعه روبلاکس نیازمند یادگیری عمیق سینتکس کدنویسی، مدیریت رویدادها (Event-driven Programming) و ساختار کلاینت-سرور بود. امروزه با تلفیق مدلهای زبانی بزرگ نظیر ChatGPT، شما بدون تسلط عمیق بر مبانی مهندسی نرمافزار، میتوانید ایدههای خود را به اسکریپتهای کاربردی و بهینه تبدیل کنید.
این راهنما قدمبهقدم، ساختاریافته و با بالاترین سطح جزئیات فنی نوشته شده تا بتوانید به عنوان یک دولوپر مستقل (Indie Developer) اسکریپتهای حرفهای بسازید، خطایابی کنید و سازوکارهای چندنفره پایدار طراحی نمایید.
برای خرید روباکس بازی روبلاکس از فروشگاه آسان جم کلیک کنید.
پیشنیازهای کدنویسی بازی روبلاکس با ChatGPT
قبل از آنکه به ChatGPT پرامپت بدهید، باید چارچوب عملکردی موتور روبلاکس (Roblox Engine) را بشناسید تا خطاهای دریافتی از هوش مصنوعی را درک و اصلاح کنید.
مدل کلاینت-سرور و FilteringEnabled
روبلاکس یک ساختار شبکه توزیعشده با قابلیت داخلی ضدتقلب دارد:
- سرور (Server): پردازشهای امنیتی، ذخیره داده بازیکن (DataStore)، کم و زیاد کردن سکه و سلامت، منطق اسپاون دشمنان و تایید اعمال.
- کلاینت (Client): دستگاه بازیکن (موبایل، پیسی، کنسول). رندرینگ گرافیکی، صداهای لوکال، دریافت کلیدهای کیبورد/لمس، و انیمیشنهای ظاهری رابط کاربری (UI).
- ارتباط میان آنها: از طریق شیءهایی به نام RemoteEvent (ارسال سیگنال بدون نیاز به پاسخ) و RemoteFunction (درخواست و دریافت پاسخ) انجام میشود. کلاینت هرگز نباید مستقیماً میزان پول، جان یا امتیاز خود را در دیتابیس تغییر دهد.

انواع اسکریپتها در Luau
روبلاکس سه نوع اسکریپت اصلی دارد:
- Server Script (اسکریپت معمولی): فقط روی سرور اجرا میشود. معمولاً درون ServerScriptService، Workspace یا اشیاء فیزیکی قرار میگیرد.
- LocalScript: فقط روی کلاینت اجرا میشود. حتماً باید داخل مکانهایی مانند StarterPlayerScripts، StarterCharacterScripts، StarterGui، یا ابزارهای مجهز به دست بازیکن (Tool) قرار بگیرد.
- ModuleScript: کدهای مشترک و توابع قابل استفاده مجدد که با استفاده از تابع require() در سایر اسکریپتها فراخوانی میشوند.
مهندسی پرامپت تخصصی برای تولید کد Luau روبلاکس
چتجیپیتی زبان عمومی Lua 5.1 را بهخوبی میداند، اما روبلاکس از Luau استفاده میکند که تایپگذاری اختیاری (Strict Typing)، توابع مدرن و APIهای خاص خود را دارد. نوشتن پرامپتهای مبهم منجر به کدهای باگدار، قدیمی یا غیرایمن میشود.
برای خرید اکانت چت جی پی تی از آسان جم کلیک کنید.
الگوی استاندارد پرامپت نویسی (Roblox Prompt Framework)
هنگام ارسال دستور، ساختار زیر را رعایت کنید:
[نقش (Persona)]: تو یک توسعهدهنده ارشد بازی در Roblox Studio و متخصص زبان Luau هستی.
[هدف (Objective)]: من میخواهم سیستمی بسازم که …
[محل قرارگیری (Placement)]:
– سرور اسکریپت در ServerScriptService
– لوکال اسکریپت در StarterPlayerScripts
– اشیاء شبکه در ReplicatedStorage
[قوانین فنی (Constraints)]:
– از قوانین امنیتی Client-Server پیروی کن و RemoteEvent بهکار ببر.
– به جای wait() از task.wait() استفاده کن.
– از GetService به صورت کامل برای فراخوانی سرویسها استفاده کن.
– کد کامنتگذاری شده و دارای مدیریت خطا (pcall) باشد.
سناریو ۱: ساخت چکپوینت و سیستم ذخیره سکه با DataStore2 / ProfileService
بیایید یک سیستم جمعآوری سکه و ذخیره آن را مرحلهبهمرحله طراحی کنیم.
گام اول: ساخت فیزیک سکه در بازی
۱. در فضای Roblox Studio، یک پارت استوانهای (Cylinder) اضافه کنید.
۲. نام آن را Coin بگذارید و تیک Anchored را فعال و تیک CanCollide را غیرفعال کنید.
گام دوم: پرامپت به ChatGPT برای چرخش سکه و تشخیص برخورد
پرامپت:
یک اسکریپت سرور Luau برای روبلاکس بنویس که روی شیء Coin قرار میگیرد. این اسکریپت باید سکه را آرام بچرخاند. وقتی شخصیت بازیکن با آن برخورد کرد (Touched Event):
۱. بررسی کند که برخوردکننده حتماً بازیکن باشد (نه پارت دیگری).
۲. چک کند آیا سکه در وضعیت کولداون (Cooldown) نیست (Debounce).
۳. به ارزش سکه بازیکن در Leaderstats مقدار ۱۰ تا اضافه کند.
۴. صدای محلی پخش کند و سکه به مدت ۵ ثانیه نامرئی و غیرفعال شود و سپس مجدد فعال گردد.

سناریو ۱: ساخت سکه قابلجمعآوری و ذخیره تعداد سکهها
در این آموزش، بازیکن با لمس سکه، ۱۰ سکه دریافت میکند. سکه برای پنج ثانیه ناپدید میشود و سپس برمیگردد. تعداد سکهها در جدول امتیازات نمایش داده میشود و برای ورودهای بعدی بازیکن نیز ذخیره خواهد شد.
نکته: پوشه leaderstats فقط مقدار را در جدول امتیازات نمایش میدهد؛ برای نگهداری مقدار بین جلسات بازی باید آن را جداگانه با DataStoreService ذخیره کرد. (create.roblox.com)
گام اول: آمادهکردن اشیاء در Roblox Studio
۱. در Workspace یک Part بسازید و نام آن را Coin بگذارید. Anchored را روشن و CanCollide را خاموش کنید.
۲. در ReplicatedStorage یک RemoteEvent به نام CoinSoundEvent بسازید.
۳. در SoundService یک Sound به نام CoinPickupSound بسازید و در ویژگی SoundId آن، شناسه یک صدای معتبر و قابلاستفاده برای بازیتان را قرار دهید.
۴. برای ذخیرهسازی، بازی را منتشر کنید و دسترسی Studio به API Services را در نسخه آزمایشی بازی فعال کنید. مستندات روبلاکس هشدار میدهد که تست Studio میتواند به دادههای همان بازی دسترسی پیدا کند؛ بنابراین تنظیمات ذخیرهسازی را بیاحتیاط روی نسخه زنده آزمایش نکنید. (create.roblox.com)
گام دوم: ساخت Coins و ذخیرهسازی آن
یک Script به نام PlayerCoins در ServerScriptService بسازید و کد زیر را داخل آن قرار دهید. این اسکریپت مقدار قبلی را هنگام ورود میخواند، پوشه leaderstats و مقدار Coins را میسازد و هنگام بازی، خروج بازیکن و بستهشدن سرور برای ذخیره تلاش میکند.
local Players = game:GetService(“Players”)
local DataStoreService = game:GetService(“DataStoreService”)
local coinStore = DataStoreService:GetDataStore(“PlayerCoins_V1”)
local loaded = {}
local saving = {}
local function saveCoins(player)
while saving[player] do
task.wait(0.1)
end
if not loaded[player] then return end
local stats = player:FindFirstChild(“leaderstats”)
local coins = stats and stats:FindFirstChild(“Coins”)
if not coins then return end
saving[player] = true
local balance = coins.Value
local key = “User_” … player.UserId
local success, message
for attempt = 1, 3 do
success, message = pcall(function()
coinStore:UpdateAsync(key, function()
return balance
end)
end)
if success then break end
if attempt < 3 then task.wait(attempt * 2) end
end
saving[player] = nil
if not success then
warn(“ذخیره سکه ناموفق بود: ” … tostring(message))
end
end
local function onPlayerAdded(player)
local key = “User_” … player.UserId
local success, storedBalance = pcall(function()
return coinStore:GetAsync(key)
end)
if not success then
warn(“خواندن سکه ناموفق بود: ” … tostring(storedBalance))
player:Kick(“بارگذاری داده انجام نشد؛ لطفاً دوباره وارد شوید.”)
return
end
if storedBalance ~= nil and
(typeof(storedBalance) ~= “number” or storedBalance < 0 or storedBalance ~= math.floor(storedBalance)) then
player:Kick(“داده سکه نامعتبر است.”)
return
end
if not player.Parent then return end
local stats = Instance.new(“Folder”)
stats.Name = “leaderstats”
local coins = Instance.new(“IntValue”)
coins.Name = “Coins”
coins.Value = storedBalance or 0
coins.Parent = stats
stats.Parent = player
loaded[player] = true
task.spawn(function()
task.wait(math.random(90, 120))
while loaded[player] and player.Parent do
saveCoins(player)
task.wait(120)
end
end)
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(function(player)
saveCoins(player)
loaded[player] = nil
end)
game:BindToClose(function()
local remaining = 0
for _, player in ipairs(Players:GetPlayers()) do
if loaded[player] then
remaining += 1
task.spawn(function()
saveCoins(player)
remaining -= 1
end)
end
end
while remaining > 0 do
task.wait(0.1)
end
end)
محدودیت مهم: این یک نمونه آموزشی برای شروع است، نه سامانه کامل داده برای یک بازی پرترافیک. ذخیرهسازی حرفهای به مدیریت دقیقتر خطاها و تداخل ورود یک بازیکن به سرورهای مختلف نیاز دارد؛ حتی استفاده از UpdateAsync بهتنهایی جای قفل نشست را نمیگیرد. (create.roblox.com)
گام سوم: ساخت اسکریپت جمعآوری سکه
یک Script داخل Part با نام Coin قرار دهید:
local Players = game:GetService(“Players”)
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local coinSoundEvent = ReplicatedStorage:WaitForChild(“CoinSoundEvent”)
local coin = script.Parent
local COIN_VALUE = 10
local RESPAWN_TIME = 5
local collected = false
task.spawn(function()
while coin.Parent do
task.wait(0.05)
coin.CFrame *= CFrame.Angles(0, math.rad(4), 0)
end
end)
coin.Touched:Connect(function(hit)
if collected then return end
local character = hit.Parent
local player = character and Players:GetPlayerFromCharacter(character)
if not player then return end
local stats = player:FindFirstChild(“leaderstats”)
local coins = stats and stats:FindFirstChild(“Coins”)
if not coins then return end
collected = true
coins.Value += COIN_VALUE
coin.Transparency = 1
coinSoundEvent:FireClient(player)
task.delay(RESPAWN_TIME, function()
if not coin.Parent then return end
coin.Transparency = 0
collected = false
end)
end)
در نسخه قبلی، CanTouch سکه هنگام جمعآوری خاموش میشد. در این نسخه، وضعیت collected مانع دریافت دوباره سکه است و اتصال رویداد Touched دستنخورده میماند؛ این کار از مشکل احتمالی قطعشدن اتصال رویداد هنگام تغییر CanTouch جلوگیری میکند. (create.roblox.com)
گام چهارم: پخش صدا فقط برای بازیکنی که سکه را برداشته است
یک LocalScript به نام CoinSoundClient در StarterPlayerScripts قرار دهید:
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local SoundService = game:GetService(“SoundService”)
local coinSoundEvent = ReplicatedStorage:WaitForChild(“CoinSoundEvent”)
local coinSound = SoundService:WaitForChild(“CoinPickupSound”)
coinSoundEvent.OnClientEvent:Connect(function()
SoundService:PlayLocalSound(coinSound)
end)
این بار صدای محلی واقعاً پیادهسازی شده است: سرور فقط به بازیکن جمعکننده پیام میدهد و صدای انتخابشده روی دستگاه همان بازیکن پخش میشود. (create.roblox.com)
سناریو ۲: ساخت فروشگاه ساده با SpeedBoost و JumpBoost
یکی از رایجترین خطاهای افراد کمتجربه این است که خرید آیتم را درون کلاینت ثبت میکنند. بیایید این ساختار را با رعایت استانداردهای ایمنی پیاده کنیم.

در این نمونه، هر دو آیتم واقعاً اثر دارند. SpeedBoost سرعت حرکت و JumpBoost توان یا ارتفاع پرش را افزایش میدهد. هر آیتم در هر بار زندهبودن شخصیت فقط یکبار قابل خرید است؛ اثر آن پس از ظاهرشدن دوباره شخصیت باقی نمیماند. قیمتها و موجودی در سرور بررسی میشوند، نه در LocalScript. برای JumpBoost نیز کد بررسی میکند شخصیت از JumpPower استفاده میکند یا JumpHeight. (create.roblox.com)
گام اول: ساخت دکمهها
در ReplicatedStorage یک RemoteEvent به نام BuyItemEvent بسازید. سپس در StarterGui، داخل یک ScreenGui، دو TextButton با نامهای دقیق SpeedBoost و JumpBoost قرار دهید. یک نسخه از LocalScript زیر را داخل هر دو دکمه بگذارید:
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local buyEvent = ReplicatedStorage:WaitForChild(“BuyItemEvent”)
local button = script.Parent
button.Activated:Connect(function()
buyEvent:FireServer(button.Name)
end)
رویداد Activated برای کلیک، لمس و ورودی دسته بازی مناسب است. (create.roblox.com)
گام دوم: بررسی خرید و تحویل قابلیت در سرور
یک Script به نام ShopHandler در ServerScriptService بسازید:
local Players = game:GetService(“Players”)
local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local buyEvent = ReplicatedStorage:WaitForChild(“BuyItemEvent”)
local PRICES = {
SpeedBoost = 50,
JumpBoost = 75
}
local purchases = {}
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function()
purchases[player] = {}
end)
end)
Players.PlayerRemoving:Connect(function(player)
purchases[player] = nil
end)
buyEvent.OnServerEvent:Connect(function(player, itemName)
if typeof(itemName) ~= “string” then return end
local price = PRICES[itemName]
if not price then return end
local character = player.Character
local humanoid = character and character:FindFirstChildOfClass(“Humanoid”)
if not humanoid or humanoid.Health <= 0 then return end
local stats = player:FindFirstChild(“leaderstats”)
local coins = stats and stats:FindFirstChild(“Coins”)
if not coins or not coins:IsA(“IntValue”) then return end
purchases[player] = purchases[player] or {}
if purchases[player][itemName] then return end
if coins.Value < price then return end
purchases[player][itemName] = true
coins.Value -= price
if itemName == “SpeedBoost” then
humanoid.WalkSpeed += 8
elseif itemName == “JumpBoost” then
if humanoid.UseJumpPower then
humanoid.JumpPower += 15
else
humanoid.JumpHeight += 3
end
end
end)
راهنمای کاربردی دیباگ، خواندن خطاها و رفع باگ با ChatGPT
هنگام کار با اسکریپتهای تولیدی، ممکن است در پنجره Output در روبلاکس استودیو خطاهایی با رنگ قرمز مشاهده کنید. برای رفع آنها، نباید کل کد را پاک کنید، بلکه باید خطا را مستقیماً به چتجیپیتی گزارش دهید.
| متن خطا در Output | علت اصلی | دستور رفع خطاب به ChatGPT |
|---|---|---|
| Attempt to index nil with ‘Parent’ | آبجکت هنوز در بازی لود نشده یا نابود شده است. | کد را طوری بازنویسی کن که با WaitForChild وجود آبجکت را تأیید کند و قبل از دسترسی، nil نبودن آن چک شود. |
| ServerScriptService:XX: attempt to call a nil value | نام متد غلط است یا تابعی فراخوانی شده که وجود ندارد. | خط XX را بررسی کن. احتمالاً متد به اشتباه تایپ شده یا API منقضی شده است. |
| Cannot load sound / animation: Asset ID does not exist | آیدی اسکریپت شده اشتباه است یا دسترسی به آن محدود است. | فرمت استاندارد رشته rbxassetid:// را تصحیح کن. |
| DataStore request was dropped / Queue full | ارسال مکرر درخواست ذخیرهسازی داده بدون زمان تاخیر مجاز (Throttling). | مکانیزم Auto-save با فواصل حداقل ۶۰ ثانیهای و ترکیب تغییرات در جدول حافظه (Cache) اضافه کن. |
چکلیست کدنویسی بازی روبلاکس با ChatGPT
برای اینکه بازدهی کدنویسی خود را به حداکثر برسانید، این اصول را همواره به یاد داشته باشید:
مدولار فکر کنید: هرگز از ChatGPT نخواهید: یک بازی کامل بتل رویال برایم بنویس. در عوض درخواستها را به بخشهای مجزا بشکنید:
- گام ۱: ساخت سیستم جان و دمیج خوردن.
- گام ۲: سیستم شلیک ریکست (Raycasting).
- گام ۳: جدول امتیازات (Leaderboard).
- گام ۴: مکانیزم راند و ریست نقشه.
- استفاده از task.wait() به جای wait(): موتور روبلاکس سالهاست wait() قدیمی را منسوخ اعلام کرده است. حتماً مطمئن شوید خروجی هوش مصنوعی از کتابخانه مدرن task (task.spawn, task.delay, task.wait) استفاده میکند.
- همیشه تب Output را باز نگه دارید: در منوی بالای استودیو از تب View گزینه Output را فعال کنید. هر عملکرد مشکوک یا متوقفشده را میتوانید از گزارشهای این پنجره ردگیری نمایید.
- تست در حالت شبیهساز شبکه: برای بررسی عملکرد سیستمهای چندنفره، از منوی Test گزینه Start Server را با ۲ کلاینت اجرا کنید تا مطمئن شوید اتفاقاتی که بازیکن الف تجربه میکند، برای بازیکن ب به درستی همگامسازی (Replicate) میشود.
جمعبندی
ساخت بازی در روبلاکس با کمک ChatGPT دیگر یک رویای دور از دسترس نیست، بلکه به یک روش استاندارد و فوقالعاده سریع برای بازیسازان مستقل تبدیل شده است. همانطور که دیدید، راز موفقیت در این مسیر، برنامهنویسی پرامپت هوشمندانه، آشنایی با اصول ساختار کلاینت-سرور و قابلیتهای مدرن زبان Luau است.
هوش مصنوعی قرار نیست جایگزین خلاقیت، تفکر منطقی و معماری بازی شما شود؛ بلکه به عنوان یک دستیار قدرتمند، کارهای تکراری سینتکسنویسی، محاسبه فرمولها و دیباگ اولیه را برای شما انجام میدهد تا شما روی طراحی تجربه کاربری و جذابیت بازی تمرکز کنید. با رعایت اصول امنیتی (مانند انتقال منطق خرید و امتیازات به سرور) و استفاده از ابزارهای استودیو، میتوانید در کوتاهترین زمان، بازیهای چندنفره پایدار و حرفهای خلق کنید.
سوالات متداول
آیا برای استفاده از این راهنما و کدنویسی با ChatGPT حتماً باید برنامهنویسی بلد باشیم؟
خیر! زیبایی استفاده از ChatGPT در روبلاکس این است که نیازی به حفظ کردن سینتکسهای پیچیده زبان Luau ندارید. با این حال، داشتن درک کلی از اینکه اسکریپتها کجا قرار میگیرند (مثل ServerScriptService یا StarterGui) و منطق کلی اجرای کدها به شما کمک میکند پرامپتهای دقیقتری بنویسید و کدهای خروجی را به درستی در پروژه جایگذاری کنید.
چرا کدهایی که ChatGPT میدهد گاهی اوقات در روبلاکس کار نمیکنند یا خطا میدهند؟
مدلهای هوش مصنوعی آموزش عمومی دیدهاند و ممکن است گاهی از توابع منسوخشده (مثل تابع قدیمی wait() به جای task.wait()) استفاده کنند، یا تفاوتهای ظریف بین زبان Lua استاندارد و زبان اختصاصی Luau در روبلاکس را نادیده بگیرند. بهترین راه این است که متن دقیق خطای نمایشدادهشده در پنجره Output روبلاکس استودیو را کپی کرده و به همراه کد به ChatGPT بدهید تا آن را اصلاح کند.
چطور بفهمیم کدی که هوش مصنوعی نوشته باگ امنیتی (مثل تقلب بازیکنان) ندارد؟
قانون طلایی در روبلاکس این است: به کلاینت اعتماد نکنید! هرگز نباید تغییر مقادیر حساسی مثل سکه، جان، تجربه یا اهدای آیتم را مستقیماً به اسکریپتهای سمت کلاینت (LocalScript) بسپارید. حتماً درخواست بازیکن را از طریق RemoteEvent به سرور بفرستید، اعتبارسنجی را در سرور (Server Script) انجام دهید و سپس تغییرات را اعمال کنید. در پرامپتهای خود به ChatGPT حتماً تاکید کنید که معماری امن کلاینت-سرور را رعایت کند.
بهترین روش برای یادگیری پرامپتنویسی حرفهای برای روبلاکس چیست؟
بهترین روش، ساختاری کردن دستورات است. همیشه ابتدا نقش هوش مصنوعی (به عنوان توسعهدهنده ارشد روبلاکس)، سپس هدف دقیق (مثلاً ساخت سیستم ذخیره دکمه)، محل دقیق قرارگیری اسکریپت در استودیو، و در نهایت محدودیتها و قوانین فنی (مانند استفاده از Serviceها و مدیریت خطا با pcall) را به صورت بخشبندی شده در پرامپت خود بنویسید.
ثبت نظر
برای ثبت نظر وارد اکانت خود شوید
پیشنهاد جستجو