Et FPS-spil, en first person shooter, er som udgangspunkt et skydespil, og derfor har vi brug for et våben! Her laver vi en pistol, men du kan bruge samme fremgangsmåde til at lave alle mulige andre våben.
Start med at lave et tomt objekt under GameManager, og kald det Weapons. Lav dernæst et tomt objekt med navnet WeaponVisuals under det objekt, som indeholder dit Camera - med det player script, som bliver brugt i de tidligere artikler i denne serie, vil det være FPSController -> FirstPersonCharacter:
I denne artikel vil der blive refereret til disse to objekter som Weapons-objektet og WeaponVisuals-objektet.
Brug af våben
Inden vi ser på hvordan vi laver et våben, så lad os først se på hvordan de bruges:
Som standard affyres det aktive våben med venstre museknap og våben lades ved at trykke R. Det er som udgangspunkt muligt at have 8 forskellige våben, og man skifter mellem dem ved at trykke på 1, 2, ..., 8.
Disse knapper kan alle ændres på GameManager ved at sætte hhv. Fire Key, Reload Key og Weapon Keys.
WeaponSpecification
Lav et tomt objekt under Weapons-objektet, kald det Pistol, og tilføj scriptet WeaponSpecification (i mappen Assets -> NighthawkFPSTemplates -> Weapons). Skal du bruge flere våben tilføjer du flere objekter på samme måde - ét objekt per våben.
De fleste indstillinger for dit våben finder du i WeaponSpecification-komponenten. Lad os i dette tilfælde sætte Name til Pistol
, og se på nogle af indstillingerne:
-
Ammo Type og Ammo Cost: Våben med samme Ammo Type deles om deres ammunition, men nogle våben kan koste mere (højere Ammo Cost) at affyre end andre.
Hvis du kun har ét våben med en bestemt Ammo Type bør du bare sætte dets Ammo Cost til
1
. - Automatic Fire: Hvis dette er slået til kan du holde skyde-knappen (venstre museknap) nede for at blive ved med at skyde, i stedet for at skulle trykke flere gange.
- Firing Delay: Tid i sekunder fra skyde-animationen begynder, til våbnet faktisk skyder.
- Firing Cooldown: Tid i sekunder fra våbnet har skudt (dvs. efter Firing Delay) og til våbnet er klar til at skyde igen.
- Enable Reloading: Hvorvidt våbnet skal lades, eller bare kan skyde løs indtil al ammunition er brugt.
- Auto Reload: Hvorvidt våbnet selv lader hvis der ikke er mere ammunition tilbage i magasinet, eller om man manuelt skal trykke R for at lade våbnet.
- Reload Time: Tid i sekunder, der skal gå fra man begynder at lade våbnet, til det nye magasin er klar (dvs. til våbnet kan skyde igen). Skifter man våben mens man er i gang med at lade sit våben, skal man lade forfra når man skifter tilbage igen til det våben, man var ved at lade.
- Clip Size: Antal skud i et magasin.
- Discard Unused In Clip: Hvorvidt ubrugt ammunition i nuværende magasin skal gemmes eller går tabt hvis man lader våbnet.
Shot Origin, Firing Specification samt felterne under Appearance vender vi tilbage til.
Træk nu Pistol-objektet ind på feltet element 0 under Weapons i GameManager. Træk det også ind på Selected At Startup i GameManager, for at vi ikke først skal trykke 1 for at få våbnet frem.
Lad os sige, at vi gerne vil have pistolen når spillet starter - vi skal ikke først finde den i banen. Derfor skal element 0 under Has Weapon i GameManager krydses af. Uden dette var der heller ingen grund til at trække våbnet ned i Selected At Startup.
WeaponFireSpecification
Nu er de fleste af våbnets indstillinger sat, men hvad skal der ske når man skyder? Dette bestemmer den WeaponFireSpecification, som er knyttet til våbnet.
Der er to slags WeaponFireSpecification i template-pakken, den ene hedder RayCastWeaponFireSpecification og den anden PhysicsBodyWeaponFireSpecification. Det er altså ikke selve scriptet WeaponFireSpecification du skal bruge.
Hvis du kan programmere, kan du lave din egen WeaponFireSpecification: Det er nemlig bare et en abstrakt klasse, som du kan nedarve fra, og så implementere metoden FireWeapon
.
Lav et tomt objekt kaldet FiringSpecifications under Weapons-objektet, og dernæst et objekt under FiringSpecifications-objektet kaldet PistolFire. Tilføj RayCastWeaponFireSpecification til PistolFire-objektet.
På Pistol-objektet (din WeaponSpecification) trækker du nu PistolFire-objektet ud på feltet Firing Specification.
Lav et nyt tomt objekt kaldet BallFire under FiringSpecifications-objektet, og tilføj scriptet PhysicsBodyWeaponFireSpecification. Lav en kugle (højreklik i scene-hierarkiet og vælg 3D Object -> Sphere) med navnet Projectile, og placér den under BallFire-objektet i scene-hierarkiet. Træk Projectile-scriptet ud på Projectile-objektet.
Projectile-objektet skal så trækkes ind på feltet Projectile på BallFire-objektet.
Kuglen (Projectile-objektet) er ret stor, så sæt scale til X = 0.2, Y = 0.2, Z = 0.2
. Slå Projectile-objektet fra; det skal ikke være aktivt i scenen,
men i stedet laves kopier af det hvis et våben med denne WeaponFireSpecification skyder.
Bemærk at PhysicsBodyWeaponFireSpecification kræver et ekstra objekt, der bruges som projektil. Du kan bruge hvad som helst som projektil, og du behøver ikke nødvendigvis bruge Projectile-scriptet.
Du har nu to forskellige WeaponFireSpecification-instanser, som du kan bruge - du kan dog kun vælge én per våben. Til gengæld kan du sagtens genbruge en WeaponFireSpecification på flere våben, f.eks. en pistol og en maskinpistol, hvor der så kun er forskel i deres WeaponSpecification-indstillinger.
Tilføj en 3D-model af våbnet
I first person-skydespil ses spillerens våben typisk nederst til højre på skærmen, og for at opnå det samme her, skal du først og fremmest bruge en 3D-model af dit våben.
Der findes masser af 3D-modeller på Unity's Asset Store, og her bruger jeg en pistol fra denne gratis pakke.
Lav et tomt objekt under WeaponVisuals-objektet, og kald det Pistol. Træk dernæst din 3D-model ud i scenen, så den ligger som et objekt under Pistol-objektet.
Du kan nu trække 3D-modellen i scenen over på Visual Representation i din WeaponSpecification
:
Næste skridt er at placere våbnet på skærmen.
Denne artikel er ikke skrevet færdig - mere er på vej...