Nigdy mi się to nie zdarzyło, więc jestem trochę zdezorientowany.
GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;
To generuje błąd, ale obiekt jest w rzeczywistości tworzony i wszystko działa zgodnie z przeznaczeniem. Błąd nie zatrzymuje programu bez względu na to, ile razy go odtwarzam.
Czy mogę zignorować ten błąd lub czy jest jakiś problem, którego nie widzę?
Odpowiedzi:
Jeśli obiekt zostanie utworzony poprawnie, pomimo
Intantiate()
wygenerowania wyjątku przez linię, oznacza to, że błąd pochodzi z innej instancji skryptu - może przypadkowo mieć drugą kopię w scenie.Jedna instancja jest poprawnie skonfigurowana i działa
Instantiate()
zgodnie z oczekiwaniami bez błędów, więc obiekt jest tworzony zgodnie z potrzebami.Inna instancja jest niepoprawnie skonfigurowana i zgłasza błąd. Ale jeśli patrzysz tylko na poprawnie skonfigurowaną instancję, ten błąd wydaje się pochodzić znikąd i nie ma widocznych konsekwencji.
Możesz wydrukować ścieżkę do obiektu na Start - lub w teście zerowym tuż przed linią naruszającą - aby wyśledzić niechciane duplikaty scen.
Absolutnie nie należy ignorować tego błędu.
W najlepszym razie niepotrzebnie pali cykle obliczeniowe. W najgorszym przypadku jest to znak, że twoja gra robi coś, czego nie do końca rozumiesz, i może to być przyczyną znacznie większych problemów.
źródło
Odpowiedź
Zacznę od bezpośredniej odpowiedzi na pytanie:
Państwo dało . Nie powinieneś , bo to znaczy, że coś idzie nie tak. Przyzwyczaiłbyś się do tego błędu, ale może on „ukryć się” lub spowodować kolejny błąd.
Obecnie masz komunikat o błędzie i nadal działa poprawnie. Odwrotnie, nie działa i nie ma (a raczej: nie rozpoznaje) informacji zwrotnej, dlaczego, jest znacznie gorzej!
Rada
Aby dowiedzieć się, skąd to się bierze, podziel to wszystko na kilka linii.
Błąd mówi tylko, w której linii to się wydarzyło. Jeśli błąd wystąpi w tym kodzie, numer linii powie Ci więcej o tym, która część poszła tutaj źle. Radzę też użyć ogólnej wersji
Resources.Load
, która dałaby nam o jeden krok mniej do zmartwienia:Dowiedz się dlaczego
Instantiate()
.prefab
to , że jestnull
.Resources.Load
zwrotynull
.Resources.Load
mówi „ Powroty aktywo napath
razie można go znaleźć w przeciwnym razie zwraca NULL. ”resourceLocation
)Coś jest nie tak z tą ścieżką, więc oczywistym pierwszym krokiem byłoby sprawdzenie, czym tak naprawdę jest, dzięki Debug.Log. Ponieważ „wszystko działa zgodnie z przeznaczeniem”, prawdopodobne jest, że w miejscu, w którym działa jedna wersja, zachodzi pewne powielanie, a druga daje ten błąd.
W takim przypadku dobrym pomysłem jest skorzystanie z 2-parametrowej wersji Debug.Log
Debug.Log(resourceLocation, gameObject);
. Teraz, jeśli klikniesz komunikat dziennika w edytorze Unity, wybierzeGameObject
skąd pochodzi.źródło