◉ VR-kurser
▶ Spela webbversionen

6. Miljö och kollisioner

Målet

Bygg en läsbar bana: inomhusdel med väggar och passager, två dörröppningar och en avgränsad utomhusdel. Golvet fortsätter utanför sista dörren så spelaren inte faller ur världen. Du behöver inte känna till Godot-banan. Öppna level.js.

Börja med en enda golvplatta

I labbscenen från kapitel 2 kan du lägga till en BoxGeometry(10, 0.16, 10) med mitten på Y = -0.08. Då blir ovansidan på Y = 0. Lägg en liten kub med mitten på Y = 0.5 så att den står på golvet. En BoxGeometry använder måtten bredd (X), höjd (Y), djup (Z). Pröva att ändra varje mått för sig; den här lilla övningen gör den större banan lättare att läsa.

const floor = new THREE.Mesh(
  new THREE.BoxGeometry(10, 0.16, 10),
  new THREE.MeshStandardMaterial({ color: 0x777d7b })
);
floor.position.y = -0.08;
scene.add(floor);

I det färdiga spelet använder buildLevel(scene) samma princip men fler boxar och texturer. Y är alltid höjd. X och Z beskriver kartan ovanifrån. En vägg med höjden 3,4 placeras med mitten på Y = 1,7 för att börja vid golvet.

buildLevel() skapar golv, väggar, trasigt tak, arbetsbänk, ljus, alien-glöd, träd, stenlagd väg och utgångsbåge. Varje addWall(...) skapar både en synlig mesh och en rektangel i obstacles. Det är viktigt: en vägg som bara syns men inte finns i hinderlistan går att passera, medan ett hinder utan mesh känns som en osynlig vägg. Samma hinderlista används av spelaren och monstrens vägval.

if (!blocked(rig.position.x + dx, rig.position.z, radius, obstacles, state.doors)) {
  rig.position.x += dx;
}

X och Z prövas var för sig. Det gör att spelaren glider längs väggar i stället för att fastna vid sneda rörelser. Stängda dörrar räknas som hinder; upplåsta dörrar slutar blockera öppningen. Se kapitel 7 för en långsammare genomgång av kollisionsmatematiken.

Bygg en bana som går att förstå

Rita gärna banan uppifrån på papper. Markera startpunkt, två hinkar, två dörrar och utgång. I början ska en vägg skymma monstret. Spelaren ska kunna hitta den första hinken utan att gå genom en låst dörr. Den andra hinken ska ligga efter första dörren, annars förlorar nyckelordningen sin mening.

Det färdiga spelet har även ytterväggar och ett andra golv under utomhusdelen. Den synliga "DAYLIGHT"-bågen är målet, men själva vinstvillkoret kontrolleras i spelkoden. En ljus miljö är alltså inte ensam tillräcklig för att avsluta omgången.

Övning

  1. Ändra längden på en av de avdelande väggarna i din kopia av buildLevel().
  2. Kontrollera att spelaren inte kan gå igenom väggen och att monster väljer en omväg.
  3. Kontrollera att första nyckeln fortfarande kan nås från startplatsen. Om inte: återställ väggen eller flytta öppningen.
  4. Följ utgången och kontrollera att det finns golv hela vägen. Skriv upp vilken box(...) som gör utomhusgolvet.

Återanvända CC0-texturer

De kommer från Poly Haven, CC0. Webbversionen packar med 1K-varianter, inte fullstora originalfiler.