Ten projekt wykorzysta instrukcje warunkowe do stworzenia elementu, który przyzna lub odejmie punkty na tablicy liderów w zależności od koloru elementu, gdy zostanie dotknięty. Jeśli kolor jest niebieski, przyzna graczom kilka punktów. Jeśli zielony, przyzna dużo punktów. Na koniec, jeśli czerwony, odejmie punkty.
Ustaw projekt
Element przyznający punkty można dodać do każdego projektu, w którym punkty mają znaczenie. Na przykład, w grze przygodowej, w której gracze zbierają punkty.
Śledzenie punktów
Aby skonfigurować ten projekt, potrzebujesz tablicy liderów do śledzenia punktów oraz elementu, który zmienia kolory. Kod dla tablicy liderów zostanie dostarczony.
Utwórz nowy skrypt w ServerScriptService o nazwie Leaderboard. Skopiuj i wklej poniższy kod do skryptu.
--W ServerScriptService, utwórz skrypt o nazwie PlayerSetup z poniższą zawartością.local Players = game:GetService("Players")local function onPlayerJoin(player)local leaderstats = Instance.new("Folder")leaderstats.Name = "leaderstats"leaderstats.Parent = player-- Przykład IntValuelocal points = Instance.new("IntValue")points.Name = "Points"points.Value = 0points.Parent = leaderstatsend-- Uruchom onPlayerJoin, gdy zdarzenie PlayerAdded zostanie wywołanePlayers.PlayerAdded:Connect(onPlayerJoin)
Element zmieniający kolor
Skrypt będzie cyklicznie zmieniać trzy różne kolory dla elementu. Każdy kolor będzie miał zmienną do przechowywania swojej wartości RGB, typu danych, który zawiera zestaw trzech liczb (czerwony, zielony, niebieski), które tworzą kolory.
Utwórz element o nazwie PointPart z dołączonym skryptem o nazwie PointScript.
W PointScript użyj script.Parent, aby odwołać się do elementu.
local pointPart = script.ParentUtwórz zmienne do przechowywania różnych kolorów. Każda zmienna powinna być ustawiona na Color3.fromRGB(), co tworzy wartość koloru.
- Niebieski (Kilka punktów): (0, 0, 255)
- Zielony (Wiele punktów): (0, 255, 0)
- Czerwony (Utrata punktów): (255, 0, 0)
local pointPart = script.Parent-- Kolorylocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)Dodaj zmienne dla małej ilości punktów, większej ilości punktów i trzeciej dla odejmowania punktów.
-- Kolorylocal blue = Color3.fromRGB(0, 0, 255)local green = Color3.fromRGB(0, 255, 0)local red = Color3.fromRGB(255, 0, 0)-- Wartości punktówlocal smallPoints = 10local largePoints = 50local losePoints = 100
Dodaj usługę graczy
Aby przyznać punkty, będziesz musiał uzyskać dostęp do informacji o graczu, które są przechowywane w Explorerze pod Players, i są oddzielne od obiektu postaci. To tutaj można znaleźć informacje, takie jak statystyki tablicy liderów.
Możesz to zrobić, dodając usługę Players do swojego skryptu. Usługi to dodatkowe zestawy wstępnie zbudowanych funkcji stworzonych przez inżynierów Roblox, aby zaoszczędzić Twój czas.
Uzyskaj usługę Players, wpisując:
local Players = game:GetService("Players")
-- Wartości punktówlocal smallPoints = 10local largePoints = 50local losePoints = 100-- Potrzebne usługilocal Players = game:GetService("Players")
Funkcje i zdarzenia
Skrypt PointsScript będzie potrzebować dwóch funkcji. Pierwsza funkcja będzie przyznawać i odejmować punkty. Druga funkcja będzie sprawdzać, czy gracz dotknął elementu. Te funkcje zostaną następnie połączone ze zdarzeniem dotyku, które działa, gdy ten element jest dotykany.
Utwórz nową funkcję o nazwie givePoints() oraz parametr o nazwie player. Wewnątrz dodaj instrukcję print do użycia w testach.
local Players = game:GetService("Players")-- Przyznaje lub odejmuje punktylocal function givePoints(player)print("Przyznawanie punktów graczowi")endPoniżej tego stwórz drugą funkcję o nazwie partTouched() z parametrem o nazwie otherPart.
-- Przyznaje lub odejmuje punktylocal function givePoints(player)print("Przyznawanie punktów graczowi")end-- Sprawdza, czy gracz dotknął elementulocal function partTouched(otherPart)endWewnątrz funkcji użyj funkcji GetPlayerFromCharacter(), aby sprawdzić, czy w zmiennej otherPart jest gracz.
-- Sprawdza, czy gracz dotknął elementulocal function partTouched(otherPart)local player = Players:GetPlayerFromCharacter(otherPart.Parent)endJeśli gracz dotknął elementu, zostanie on przechowany w zmiennej player. Jeśli nie, zmienna pozostanie pusta. Na własną rękę:
- W funkcji sprawdź, czy player ma wartość. Jeśli tak, to wywołaj givePoints(player).
- Pod funkcją połącz partTouched() ze zdarzeniem Touched elementu pointPart.
-- Sprawdza, czy gracz dotknął elementulocal function partTouched(otherPart)-- Uzyskuje gracza, jeśli dotknął elementulocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)Uruchom projekt. Kiedy gracz dotknie elementu, powinieneś zobaczyć komunikat w oknie wyjścia mówiący: "Przyznawanie punktów graczowi"
Wskazówki dotyczące rozwiązywania problemów:
- Sprawdź, czy "Players" w game:GetService("Players") jest napisane wielką literą i w cudzysłowie.
- partTouched() powinno być połączone ze zdarzeniem Touched elementu pointPart.
Stwórz Zmienność Kolorów
Aby cyklicznie przechodzić przez kolory, skrypt użyje pętli while, która zmienia kolor elementu co kilka sekund. Warunek dla tej pętli będzie prawdziwy, co oznacza, że może działać w nieskończoność.
Na końcu skryptu utwórz nową pętlę while, w której warunek jest prawdziwy, co oznacza, że pętla zawsze działa.
-- Sprawdza, czy gracz dotknął elementulocal function partTouched(otherPart)-- Uzyskuje gracza, jeśli dotknął elementulocal player = Players:GetPlayerFromCharacter(otherPart.Parent)if player thengivePoints(player)endendpointPart.Touched:Connect(partTouched)-- Zmienia kolorywhile true doendNa własną rękę, zapisz pętlę while true do, która zmienia kolor pointPart na utworzone zmienne kolorów. Nie zapomnij użyć task.wait() między kolorami. Po zakończeniu, sprawdź swój kod z wersją poniżej.
-- Zmienia kolory 3 razy, czekając między każdym koloremwhile true dopointPart.Color = bluetask.wait(3)pointPart.Color = greentask.wait(2)pointPart.Color = redtask.wait(1)endTestuj i sprawdź, czy wszystkie trzy kolory zmieniają się bez zatrzymywania.

