• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Unity 3D problem Error

0 głosów
305 wizyt
pytanie zadane 5 lutego 2020 w C# przez Bart3on Użytkownik (620 p.)

Witam chce stowrzyć strzelającego przeciwnika w Unity ale wyskakuje mi taki bład jak to rozwiązać ?

NullReferenceException: Object reference not set to an instance of an object
Enemy.Enemy_Bullet.Awake () (at Assets/Enemy_Bullet.cs:18)

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

namespace Enemy
{
    public class Enemy_Bullet : MonoBehaviour
    {
        public float timebtwBullets = 0.15f;
        public GameObject projectile;
        float nextBullet;
        Enemy_Controller EC;
       
        bool RamboMode;
        void Awake()
        {
            nextBullet = 0f;
           RamboMode= EC.detected;
        }


        void Update()
        {
            Enemy_Controller myEnemy = transform.root.GetComponent<Enemy_Controller>();
            if (RamboMode)
            {
                nextBullet = Time.time + timebtwBullets;
                Vector3 rot;
                if (myEnemy.GetFacing() == -1f)
                {

                    rot = new Vector3(0, -90, 0);
                }
                else
                    rot = new Vector3(0, 90, 0);
                Instantiate(projectile, transform.position, Quaternion.Euler(rot));
            }
        }
    }
}



2 kod z definicją do detected

namespace Enemy
{
    public class Enemy_Controller : MonoBehaviour
    {
        public GameObject flipModel;
        public GameObject FollowPlayer;
        public float runSpeed = 5f;
        public bool Playerdetected;
        public bool Facingright = true;
        public bool detected;
        public float detectionTime;
        float startRun;
        public bool attackPlayer;
        public Transform detectedPlayer;
        float moveSpeed;
        public float walkSpeed;
        public float attackdistance = 2f;
        Rigidbody myRB;
        Animator EnemyAnim;
        public bool Attack;
        bool run;
        public bool inRange;
        bool death;
       



 void Start()
        {
           
            myRB = GetComponent<Rigidbody>();
            EnemyAnim = GetComponent<Animator>();
            Facingright = true;
            moveSpeed = walkSpeed;
            if (Random.Range(0, 10) > 2) Flip();


        }

        void Update()
        {

            //Animator Bools definition
            if (Attack == false)
                EnemyAnim.SetBool("attack", false);

            if (Attack == true)
                EnemyAnim.SetBool("attack", true);

            if (run == false)
                EnemyAnim.SetBool("run", false);
            if (run == true)
                EnemyAnim.SetBool("run", true);

            if (inRange == false)
                EnemyAnim.SetBool("inRange", false);
            if (inRange == true)
                EnemyAnim.SetBool("inRange", true);
        }

        void FixedUpdate()
        {

             if (detected)
            {
                if (detectedPlayer.position.x < transform.position.x && Facingright) Flip();
                else
                    if (detectedPlayer.position.x > transform.position.x && !Facingright) Flip();
                {
                    if (detected && Facingright) myRB.velocity = new Vector3(moveSpeed, myRB.velocity.y, 0);
                    if (detected && !Facingright) myRB.velocity = new Vector3(moveSpeed * -1, myRB.velocity.y, 0);
                    if (detected)
                    {

                        startRun = Time.time + detectionTime;
                    }

                }
                // FollowTarget();
                if (!detected)
                    return;
                if (detected == true)
                {
                    if (Vector3.Distance(transform.position, detectedPlayer.position) > attackdistance)
                    {

                        moveSpeed = walkSpeed;
                        Attack = false;
                        run = true;
                        attackPlayer = false;

                        if (detected && Facingright) myRB.velocity = new Vector3(moveSpeed, myRB.velocity.y, 0);
                        if (detected && !Facingright) myRB.velocity = new Vector3(moveSpeed * -1, myRB.velocity.y, 0);

                    }
                    else if (Vector3.Distance(transform.position, detectedPlayer.position) <= attackdistance)
                    {
                        myRB.velocity = Vector3.zero;
                        moveSpeed = 0;
                        attackPlayer = true;
                        Attack = true;
                        run = false;



                    }
                }




            }
        }



        void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Player")
            {

                inRange = true;
                detected = true;
                detectedPlayer = other.transform;
                if (detectedPlayer.position.x < transform.position.x && Facingright) Flip();
                else
                   if (detectedPlayer.position.x > transform.position.x && !Facingright) Flip();
            }

        }
        void OnTriggerExit(Collider other)
        {
            if (other.tag == "Player")
            {
                detected = false;
                run = false;
                inRange = false;

            }
        }
        void Flip()
        {
            Facingright = !Facingright;
            Vector3 theScale = flipModel.transform.localScale;
            theScale.z *= -1;
            flipModel.transform.localScale = theScale;

        }
       

        public float GetFacing()
        {
            if (Facingright) return 1;
            else return -1;
        }

 

2 odpowiedzi

0 głosów
odpowiedź 6 lutego 2020 przez Bondrusiek Maniak (61,440 p.)

Prawdopodobnie źle jest ustawiona zmienna EC(tzn nie jest ustawiony dlatego wyskakuje ten wyjątek NullReferenceException ). Masz nawet opisany ten błąd:

Object reference not set to an instance of an object
Enemy.Enemy_Bullet.Awake () (at Assets/Enemy_Bullet.cs:18)

Odwołanie do obiektu nie jest ustawione na instancję obiektu
Enemy.Enemy_Bullet.Awake () (at Assets / Enemy_Bullet.cs: 18)

 

 Musisz przypisać do EC komponent. Możesz to zrobić przeciągając ten komponent do Inspektora

[SerializeField] Enemy_Controller EC;

lub jeśli jeśli już jest w obiekcie z klasą Enemy_Bullet uzyskać referencje do tego komponentu:

        void Awake()
        {
            EC = GetComponent<Enemy_Controller>();
            nextBullet = 0f;
           RamboMode= EC.detected;
        }

 

0 głosów
odpowiedź 18 lutego 2020 przez bastekmisiek02 Nowicjusz (180 p.)

funkcja Awake() wykonuje się szybciej niż funkcja Update() przez co gdy chcesz działać ze zmienną EC jest jeszcze nullem. 

void Awake()
{
     Enemy_Controller myEnemy = transform.root.GetComponent<Enemy_Controller>();
     nextBullet= 0f;
     RamboMode=EC.detected;
}

Spróbuj tego i usuń całą 24 linijkę bo jest zbędna i obciąża procesor 

Podobne pytania

0 głosów
1 odpowiedź 538 wizyt
pytanie zadane 7 lipca 2020 w C# przez _JAKUB_ Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 204 wizyt
pytanie zadane 21 lutego 2020 w C# przez AlEksAndErr Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 232 wizyt
pytanie zadane 13 maja 2019 w C# przez cyrus33 Użytkownik (680 p.)

93,424 zapytań

142,421 odpowiedzi

322,643 komentarzy

62,782 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...