Entwicklung / ROBLOX
Roblox ProximityPrompt: Übungsstation mit E, Gamepad und Touch
Baue eine separate verankerte Lampe mit Attachment und ProximityPrompt. Klare Beschriftung, Sichtbarkeit, ausdrückliche Serverprüfungen und ein offener Geräteprüfplan.
Eine Station und eine verständliche Handlung #
Stell dir einen eigenen Prototyp vor: Ein Spieler geht zu einer kleinen Lampe und schaltet ihr Licht um. Statt eine unsichtbare Taste zu suchen, sieht er Objekt, Handlung und einen passenden Eingabehinweis. Wir verwenden einen normalen ProximityPrompt und einen gewöhnlichen Server-Script. Belohnungen, Währung und Käufe gehören nicht zum Beispiel.
Das ist eine unabhängige Übung, keine Änderung an Paws and Finds, Cloud Nests oder anderen Spielen des Autors. Der eigene Code unten setzt die beschriebene Struktur voraus. Eine statische Prüfung bedeutet keinen Start in Studio. Speichere ein separates Übungsprojekt, übernimm die Namen genau und lege das Ergebnis fest: gemeinsames Licht und Stationsfarbe ändern sich, kein persönliches Inventar.
1. Erstelle die genaue Explorer-Struktur #
Erstelle in Workspace einen Part namens PracticeStation. Darin liegen ein Attachment namens PromptAnchor und ein PointLight namens PracticeLight. In PromptAnchor kommt ein ProximityPrompt namens SwitchPrompt. Es sind zwei Zweige: Licht unter dem Part, Hinweis unter dem Attachment. Lege den Prompt nicht versehentlich neben das Attachment.
Erstelle in ServerScriptService einen gewöhnlichen Script namens PracticeStationServer, aktiviere ihn und setze RunContext auf Server. Ein LocalScript ersetzt ihn nicht. Die Objektnamen müssen exakt passen. WaitForChild wartet auf den Namen, erzeugt aber kein fehlendes Objekt. Vergleiche bei Warteproblemen zuerst Explorer und Schaubild. Ein SwitchPrompt im falschen Zweig ist kein Problem der Aktivierungsdistanz; Änderungen an der Reichweite helfen dabei nicht.
2. Verankere die Lampe und setze den Hinweisort #
Für diese Übung erhält PracticeStation Anchored=true, Size=(4,2,4) und Position=(0,3,0). Das sind unsere Beispielwerte, keine Engine-Vorgaben. Setze einen SpawnLocation daneben und außerhalb des Parts, damit die Figur herangehen kann. PromptAnchor.Position=(0,2,0) ist ein lokaler Versatz zur Station, keine unabhängige Weltkoordinate.
Bei PracticeLight kannst du mit Brightness=2 und Range=12 beginnen. Der Script startet mit ausgeschaltetem Licht. Für diese Prüfung braucht es weder komplexe Modelle noch bewegliche Verbindungen oder ein vorhandenes Belohnungssystem. Die verankerte Station bietet einen festen Bezugspunkt; der Server misst später zu anchor.WorldPosition. Wenn du das Attachment versetzt, ändert sich der Interaktionspunkt. Prüfe dann die Grenze erneut statt von der alten Darstellung auszugehen.
3. Beschrifte Objekt und Handlung in deiner Sprache #
ObjectText beantwortet „Was ist das?“, ActionText „Was tue ich?“. Im deutschen Beispiel heißen sie „Übungslampe“ und „Licht umschalten“. Der Code enthält Paare für ru/en/de/es/zh/ar. Wähle die Sprache der Übung mit UI_LANGUAGE, zum Beispiel "de". Die Explorer-Namen PracticeStation und SwitchPrompt werden dabei nicht übersetzt.
Damit wird eine Sprache für den gesamten Testserver festgelegt, nicht automatisch die Sprache jedes Spielers. AutoLocalize=false lässt die gewählten Texte ohne automatische Ersetzung stehen. Für ein mehrsprachiges veröffentlichtes Spiel braucht es eine eigene Lokalisierung und Prüfungen langer Texte. Schreibe nicht E in ActionText, sondern beschreibe die Handlung: Den aktuellen Eingabehinweis liefert die Standardoberfläche passend zur Steuerung. Das Wörterbuch ist eine Übungskonfiguration.
4. Unterscheide Tastatur, Gamepad und Bildschirm #
Das Beispiel setzt KeyboardKeyCode=E, GamepadKeyCode=ButtonX und ClickablePrompt=true. Versprich nicht jedem Spieler den Buchstaben E: Die aktive Eingabeart beeinflusst den Standardhinweis. Auf Telefon oder Tablet ist die Bildschirmbedienung verfügbar; sogar ClickablePrompt=false verbietet mobiles Tippen nicht. Diese Eigenschaft schaltet Touch-Zugriff nicht allgemein ab.
HoldDuration=0.3 verlangt in der normalen Oberfläche kurzes Halten; bei 0 wäre die Auslösung sofort. Wir wählen 0.3 für die Übung, nicht als gemessenes Optimum. Probiere kurzes und vollständiges Halten sowie Loslassen. Der Beginn des Haltens ist keine Erlaubnis für das Ergebnis. Unser Server verwendet das abgeschlossene Interaktionsereignis Triggered und nicht ein Ereignis für den Beginn des Haltens.
5. Sichtbarkeit und Handlungserlaubnis sind verschieden #
MaxActivationDistance=10 bestimmt die Reichweite, in der der Hinweis erscheint. RequiresLineOfSight=true betrachtet den freien Weg von der Kamera zum Objekt. Das ist eine andere Messung als von HumanoidRootPart zum Attachment. Eine Wand oder Kameraposition kann den Hinweis auch nahe der Station verbergen. Prüfe jeweils eine Ursache: zuerst Abstand, dann Sicht.
Ein unsichtbarer Hinweis ersetzt keine Serverberechtigung. Oberflächeneigenschaften können auf dem Client verändert werden. Das Beispiel prüft eine lebende Figur, Abstand und die vorgesehene Station, verbietet aber nicht serverseitig die Interaktion durch eine Wand. Ist eine Wand für deine Mechanik wichtig, braucht es eine zusätzliche Hindernisprüfung nach deinen Regeln. RequiresLineOfSight ist kein fertiger Schutz für Türen oder Käufe.
| Einstellung | Beispielwert | Prüfung |
|---|---|---|
| ActionText / ObjectText | Licht umschalten / Übungslampe | Handlung und Objekt benannt; UI_LANGUAGE="de" |
| KeyboardKeyCode / GamepadKeyCode | E / ButtonX | Hinweis passend zur aktuellen Eingabe |
| ClickablePrompt | true | Klick und Touch; false verbietet mobiles Tippen nicht |
| HoldDuration | 0.3 Sekunden | Kurzes/vollständiges Halten und Abbruch |
| MaxActivationDistance | 10 | Anzeigengrenze und gesonderter Serverabstand |
| RequiresLineOfSight | true | Kamerasicht, keine Serverberechtigung |
| COOLDOWN | 0.5 Sekunden, gemeinsam | Zu schnelle Wiederholung schaltet nicht um |
6. Verbinde genau einen Server-Handler #
Füge das eigene Beispiel unten in PracticeStationServer ein. Zuerst findet es vier Objekte, prüft Klassen, wählt Beschriftungen und setzt die Eigenschaften. Danach initialisiert es die ausgeschaltete Lampe. Starte nicht gleichzeitig einen zweiten gleichen Script: Zwei Handler können zweimal umschalten und dadurch wie ein fehlendes Ergebnis wirken.
Triggered übergibt den Spieler der abgeschlossenen Interaktion. Der Server sucht dessen Figur und prüft Bedingungen vor der Lichtänderung. Zwischen Intervallprüfung und Zustandsänderung gibt es kein Warten. Wir fügen weder RemoteEvent noch Preisanfrage oder Speicherung hinzu; die Handlung ist das Umschalten der gemeinsamen Lampe. Wenn Ausführungsort und Objekttyp unklar sind, lies zuerst unseren Leitfaden zu Script, LocalScript und ModuleScript statt das Beispiel sofort auszubauen.
local Players = game:GetService("Players")
local station = workspace:WaitForChild("PracticeStation")
assert(station:IsA("BasePart") and station.Anchored, "Anchor PracticeStation")
local anchor = station:WaitForChild("PromptAnchor")
assert(anchor:IsA("Attachment"), "PromptAnchor must be an Attachment")
local prompt = anchor:WaitForChild("SwitchPrompt")
assert(prompt:IsA("ProximityPrompt"), "SwitchPrompt must be a ProximityPrompt")
local light = station:WaitForChild("PracticeLight")
assert(light:IsA("PointLight"), "PracticeLight must be a PointLight")
local UI_LANGUAGE = "en" -- Choose one language for this whole test server.
local labels = {
ru = {action = "Переключить свет", object = "Учебная лампа"},
en = {action = "Switch light", object = "Practice lamp"},
de = {action = "Licht umschalten", object = "Übungslampe"},
es = {action = "Cambiar la luz", object = "Lámpara de práctica"},
zh = {action = "切换灯光", object = "练习灯"},
ar = {action = "تبديل الضوء", object = "مصباح التدريب"},
}
local words = assert(labels[UI_LANGUAGE], "Unknown UI_LANGUAGE")
local MAX_DISTANCE = 10
local COOLDOWN = 0.5
prompt.Style = Enum.ProximityPromptStyle.Default
prompt.AutoLocalize = false
prompt.ActionText = words.action
prompt.ObjectText = words.object
prompt.KeyboardKeyCode = Enum.KeyCode.E
prompt.GamepadKeyCode = Enum.KeyCode.ButtonX
prompt.ClickablePrompt = true
prompt.HoldDuration = 0.3
prompt.MaxActivationDistance = MAX_DISTANCE
prompt.RequiresLineOfSight = true
prompt.Enabled = true
local isOn = false
local lastToggle = -COOLDOWN
light.Enabled = false
station.Color = Color3.fromRGB(70, 80, 95)
station:SetAttribute("PracticeLightOn", false)
prompt.Triggered:Connect(function(player)
if player.Parent ~= Players or not prompt.Enabled then return end
if not station:IsDescendantOf(workspace) or not station.Anchored then return end
local character = player.Character
if not character or not character:IsDescendantOf(workspace) then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
local root = character:FindFirstChild("HumanoidRootPart")
if not humanoid or humanoid.Health <= 0 then return end
if not root or not root:IsA("BasePart") then return end
local distance = (root.Position - anchor.WorldPosition).Magnitude
if distance ~= distance or distance > MAX_DISTANCE then return end
local now = os.clock()
if now - lastToggle < COOLDOWN then return end
lastToggle = now
isOn = not isOn
light.Enabled = isOn
station.Color = isOn and Color3.fromRGB(255, 190, 80) or Color3.fromRGB(70, 80, 95)
station:SetAttribute("PracticeLightOn", isOn)
end)7. Lies die Prüfungen vor dem Umschalten #
Der Handler verlangt einen Spieler in Players, einen aktiven Prompt und eine verankerte Station in Workspace. Dann braucht er eine Figur in der Welt, einen Humanoid mit Health>0 und einen HumanoidRootPart der Klasse BasePart. Der Server berechnet den Abstand zu PromptAnchor.WorldPosition und vergleicht ihn mit denselben zehn Übungseinheiten. Ungeeignete oder fehlende Zustände ändern das Licht nicht.
Die Dokumentation nennt ausdrücklich eine eigene Server-Abstandsprüfung für Triggered; andere Prompt-Ereignisse besitzen sie nicht. Unsere zusätzliche Prüfung formuliert dennoch die Regel des Prototyps. HoldDuration beweist kein ehrliches Halten auf dem Client. Vollständiger Schutz für beliebige Spiele entsteht dadurch nicht: Weitere Rechte, Hindernisse und Ressourcen richten sich nach der jeweiligen Aufgabe.
8. Verstehe gemeinsamen Zustand und kurze Pause #
isOn ist ein Stationszustand dieses Servers. Eine angenommene Handlung ändert PointLight.Enabled, die Part-Farbe und das Attribut PracticeLightOn. Ein anderer Client, für den die Station verfügbar ist, sollte denselben gemeinsamen Zustand beobachten. Das ist keine persönliche Lichtschaltung für jeden Spieler. Ein anderer Server oder neuer Start beginnt ausgeschaltet, weil keine Speicherung vorgesehen ist.
COOLDOWN=0.5 ist die gemeinsame Stationspause unseres Beispiels. Eine zu schnelle Folgeanfrage schaltet nicht um. Sie unterscheidet sich von der Haltedauer und verspricht keine universelle Lastbegrenzung. Lass bei zwei Clients Abstand zwischen den Handlungen: A schaltet ein, B beobachtet, B schaltet um, A beobachtet. Die angenommene Handlung von B ist kein Beweis für einen Fehler bei A.
9. Wann ProximityPromptService sinnvoll ist #
Für eine Station genügt prompt.Triggered. ProximityPromptService kann unterschiedliche Prompts zentral beobachten; PromptTriggered erhält zuerst den Prompt und danach den Spieler. Bestimme beim Ausbau zunächst zulässige Stationen, statt dieselbe Operation für jeden gefundenen Prompt in der Welt auszuführen.
Verbinde nicht grundlos Instanz- und globalen Handler mit derselben Lampe: Eine Handlung könnte doppelt verarbeitet werden. Sichtbar- und Versteckt-Ereignisse gehören zur Clientdarstellung, besonders bei eigenem UI. Style=Default bietet hier bereits die Standardoberfläche; ein zusätzlicher zeichnender LocalScript ist unnötig. Untersuche eigene Gestaltung erst nach einer funktionierenden Struktur und verständlichen Serveroperation. Zentrale Organisation ist hilfreich, entfernt aber nicht die Prüfpflicht der jeweiligen Handlung.
10. Suche eine konkrete Ursache fehlender Anzeige #
Fehlt der Hinweis, prüfe Struktur, Enabled, Abstand, Style und Kamera. In einer dichten Szene können Hinweise nach Exclusivity konkurrieren; unser erster Test enthält absichtlich nur eine Station. Ändere nicht alle Eigenschaften zusammen. Gehe bei freier Sicht näher heran, ändere eine Einstellung und notiere das Ergebnis.
Ist der Prompt sichtbar, das Licht ändert sich aber nicht, prüfe Server-Output, Script-Klasse, RunContext, genaue Namen und die Pause. Ändert sich die Farbe ohne sichtbare Beleuchtung, untersuche PointLight, Range, Brightness und die Szene getrennt. Ablehnungen verwenden ein stilles return ohne Grundmeldung; vergleiche Figur und Station mit den Codebedingungen. Das Serverattribut trennt logischen Zustand und subjektiven Helligkeitseindruck. In der Szenariotabelle bleiben Ergebnisfelder bis zu deiner tatsächlichen Prüfung leer; Erwartungen sind noch keine Beobachtungen.
| Szenario | Erwartung im Beispiel | Gerät / Version / Ergebnis |
|---|---|---|
| Lebende Figur nahe, Eingabe vollständig | Licht, Farbe und Attribut ändern sich einmal | — |
| Kurzes Halten und Loslassen | Normalerweise keine abgeschlossene UI-Handlung | — |
| Ferne/tote Figur oder deaktivierter Prompt | Handler lässt den Zustand gleich | — |
| Wiederholung vor Ablauf der Pause | Kein weiteres Umschalten | — |
| Zwei Clients, Handlungen nach Pause | Beide sehen die gemeinsame Station | — |
| Telefon/Gamepad und gewählte Sprache | Passender Eingabehinweis, lesbare Texte | — |
11. Trenne Textprüfung und Engine-Test #
Geprüft sind Artikelstruktur und API-Angaben anhand offizieller Quellen. Das Beispiel bestand die Prüfung durch den Luau-Compiler und 13 isolierte Handlerprüfungen mit Ersatzobjekten. Der Code lief nicht in Roblox Studio und wurde nicht auf echtem Telefon oder Gamepad getestet. Starte im separaten Übungsprojekt zuerst mit einer Figur; prüfe dann Abstand, abgebrochenes Halten, abgeschalteten Prompt und schnelle Wiederholungen.
Verwende Test/F5 mit einer Figur; Run/F8 ohne Figur ersetzt diesen Interaktionstest nicht. Für zwei Clients wähle Server & Clients und beende mit End Session. Prüfe anschließend die benötigten Geräte und speichere Version und Beobachtungen. Emulation hilft beim Layout, ersetzt aber keine echten Eingabe- und Leistungstests. Eine Übertragung auf Haustiervergabe oder Käufe wäre ein anderes System mit Rechten, zusammenhängender Vergabe und eigenen Prüfungen. Erreiche zuerst ein verständliches Ergebnis an einer einfachen Übungslampe. Dieser konkrete kleine Aufbau lässt sich leichter einem anderen Entwickler erklären.
Originalquellen
Roblox Creator Hub — Proximity promptsProximityPrompt
ProximityPromptService
Securing the client-server boundary
Studio testing modes