Zum Zerbrechen klicken
Lektion 6 von 18 im Kurs Roblox-Spiel: Haustiersimulator von Coddy.
Ein ClickDetector ist für einen Button in Ordnung, aber die meisten Simulatoren erfassen Klicks auf dem Client, damit das Spiel reagieren kann, sobald du klickst (mit einem Sound, einem Wackeln), noch bevor der Server antwortet. Die Maus des Clients weiß, worauf sie geklickt hat:
local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
print(mouse.Target) -- das Part unter dem Mauszeiger beim Klicken oder nil
end)Der Client kann einen Stapel nicht selbst zerstören: Der Server besitzt die Stapel und die Münzen. Er fragt über ein RemoteEvent an, ein Objekt, das für Nachrichten zwischen Client und Server entwickelt wurde:
-- Client
remotes.Hit:FireServer(pile)
-- Server: Roblox fügt den Spieler, der das Ereignis gesendet hat, als erstes Argument hinzu
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)Ein Remote trifft einen Moment später ein, da es über ein Netzwerk übertragen wird. Auf einem Smartphone ist ein Tippen dasselbe wie ein Klick.
Aufgabe
Mittel- In
PetClient:local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). BeimButton1Downder Maus: Wennmouse.Targetein Part mit dem NamenCoinPileist, löseremotes.Hitdamit aus. - In
PetServer:local remotes = game.ReplicatedStorage.Remotes, verbinderemotes.Hit.OnServerEvent, sodasshitPile(player, pile)aufgerufen wird, und entferne den ClickDetector ausspawnPile(und die Zeilelocal hitPile: Schreibe stattdessenlocal function hitPileunterspawnPile).
Drücke Spielen und klicke auf einen Stapel. Klicke dann auf Überprüfen.
Probier es selbst
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local piles = workspace.Piles
local pileSpot = {} -- jeder Haufen -> der Platz, auf dem er steht
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Jeder Spieler erhält Coins auf der Bestenliste
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
end)
-- Ein Klick auf einen Haufen benötigt hitPile, das unterhalb von spawnPile definiert wird: daher den Namen
-- hier vor beiden deklarieren
local hitPile
-- Ein Münzhaufen auf einem Platz: eine Kopie von ServerStorage.CoinPile mit Gesundheit
-- und Wert als Attributen
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
-- Klicke darauf, um ihn zu treffen
local detector = Instance.new("ClickDetector")
detector.Parent = pile
pileSpot[pile] = spot
pile.Parent = piles
detector.MouseClick:Connect(function(player)
hitPile(player, pile)
end)
return pile
end
-- Ein Treffer verringert die Gesundheit eines Haufens um 1;
-- bei 0 zerfällt der Haufen und zahlt seinen Wert aus
function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- ein neuer Haufen am selben Platz, einige Sekunden später
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Ein Haufen auf jedem Platz in Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Roblox-Spiel: Haustiersimulator
2Client und Server
Münzen auf dem Bildschirm