NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C# Unity null reference exception při použití GameObject

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
dez1nd
Člen
Avatar
dez1nd:20.9.2017 8:07

Ahoj, snad mi tu někdo pomůže, narazil jsem na problém u Unity.
třída dědí z monobehavior

        Transform bulletSpawn;
void Start()
{
        bulletSpawn = transform.Find("Bullet_spawn");
}

void Update()
{
        Debug.DrawRay(bulletSpawn.position,bulletSpawn.forward,Color.yellow);
}

tento kód mi vyhazuje exception že se snažím přistupovat k objektu který neexistuje. Jenže problém je v tom že objekt opravdu existuje a DrawRay se vykresluje správně, jen to neustále hází tu vyjímku. Samozdřejmě ji můžu odchytit try catch nebo podmínkou if(bulletSpawn), ale jde mi o to, proč je tam vyjímka když je vše v pořádku ?

PS: chtěl jsem se zeptat, jestli by nebylo od věci založit forum jen pro Unity3d
PS2: sorry za špatnej nadpis jedná se o použití Transform a ne GameObject

Editováno 20.9.2017 8:09
 
Odpovědět
20.9.2017 8:07
Avatar
Odpovídá na dez1nd
Michal Štěpánek:20.9.2017 10:21

Který kód ti hází tu výjímku? Start nebo Update?
Nevím, jak je to v unity, ale neumí metoda "Find" hledat jen podle ID, které je "int"?

Nahoru Odpovědět
20.9.2017 10:21
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
dez1nd
Člen
Avatar
Odpovídá na Michal Štěpánek
dez1nd:20.9.2017 13:54

Hází to v metodě Update(). Fce Find hledá podle názvu, to mi normálně objekt najde a bez problémů dokáže vypsat i jeho jméno atd.. ale pouze Debug.DrawRay dělá potíže

dělá to to samé i když je kod takto

public Transform bulletSpawn;
void Start()
{
        // Tohle je zakomentovane objekt je prirazen pres inspectora
        // bulletSpawn = transform.Find("Bullet_spawn");
}

void Update()
{
        Debug.DrawRay(bulletSpawn.position,bulletSpawn.forward,Color.yellow);
}
 
Nahoru Odpovědět
20.9.2017 13:54
Avatar
Odpovídá na dez1nd
Garrom Orc Shaman:23.9.2017 13:53

V logu jsou u chyby napsána dvě čísla. Většinou to vypadá takto : JménoScriptu (22,8) NullReference­Exeption.
To "22" je číslo řádku a "8" je znak na řádku kde se chyba vyskytla. Poskytnutím těchto údajů by jsi velice pomohl ostatním aby zjistily o co přesně jde.
Co mně tak z místa napadá jsou pouze obecné domněnky jako třeba :

  1. Není objekt zničen dříve než na něj získáš referenci ?
  2. Jsi si jist že je objekt aktivní ?
  3. Nemáš někde kus kódu který objekt Bullet_spawn zničí/zakáže ?
  4. Když hra běží a ty se podíváš do inspektoru je v poli "public Transform bulletSpawn" přiřazen objekt nebo se tam píše "Missing" ?

PS. Ne, nebylo by od věci založit Unity3D fórum, vzhledem k velikosti komunity by to bylo spíše praktické.

Editováno 23.9.2017 13:55
Nahoru Odpovědět
23.9.2017 13:53
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Odpovídá na dez1nd
Garrom Orc Shaman:23.9.2017 13:59

Ještě mně napadlo. Přidej tohle do Update() a napiš nám co ti to píše. To také může hodně pomoct.

Debug.Log(bulletSpawn);
Nahoru Odpovědět
23.9.2017 13:59
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
dez1nd
Člen
Avatar
Odpovídá na Garrom Orc Shaman
dez1nd:23.9.2017 15:44

Normálně to ten objekt najde.
Vypisuje to:

Bullet_Spawn (UnityEngine.Tran­sform)
UnityEngine.De­bug:Log(Objec­t)
Weapon_Contro­ller:Update() (at Assets/Scripts/We­apon_Controller­.cs:30)

 
Nahoru Odpovědět
23.9.2017 15:44
Avatar
Odpovídá na dez1nd
Garrom Orc Shaman:23.9.2017 21:45

Hmm... Technicky vzato by to mělo fungovat... Tvůj problém je nanejvýše divný. Pravděpodobně se pokazilo něco v projektu. Zkus vytvořit nový projekt a imortovat naprosto vše. Také je tu možnost že je pokažená třída samotná, třídy jsou uchovávány v .dll souborech, možná pomůže přeinstalovat Unity Editor.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
23.9.2017 21:45
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
dez1nd
Člen
Avatar
Odpovídá na Garrom Orc Shaman
dez1nd:24.9.2017 11:52

vyzkouším to a dám vědět :)

 
Nahoru Odpovědět
24.9.2017 11:52
Avatar
Odpovídá na dez1nd
Luboš Běhounek Satik:24.9.2017 12:12

Přes VS to debugovat nemůžeš?

Nahoru Odpovědět
24.9.2017 12:12
https://www.facebook.com/peasantsandcastles/
Avatar
dez1nd
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
dez1nd:24.9.2017 12:43

Debug nic nehlásí.

Vyřešeno, aktualizace na Unity 2017.1.1.f1

 
Nahoru Odpovědět
24.9.2017 12:43
Avatar
Odpovídá na dez1nd
Luboš Běhounek Satik:24.9.2017 13:24

debug pres VS nema nic hlasit, myslel jsem tim krokovat prres VS :)

Editováno 24.9.2017 13:26
Nahoru Odpovědět
24.9.2017 13:24
https://www.facebook.com/peasantsandcastles/
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.