Wskazówki dotyczące rozwiązywania problemów
Na tym etapie, jeśli pętla kolorów nie działa tak, jak powinna, spróbuj jednego z poniższych rozwiązań.
- Sprawdź, czy pętla while jest na dole skryptu, poniżej zdarzenia Touched. Jeśli pętla nie jest na dole, nie pozwoli innym częściom skryptu działać prawidłowo.
- Sprawdź, czy każdy kolor wewnątrz Color3.fromRGB() jest poprawnie zapisany. Musi być trzy liczby między 0 a 255 oddzielone przecinkami, np. (255, 50, 0).
Przyznawanie punktów graczom
Gracze będą otrzymywać punkty w zależności od aktualnego koloru elementu, gdy go dotkną.
Znajdź aktualny kolor
Kiedy gracz dotknie elementu, skrypt musi wiedzieć, jaki jest aktualny kolor elementu, aby później przyznać punkty.
Zlokalizuj givePoints(). Zastąp swój testowy komunikat zmienną dla aktualnego koloru pointPart. Ta zmienna określi, ile punktów gracz otrzymuje (lub traci).
lokalna funkcja givePoints(player)local currentColor = pointPart.ColorendAby wpłynąć na punkty gracza, ta funkcja potrzebuje dostępu do tablicy liderów gracza. Utwórz zmienną do jej przechowywania.
lokalna funkcja givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")endTeraz dodaj zmienną, aby uzyskać wartość punktów gracza, która jest dzieckiem ich tablicy liderów.
lokalna funkcja givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")end
Przyznawanie lub odejmowanie punktów
Następnie użyjesz if i elseif, aby przyznać lub odejmować punkty w zależności od koloru elementu, gdy zostanie dotknięty. Pamiętaj, że niebieski przyznaje małą ilość punktów, zielony przyznaje wiele, a czerwony odejmuje punkty.
Wewnątrz givePoints(), poniżej zmiennych, użyj instrukcji if, aby sprawdzić, czy aktualny kolor jest niebieski, i jeśli tak, dodaj smallPoints do aktualnej wartości punktów gracza.
lokalna funkcja givePoints(player)local currentColor = pointPart.Colorlocal playerStats = player:WaitForChild("leaderstats")local playerPoints = playerStats:WaitForChild("Points")if currentColor == blue thenplayerPoints.Value += smallPointsendendAby sprawdzić kolor zielony, dodaj warunek else if. Jeśli zielony, dodaj zmienną largePoints do punktów gracza.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointsendUżyj instrukcji else, aby odjąć punkty, jeśli pointPart nie był ani niebieski, ani zielony.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendNa koniec, zniszcz element po instrukcji if, aby skrypt nie mógł dalej przyznawać punktów.
if currentColor == blue thenplayerPoints.Value += smallPointselseif currentColor == green thenplayerPoints.Value += largePointselseplayerPoints.Value -= losePointsendpointPart:Destroy()Testuj i sprawdź, czy każdy kolor przyznaje punkty zgodnie z oczekiwaniami. Upewnij się, że przetestujesz wszystkie trzy warunki.
Przyznawanie graczom informacji zwrotnej
PointPart działa, ale gracze mogą nie zauważać, że coś się wydarzyło, chyba że akurat patrzą na swoją tablicę liderów. Napraw to, tworząc cząsteczki, gdy PointPart zostanie zniszczony.
Dodanie informacji zwrotnej, gdy gracze korzystają z elementu, takich jak dźwięki, drżenia czy cząsteczki, sprawia, że interakcje z przedmiotami są bardziej satysfakcjonujące dla graczy.
Utwórz efekt cząsteczek
Efekt cząsteczek będzie miał ten sam kolor, co element, gdy zostanie dotknięty. Ponieważ kolory były przechowywane w zmiennych, łatwo jest je ponownie wykorzystać.
W givePoints() na dole, utwórz nową instancję ParticleEmitter. Upewnij się, że nazwa instancji jest napisana dokładnie tak, jak pokazano.
local particle = Instance.new("ParticleEmitter")endParticleEmitters używają sekwencji kolorów do sterowania swoją właściwością Kolor. Stwórz nową ColorSequence i przekaż aktualny kolor elementu.
-- Zniszcz elementpointPart:Destroy()-- Tworzy cząsteczkilocal particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)Cząsteczka musi być przypisana do gracza, który ją dotknął. Utwórz zmienną, aby uzyskać model postaci gracza. Następnie przypisz cząsteczkę do głowy gracza.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")Użyj task.wait(), aby poczekać szybko przez sekundę, a następnie zniszcz cząsteczki.
local particle = Instance.new("ParticleEmitter")particle.Color = ColorSequence.new(currentColor)local playerCharacter = player.Characterparticle.Parent = playerCharacter:WaitForChild("Head")task.wait(1)particle:Destroy()Testuj grę i upewnij się, że cząsteczki na krótko podążają za graczem po dotknięciu każdego koloru.
Wskazówki dotyczące rozwiązywania problemów
Na tym etapie, jeśli cząsteczki nie działają tak, jak powinny, spróbuj jednego z poniższych rozwiązań.
- Upewnij się, że przy tworzeniu nowej instancji ParticleEmitter jest napisane dokładnie tak, jak pokazano i w cudzysłowie.
- Kiedy przypisujesz cząsteczki, upewnij się, że używasz : między playerCharacter i WaitForChild(), bez spacji między.
Pełny skrypt PointScript
Zakończoną wersję skryptu można znaleźć poniżej.
local pointPart = script.Parent
--local storage = game:GetService("ServerStorage")
-- Przyznaje pewne punkty
local blue = Color3.fromRGB(0, 0, 255)
-- Przyznaje więcej punktów
local green = Color3.fromRGB(0, 255, 0)
-- Utrata punktów dla graczy
local red = Color3.fromRGB(255, 0, 0)
-- przyznawane punkty graczom
local smallPoints = 10
local largePoints = 50
local losePoints = 100
local Players = game:GetService("Players")
local function givePoints(player)
local currentColor = pointPart.Color
local playerStats = player:WaitForChild("leaderstats")
local playerPoints = playerStats:WaitForChild("Points")
-- Przyznaje punkty graczowi w zależności od koloru elementu
if currentColor == blue then
playerPoints.Value += smallPoints
elseif currentColor == green then
playerPoints.Value += largePoints
else
playerPoints.Value -= losePoints
end
-- Zniszcz element, poczekaj chwilę, a następnie zniszcz cząsteczki
pointPart:Destroy()
-- Tworzy efekt cząsteczek i go niszczy
local playerCharacter = player.Character
local particle = Instance.new("ParticleEmitter")
particle.Color = ColorSequence.new(currentColor)
particle.Parent = playerCharacter:WaitForChild("Head")
task.wait(1)
particle:Destroy()
end
local function partTouched(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player then
givePoints(player)
end
end
pointPart.Touched:Connect(partTouched)
-- Zmienia kolor elementu na podstawie zmiennych. Musi być na końcu skryptu.
while true do
pointPart.Color = blue
task.wait(4)
pointPart.Color = green
task.wait(3)
pointPart.Color = red
task.wait(2)
end