- Terrain, Prefabs, Textures, Modelle (u. a. Lieferkarton-/Vibrations- Rohdaten in Assets/Data) - Third-Party-Pakete: TextMesh Pro, Toby Fredson Foliage Engine, Sat Productions Street Lights, ProBuilder Data - Neue Szene Boot.unity, Shop-Szenenordner - Package-Manifest/Lock, ProjectSettings, Build-Profile, .slnx - Doku: EDITOR_SETUP.md, INSTALL.md, TODO.md Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
12 KiB
Editor-Setup (Meilenstein 0)
Schritt-für-Schritt-Anleitung für die manuelle Editor-Arbeit aus
docs/ROADMAP.md, Meilenstein 0: Szenen, Prefabs, NetworkManager.
Referenz für Inspector-Feldnamen: Unity zeigt _camelCase-Felder ohne
Unterstrich und mit Leerzeichen an (_catalog → Catalog,
_customerMask → Customer Mask).
0. Ordner anlegen
Im Project-Fenster unter Assets/:
Assets/ScenesAssets/PrefabsAssets/Data(falls noch nicht vorhanden)
Rechtsklick auf Assets → Create > Folder, jeweils benennen.
1. Platzhalter-Produktkatalog
Die Prefabs unten haben alle ein Catalog-Feld, das nicht leer sein darf
(sonst NullReferenceException zur Laufzeit). Vollständige Produkte kommen
später — jetzt nur ein leeres Katalog-Asset, damit referenziert werden kann:
- Rechtsklick auf
Assets/Data→Create > AfterHours > Product Catalog - Benennen:
ProductCatalog
Später Produkte anlegen (Create > AfterHours > Product) und in die
Products-Liste dieses Assets ziehen.
2. Layer "Customer" anlegen
Wird von CustomerAgent gebraucht (Personal-Space-Check per OverlapSphere).
Edit > Project Settings > Tags and Layers- Unter „Layers" eine freie User-Layer-Zeile (z. B. 6) mit
Customerbeschriften
3. Player-Prefab
GameObject > Create Empty, benennenPlayer- Component:
Character Controller(wird vonPlayerAvatarperRequireComponentverlangt) - Component:
Network Object - Component:
PlayerAvatar(ausAfterHours.Networking) - Component:
PlayerInteractor(ausAfterHours.Interaction) - Component:
PlayerHands(ausAfterHours.Networking) - Component:
Network Transform— repliziert Position an andere Clients (für Solo-Host-Test egal, aber für Meilenstein 2 nötig) - Kind-Objekt für die Kamera: Rechtsklick auf
Player→ Kamera erstellen, benennenCameraRoot, auf Kopfhöhe positionieren (z. B. Y = 1,6)CameraRootin beiden Feldern eintragen:PlayerAvatar.Camera RootundPlayerInteractor.Eyes
- Werte grob:
Walk Speed3.4,Mouse Sensitivity2,Reach2.5 (Defaults reichen) Interactable Maskauf „Everything" lassen- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
4. Customer-Prefab
GameObject > Create Empty, benennenCustomer- Layer des Objekts auf
Customersetzen - Component:
Nav Mesh Agent - Component:
Capsule Collider(Radius ~0.3, Height ~1.8) — ohne Collider erkennen sich Kunden nicht gegenseitig - Component:
Network Object - Component:
Network Transform(Server bewegt den Agent, muss an Clients repliziert werden) - Component:
CustomerAgent(ausAfterHours.Customers) Catalog→ProductCatalog-AssetCustomer Mask→ LayerCustomer- Optional: Platzhalter-Body (Capsule-Mesh als Kind), rein kosmetisch
- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
5. ShelfSlot-Prefab
GameObject > Create Empty, benennenShelfSlot- Component:
Box Collider(z. B. 0.5 × 0.8 × 0.4) — für den Blick-Raycast vonPlayerInteractor - Component:
Network Object - Component:
ShelfSlot(ausAfterHours.Shop) Catalog→ProductCatalog-AssetCapacity UnitsDefault (12) lassenExposed To Streetnur bei vom Schaufenster sichtbaren Regalen anhaken (pro platzierter Instanz individuell)Display Rootoptional (aktuell nur// TODOim Code)- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
6. CashRegister-Prefab
GameObject > Create Empty, benennenCashRegister- Component:
Box Collider - Component:
Network Object - Component:
CashRegister(ausAfterHours.Shop) - Kind-Objekt
QueueStart(leeres Transform), vor der Kasse positioniert,Forward-Achse zeigt in Richtung der Warteschlange Catalog→ Asset,Queue Start→ dasQueueStart-Kind,Queue SpacingDefault (0.8)- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
7. StorageCrate-Prefab
GameObject > Create Empty, benennenStorageCrate- Component:
Box Collider - Component:
Network Object - Component:
StorageCrate(ausAfterHours.Shop) Catalog→ Asset,Product Id→ -1 bis ein echtes Produkt existiert (dann die ID eintragen),Starting QuantityDefault (200)- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
Pro Produkt später vermutlich mehrere StorageCrate-Instanzen im Backroom —
das Prefab ist die Vorlage, Product Id pro Instanz individuell setzen.
7b. OrderTerminal-Prefab
Bestellt beim Großhandel nach — fixes Produkt/Menge pro Instanz, kein UI-Menü.
GameObject > Create Empty, benennenOrderTerminal- Component:
Box Collider - Component:
Network Object - Component:
OrderTerminal(ausAfterHours.Shop) Catalog→ Asset,Product Id→ ID eines existierenden Produkts,Order QuantityDefault (50)- Als Prefab nach
Assets/Prefabsziehen, Szenen-Objekt löschen
8. Boot-Szene
File > New Scene(Basic/URP-Template),File > Save As→Assets/Scenes/Boot.unityGameObject > Create Empty, benennenNetworkManager- Component:
Network Manager - Component:
Unity Transport— imNetwork Manager-Inspector unter „Network Transport" zuweisen Player Prefab→Player-Prefab aus Schritt 3 zuweisenCustomer-Prefab registrieren (siehe Kasten unten) —ShelfSlot,CashRegister,StorageCratenicht hier eintragen, die kommen als Szenen-Objekte direkt in die Shop-SzeneDon't Destroy On Loadangehakt lassen (Default) — muss den Szenenwechsel zuShopüberleben- Component:
NetworkBootstrap(ausAfterHours.Networking),Game Scene Name→Shop - Canvas + Buttons für Host/Join (siehe unten)
Customer im Network Prefabs registrieren
Das Network Prefabs-Feld im NetworkManager selbst nimmt nur Assets vom Typ
Network Prefabs List auf (z. B. DefaultNetworkPrefabs), keine einzelnen
Prefabs — deshalb taucht Customer dort nicht in einer Auswahl auf.
- Im Project-Fenster die Datei
DefaultNetworkPrefabssuchen (liegt meist direkt unterAssets/, wird vom NetworkManager automatisch angelegt) - Einmal draufklicken — der Inspector zeigt jetzt den Inhalt dieses Assets
- Dort gibt es eine eigene Liste „Network Prefabs" mit einem
+-Button +klicken → neuer Eintrag mit leerem Prefab-FeldCustomer-Prefab ausAssets/Prefabsin dieses Feld ziehen
Falls kein DefaultNetworkPrefabs-Asset existiert: Rechtsklick im
Project-Fenster → Create > Netcode > Network Prefabs List (Menüpfad kann
leicht abweichen), benennen, dann ins NetworkManager-Feld „Network Prefabs" ziehen.
Prüfen falls es trotzdem nicht klappt: hat das Customer-Prefab wirklich
eine Network Object-Component? (Prefab öffnen, Inspector prüfen.)
Canvas mit Host/Join-Buttons
GameObject > UI > Canvas(legt automatisch einEventSystem-Objekt mit an — nicht löschen)- Canvas auswählen,
GameObject > UI > Button(ggf. Popup „Import TMP Essentials" bestätigen) - Umbenennen zu
HostButton, im linken Bereich des Canvas positionieren - Beschriftung: Kind-Objekt
Text (TMP)anklicken, Text-Feld auf „Host" ändern - Schritte 2–4 wiederholen für
JoinButtonmit Text „Join" HostButtonauswählen → Inspector →Button (Script)→ Bereich „On Click ()"+klicken → neuer Listeneintrag mit leerem Objektfeld- Das GameObject mit der
NetworkBootstrap-Component reinziehen (dasNetworkManager-Objekt aus Schritt 8.2) - Dropdown „No Function" →
NetworkBootstrap→HostGame ()auswählen - Gleiches für
JoinButton, aberJoinGame ()
9. Shop-Szene
File > New Scene,File > Save As→Assets/Scenes/Shop.unity- Grobes Blockout bauen (siehe unten)
Floorauswählen →Add Component→Nav Mesh Surfacehinzufügen (Component auscom.unity.ai.navigation— ersetzt das alte, deprecatedStatic > Navigation Static-Flag)- Defaults meist ok (Agent Type: Humanoid, Collect Objects: All, Include Layers: Everything) — Wände blockieren dank ihrer Collider automatisch. Ganz unten in der Component auf
Bakeklicken (ohne das läuft keinNavMeshAgent) - Zwei leere GameObjects:
EntryPoint,ExitPoint, in der Türlücke platziert GameObject > Create Empty→GameClock, ComponentsGameClock+Network ObjectGameObject > Create Empty→ShopEconomy, ComponentsShopEconomy+Network ObjectGameObject > Create Empty→CustomerSpawner, ComponentsCustomerSpawner+Network ObjectGameObject > Create Empty→SupplierService, ComponentsSupplierService(ausAfterHours.Economy) +Network Object.Catalog→ Asset,Delivery Lead HoursDefault (4) — bei Standard-GameClock-Tempo (60 reale Sekunden = 1 Spielstunde) entspricht das 4 realen Minuten bis zur Lieferung, zum Testen ggf. runterdrehenShelfSlot-,CashRegister-,StorageCrate- undOrderTerminal-Prefabs aus dem Project-Fenster in die Szene ziehen und platzieren (2–3 Regale reichen fürs Erste)CustomerSpawnerverkabeln:Customer Prefab→ Customer-Prefab,Entry Point/Exit Point→ die beiden Transforms,Register→ platzierte CashRegister-Instanz- Wichtig:
GameClock,ShopEconomy,CustomerSpawner,SupplierService,ShelfSlot-,CashRegister-,StorageCrate- undOrderTerminal-Instanzen sind direkt in der Szene platziert ("in-scene placed NetworkObjects") — NGO spawnt sie automatisch, wenn der Server die Szene lädt. Keine Registrierung in der Network Prefabs List nötig (anders als beimCustomer-Prefab).
Grobes Blockout
Boden:
GameObject > 3D Object > Plane, benennenFloor- Position
(0, 0, 0). Standardgröße 10×10 Units (Meter) reicht fürs Erste; Scale anpassen für andere Größe (z. B.1.5, 1, 1für 15×10m)
Wände:
GameObject > 3D Object > Cube, benennenWall_North- Transform: Position
(0, 1.5, 5), Scale(10, 3, 0.2) - 3× duplizieren (
Ctrl+D), neu positionieren:Wall_South: Position(0, 1.5, -5), Scale gleichWall_East: Position(5, 1.5, 0), Scale(0.2, 3, 10)Wall_West: Position(-5, 1.5, 0), Scale(0.2, 3, 10)
- Für einen Eingang: eine Wand (z. B.
Wall_South) durch zwei kürzere Cubes ersetzen (Scale(4, 3, 0.2)) mit ca. 2m Lücke dazwischen als Tür
Cube-/Plane-Primitives bekommen automatisch einen passenden Collider — nichts extra nötig.
Aufräumen (optional): GameObject > Create Empty → Blockout, Floor + alle Wall_* per Drag & Drop als Kinder reinziehen.
Wände brauchen keine eigene Nav Mesh Surface/Modifier-Component — sie blockieren das NavMesh automatisch über ihre Collider, solange sie im „Include Layers"-Bereich der Nav Mesh Surface auf Floor liegen (Default: Everything). Farbe/Material ist rein kosmetisch, kann später kommen.
10. Build Settings
File > Build Settings (bzw. Build Profiles in Unity 6) → „Add Open Scenes" für beide Szenen, Boot an Index 0.
11. Testen
Boot-Szene öffnen, Play drücken- „Host" klicken → sollte automatisch in die
Shop-Szene wechseln - Mit WASD/Maus bewegen
- Regal anschauen,
EamStorageCrate(Ware aufnehmen), dann amShelfSlot(einräumen) - Warten, bis ein Kunde spawnt: läuft er zum Regal, nimmt Ware, stellt sich an? An der Kasse
Ezum Scannen/Kassieren - Am
OrderTerminalEdrücken → Guthaben (ShopEconomy.Balance, aktuell nirgends im UI sichtbar, ggf. Inspector derShopEconomy-Instanz während Play beobachten) sollte sofort sinken. NachDelivery Lead HoursSpielstunden sollte die Menge in der passendenStorageCratesteigen
Bei Problemen: genauer Fehler bzw. Console-Meldung notieren, dann gezielt nachschauen.