NemProgrammering.dk logo

Turret del 4

3D spiludvikling med Unity » Turret del 4 # 18
Denne video kræver medlemskab
Læs mere!
Turret del 4
Inkluderet:
Livstidsadgang
40 videolektioner
7 timers undervisning
Stil spørgsmål
Kursusbevis

Information om denne video

Underviser: Christian 'Code' Skriver Kragegaard   Video: 11:26   Lektion nr. 18 af 40

I denne video gør vi sådan at spilleren kan spawne en turret ved at trykke på “E” og sørger for at det koster et bestemt antal ressourcer for at spawne den.

Spørgsmål og kommentarer

Kun medlemmer med adgang til dette kursus kan stille spørgsmål og kommentere. Bliv medlem her!

  • Nina H. siger:

    Hvorfor kommer Turret Prefab og FPS Camera ikke frem under min Weapon Controller? https://imgur.com/I8aTegO

    1. Christian ". siger:

      Hey Nina
      Min første tanke er om du har husket at gemme scriptet (en klassiker). Er begge variabler public?
      Ellers må du gerne smide billede af scriptet, det gør det hurtigt for mig at se :)
      Hilsen Code

      1. Nina H. siger:

        Jeg fandt en manglende parentes i scriptet ;-)

  • Aldin B. siger:

    Efter jeg tilføjer:
    if (ResourceControllerRef.AmountOfStone >= 50)
    og
    ResourceControllerRef.AddResource(-50, “stone”);

    så registrerer den at jeg mister 50 stone, men kan ikke fysisk se mit turret spawne. Før jeg tilføjede disse linjer af kode i scriptet kunne jeg godt se turret spawne fysisk. Hvad kan være galt? Har prøvet at restarte Unity, og den viser ingen fejl når jeg kører spillet eller i scriptet.

    1. Christian ". siger:

      Hej Aldin

      Prøv at fjerne dem igen og se om det virker og så prøv at tilføj igen.
      Er funktionen til at spawne også under “if (ResourceControllerRef.AmountOfStone >= 50)” ?
      Ellers kunne et screenshot af din kode (eller mere af scriptet) måske hjælpe mig :)

      1. Aldin B. siger:

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;

        public class WeaponsController : MonoBehaviour{

        public Animator AxeAnimator;
        public LayerMask TurretHitMask;
        public ResourceController ResourceControllerRef;

        public GameObject TurretPrefab;
        public Camera FPSCamera;

        private float _axeInterval = 0.3f;

        // Start is called before the first frame update
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {
        _axeInterval += Time.deltaTime;

        if (Input.GetKeyDown(KeyCode.E))
        {
        if (ResourceControllerRef.AmountOfStone >= 50)
        {
        ResourceControllerRef.AddResource(-50, “stone”);

        RaycastHit TerrainHit;

        if (Physics.Raycast(FPSCamera.transform.position, FPSCamera.transform.forward, out TerrainHit, 10, TurretHitMask))
        {
        GameObject SpawnedTurret = Instantiate(TurretPrefab) as GameObject;
        SpawnedTurret.transform.position = TerrainHit.point;
        SpawnedTurret.transform.forward = FPSCamera.transform.parent.transform.forward;
        }

        }

        }

        if(_axeInterval > 0.3f)

        if(Input.GetMouseButtonDown(0))
        {

        AxeAnimator.Play(“Axe_Swing”);
        _axeInterval = 0;

        RaycastHit hit;
        if(Physics.Raycast(transform.position, transform.forward, out hit, 10))
        {

        if (hit.transform.tag == “Resource”) {
        hit.transform.GetComponent().Hit();
        }
        }
        }

        }
        }

        1. Christian ". siger:

          Og du har samlet over 50 sten ind? Prøv at ændre “ResourceControllerRef.AmountOfStone >= 50” til “ResourceControllerRef.AmountOfStone >= 0” for at se om du kan spawne på dit terrain.

          Husk at dit terrain også skal passe med TurretHitMask så den også kan ramme terrain.

          1. Aldin B. siger:

            Har fundet problemet nu, havde glemt at vælge terrain layer på terrænet, ups! :D

            Men nu opstår det problem så i stedet, at grafikken forsvinder fra terrain og det bliver helt gråt.

            1. Aldin B. siger:

              Nevermind, skulle tilvælge terrain culling mask på FirstPersonCharacter igen, ved ikke lige hvorfor den slog sig selv fra igen? :D

          2. Aldin B. siger:

            Tak for hjælpen!

            1. Christian ". siger:

              Tjah, nogen gange kan man glemme ting, det sker for mig hele tiden :D

          3. Nina H. siger:

            Jeg har samme problem som Aldin, og jeg tror, det er fordi jeg ikke kan få point ved at ramme stenen (mine som du kalder det i videoen), så jeg kan ikke samle 50 ind. Hvor kan jeg have lavet en fejl henne?

            1. Christian ". siger:

              Hey Nina
              Får du en fejl i console?
              Hilsen Code

            2. Nina H. siger:

              Nej, der er tomt nede i Console

            3. Christian ". siger:

              Hej Nina
              Aldrin skriver ovenover at han manglede at vælge terrain layer på terrænet, er det samme problem ? :)

            4. Nina H. siger:

              Nej, jeg har også tjekket, at terrain layer er valgt på terrænet. Det er som om den ikke registrerer, når jeg rammer stenen. Teksten for oven tæller heller ikke…

            5. Christian ". siger:

              Hey Nina

              Kunne du smide et screenshot af koden som fyrer raycast af?

            6. Nina H. siger:

              Nu er jeg jo bare gået videre, selvom det drillede lidt, men mit script til WeaponsControlleren ser lige nu sådan her ud: https://imgur.com/a/jwjEqiB

            7. Christian ". siger:

              Hej Nina
              Prøv at skrive print(hit.name); på linje 17 og se hvad den siger når den rammer.
              Har du husket at sætte “Resource” tag på dine sten?

            8. Nina H. siger:

              Det vil den ikke have… Så melder den fejl. Hvad mener du, når du ovenover har skrevet til Aldin, at man skal huske, at terrain også skal passe med TurretHitMask, så den kan ramme terrain? Er det noget med dét, der kan være galt hos mig? I så fald, hvad skal jeg så gøre?

            9. Christian ". siger:

              Hej Nina
              Ja ude i inspectoren kan du se variablen “TurrethitMask”. Den vil vise alle de forskellige layers der findes i dit projekt.

              Her er det så meningen at Turret kun kan placeres på terræn og derfor skal der kun være vinget af i “terrain” i denne.

              Men når det handler om din sten, så skal den bare tjekke hvad end den rammer så derfor bruger vi slet ikke LayerMask når den raycaster (skyder en stråle ud) ud.

              Hvis din sten har et tag på som hedder “Resource” (husk stort R ;) ) så burde den ramme.

              Hvis den allerede har et “Resource” tag på, så kan det være at den rammer spilleren selv.

              Og du må undskylde, men jeg kom til at skrive linje 17. Jeg tror jeg må have kommet til at kigge et helt forkert sted, det var faktisk på linje 59 jeg mente :)

              Hvis print(hit.name); ikke dur, så prøv Debug.Log(hit.name); så vil den skrive i konsollen hvad det er den rammer. Hvis det er spilleren den rammer, så er problemet at den ikke ignorere spillerens layer :)