ירה
שיעור 8 מתוך 18 בקורס משחק Roblox: הגנת מגדלים של Coddy.
העמידה מול האויב היא חצי מהעבודה. shoot פוגעת במטרה באמצעות Humanoid:TakeDamage ומותירה הבזק אור קצר מהראש אל המטרה: חלק ניאון דק ש-Debris מסיר כעבור עשירית השנייה.
Debris:AddItem(ray, 0.1) -- מושמד לאחר 0.1 שניותאחרי ירייה, המגדל ממתין ל-Cooldown שלו לפני שיוכל לירות שוב; זה מה שהופך את Archer למהיר ואת Cannon לאיטי.
כאשר הבריאות של Humanoid מגיעה ל-0, אירוע Died שלו מופעל. אויב שהובס צריך לעזוב את המשחק מיד, לכן spawnEnemy מחברת את Died להשמדתו: ואז walkPath מבחינה שהוא נעלם ועוצרת.
אתגר
בינוני- קבל את השירות
Debris. כתובbeam(from, to): חלק ניאון מעוגן, בגודל 0.2 על 0.2 ובאורך המרחק, שמוגדר באמצעותCFrame.lookAt((from + to) / 2, to), ומוסר על ידי Debris לאחר 0.1 שניות. - כתוב
shoot(tower, target, info): הפעלTakeDamage(info.Damage)על ה-Humanoid של המטרה, ואז צור אלומת אור מהראש אל המטרה. - בתוך
runTower, ירה לאחר הפנייה, ואז המתן למשךinfo.Cooldownבמקום 0.1 (השאר 0.1 כשאין מטרה). - בתוך
spawnEnemy, השמד את האויב כשה-Humanoid שלו מת.
לחץ על Play, ואז על Check.
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local enemies = workspace.Enemies
local towers = workspace.Towers
print("The base can take " .. Settings.BaseHealth .. " hits")
-- נקודות הציון, לפי הסדר (שמותיהן 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
return tonumber(a.Name) < tonumber(b.Name)
end)
-- בריאות הבסיס, כתכונה של workspace: כל לקוח יכול לקרוא אותה
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)
-- כל שחקן מקבל Money בטבלת המובילים
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local money = Instance.new("IntValue")
money.Name = "Money"
money.Value = Settings.StartMoney
money.Parent = leaderstats
end)
-- אויב הגיע לבסיס
local function damageBase(amount)
local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
workspace:SetAttribute("BaseHealth", health)
end
-- הולך עם אויב לאורך המסלול. MoveTo מפסיק לנסות אחרי 8 שניות ומדווח על כך
-- (MoveToFinished עם false), ולכן שולחים שוב אויב איטי עד שהוא מגיע.
local function walkPath(enemy)
local humanoid = enemy.Humanoid
for i = 2, #waypoints do
repeat
humanoid:MoveTo(waypoints[i].Position)
until humanoid.MoveToFinished:Wait() or not enemy.Parent
if not enemy.Parent then
return
end
end
-- הוא הגיע לבסיס
damageBase(Settings.Enemies[enemy.Name].Damage)
enemy:Destroy()
end
-- אויב חדש בשער, מתקדם לאורך המסלול
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- מוצב ממש מעל נקודת הציון הראשונה
enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
local info = Settings.Enemies[kind]
enemy.Humanoid.MaxHealth = info.Health
enemy.Humanoid.Health = info.Health
enemy.Humanoid.WalkSpeed = info.Speed
enemy.Parent = enemies
task.spawn(walkPath, enemy)
return enemy
end
-- האויב החי הקרוב ביותר בטווח מנקודה מסוימת, או nil
local function nearestEnemy(position, range)
local best, bestDistance = nil, range
for _, enemy in enemies:GetChildren() do
local root = enemy:FindFirstChild("HumanoidRootPart")
if root and enemy.Humanoid.Health > 0 then
local distance = (root.Position - position).Magnitude
if distance <= bestDistance then
best, bestDistance = enemy, distance
end
end
end
return best
end
-- פעולת המגדל: לכוון אל האויב הקרוב ביותר בטווח
local function runTower(tower)
local info = Settings.Towers[tower.Name]
while tower.Parent do
local target = nearestEnemy(tower.Head.Position, info.Range)
if target then
tower.Head.CFrame = CFrame.lookAt(tower.Head.Position, target.HumanoidRootPart.Position)
task.wait(0.1)
else
task.wait(0.1)
end
end
end
-- לבנות מגדל על משטח
local function placeTower(pad, kind)
local tower = ServerStorage.Towers[kind]:Clone()
tower:PivotTo(pad.CFrame + Vector3.new(0, pad.Size.Y / 2 + 1, 0))
tower.Parent = towers
task.spawn(runTower, tower)
end
-- הלקוח מבקש להציב מגדל על משטח
remotes.Place.OnServerEvent:Connect(function(player, pad, kind)
placeTower(pad, kind)
end)
-- גל אחד: האויבים שלו מופיעים בזה אחר זה, ואז ממתינים עד שכולם נעלמים
local function runWave(list)
for _, kind in list do
spawnEnemy(kind)
task.wait(Settings.SpawnGap)
end
while #enemies:GetChildren() > 0 do
task.wait(0.2)
end
end
-- הגלים, כל אחד אחרי הפסקה
for i, list in Settings.Waves do
task.wait(Settings.WaveBreak)
runWave(list)
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משחק Roblox: הגנת מגדלים
תרגלו בעצמכם: Roblox אונליין