15. Monster och spawner
Målet
Lägg till två CC0-monster: 3D Horror Game Monster och Spider av br-n518. Du behöver inte kunna animera för att börja: läs först hur en fiende får hälsa, position och rörelse. GLB-filerna läses in med GLTFLoader. Båda har tre träffpoäng. Spindeln tar sats nära spelaren och gör ett kodstyrt hopp. Öppna main.js och level.js.
Ett monster är både modell och speldata
anchor är gruppen i 3D-scenen. Objektet monster innehåller speldata: art, hälsa, om den är död, attacktimer, hopptimer och nästa vägpunkt. Modellen kan laddas klart senare, men monsterposten finns redan. Det är därför rörelse- och skaderegler inte ska bero på modellens filformat.
const monster = {
anchor,
kind: 'horror',
health: RULES.monsterHealth,
dead: false,
waypoint: null
};
Det här är en förkortad illustration. Den riktiga posten har fler timers. När health når noll sätts dead = true innan modellen tas bort efter en kort fördröjning, så att ett andra skott inte räknar samma fiende igen.
spawnMonster() väljer bara en spawnpunkt som är minst sex meter från spelaren. Max fyra monster är samtidigt aktiva. Nya försök sker var sjätte sekund. nextPathStep() söker en väg genom ett rutnät så monster tar sig runt väggarna i stället för att gå rakt igenom dem. Först väljs spawnpunkt, därefter art, sedan läses modellen in. Se kapitel 16 för vägvalet steg för steg.
if (distanceToPlayer >= RULES.minimumSpawnDistance && monstersAlive < RULES.maxMonsters) {
spawnMonster();
}
Skottet testar siktlinjen mot väggar och dörrar före monstret. En vägg ska alltså kunna skydda både spelare och monster. När hälsan når noll räknas en kill och monstret tas bort.
Testa
- Starta om spelet flera gånger: inget monster ska stå direkt intill startplatsen.
- Håll en vägg mellan dig och monstret: skottet ska inte träffa genom väggen.
- Låt spindeln komma nära: den ska hoppa mot dig, inte teleportera.
- Träffa varje monster tre gånger och kontrollera kill-räknaren.
Modellerna är CC0 enligt respektive OpenGameArt-sida. Horror Game Monsters FBX-konverterade skelett får fel skala i Three.js. Webbversionen använder därför originalmodellens synliga mesh och animerar armar, ben och kropp i kod när monstret går. Modellen vänds mot sin färdriktning; den har en annan framåtriktning än spindeln. Spindelns GLB-animationer används direkt. De tidigare kuberna och övningsmålet finns kvar i Godot-kursens tidiga kapitel men ingår inte i den färdiga flyktbanan.
Gör själv
Ändra RULES.minimumSpawnDistance i din kopia från 6 till 9. Starta om flera gånger och notera om antalet möjliga spawnpunkter minskar. Återställ värdet. Höj inte antalet monster samtidigt: en ändring i taget gör det möjligt att förstå effekten.