Erori la construirea jocului pentru orice platformă (Dezvoltarea jocurilor, Unitate, Proces De Construcție)

Ultra Gamer a intrebat.

Fiind un utilizator mai nou de Unity, nu am mai avut această problemă până acum. M-am uitat pe internet și nu am găsit nici un ajutor, cu excepția reimportării tuturor activelor mele, ceea ce nu a ajutat.

Primesc aceste erori atunci când construiesc pentru orice platformă:

Assets/Scripts/MainMenuManager.cs(41,21): eroare CS0234: Numele tipului sau al spațiului de nume EditorApplication' does not exist in the namespace
UnityEditor’. Îți lipsește o referință de asamblare?

Eroare la construirea Player deoarece scripturile au avut erori de compilare

Construirea s-a finalizat cu rezultatul ‘Failed’ UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

UnityEditor.BuildPlayerWindow+BuildMethodException: 2 erori la UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x0021f] in C:buildslaveunitybuildEditorMonoBuildPlayerWindowBuildMethods. cs:187 at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x0007f] in C:\buildslaveunitybuildEditorMonoBuildPlayerWindowBuildMethods.cs:94 UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

NullReferenceException: Object reference not set to an instance of an object UnityEditorInternal.AnimationWindowControl.GetAnimationModeDriver () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:474) UnityEditorInternal.AnimationWindowControl. get_previewing () (at C:/buildslave/unity/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:340) UnityEditorInternal.AnimationWindowControl.get_recording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:390) UnityEditorInternal.AnimationWindowControl.StopRecording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:421) UnityEditorInternal.AnimationWindowControl.StopPreview () (at C:/buildslave/unity/build/Editor/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:361) UnityEditorInternal.AnimationWindowControl.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:105)

NullReferenceException: Object reference not set to an instance of an object UnityEditorInternal.AnimationWindowControl.GetAnimationModeDriver () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:474) UnityEditorInternal.AnimationWindowControl. get_previewing () (at C:/buildslave/unity/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:340) UnityEditorInternal.AnimationWindowControl.get_recording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:390) UnityEditorInternal.AnimationWindowControl.StopRecording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:421) UnityEditorInternal.AnimationWindowControl.StopPreview () (at C:/buildslave/unity/build/Editor/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:361) UnityEditorInternal.AnimationWindowControl.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:105) UnityEditorInternal.AnimationWindowState.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowState.cs:315)

NullReferenceException: Object reference not set to an instance of an object UnityEditorInternal.AnimationWindowControl.GetAnimationModeDriver () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:474) UnityEditorInternal.AnimationWindowControl. get_previewing () (at C:/buildslave/unity/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:340) UnityEditorInternal.AnimationWindowControl.get_recording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:390) UnityEditorInternal.AnimationWindowControl.StopRecording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:421) UnityEditorInternal.AnimationWindowControl.StopPreview () (at C:/buildslave/unity/build/Editor/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:361) UnityEditorInternal.AnimationWindowControl.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:105) UnityEditorInternal.AnimationWindowState.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowState.cs:315) UnityEditor.AnimEditor.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationEditor.cs:363) UnityEditor.AnimationWindow.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindow/AnimationWindow.cs:72)

NullReferenceException: Object reference not set to an instance of an object UnityEditorInternal.AnimationWindowControl.GetAnimationModeDriver () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:474) UnityEditorInternal.AnimationWindowControl. get_previewing () (at C:/buildslave/unity/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:340) UnityEditorInternal.AnimationWindowControl.get_recording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:390) UnityEditorInternal.AnimationWindowControl.StopRecording () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:421) UnityEditorInternal.AnimationWindowControl.StopPreview () (at C:/buildslave/unity/build/Editor/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:361) UnityEditorInternal.AnimationWindowControl.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowControl.cs:105) UnityEditorInternal.AnimationWindowState.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationWindowState.cs:315) UnityEditor.AnimEditor.OnDisable () (at C:/buildslave/unity/build/Editor/Mono/Animation/AnimationWindow/AnimationEditor.cs:363)

Nu știu ce înseamnă toate acestea și nu pot găsi alte informații în acest sens. Nu am actualizat Unity sau ceva de genul ăsta.

Comentarii

  • Se pare că este posibil să aveți unele fișiere care folosesc UnityEditor și care nu se află într-un folder numit „editor”. Poți să cauți în baza ta de cod pentru „UnityEditor” și să ne spui ce ai găsit?-  > Por DMGregory.
  • @DMGregory Nu găsesc nimic în directorul de active al proiectului meu…  > Por Ultra Gamer.
  • Ce zici de Assets/Scripts/MainMenuManager.cs, linia 41?  > Por DMGregory.
  • @DMGregory Acesta este unul dintre scripturile mele, linia 41 este un simplu „UnityEditor.EditorApplication.isPlaying = false;” care acționează ca un buton de părăsire a editorului.-  > Por Ultra Gamer.
  • @DMGregory Asta o să sune foarte prostesc, dar comentând acea linie de cod a rezolvat-o… Aveți vreo teorie de ce acea linie a cauzat o problemă în Unity, dar jocul s-a jucat în editor și VS deși era în regulă?-  > Por Ultra Gamer.
1 răspunsuri
Joe

Principalul blocant aici arată ca:

Assets/Scripts/MainMenuManager.cs(41,21): eroare CS0234: Tipul sau numele spațiului de nume EditorApplication’ nu există în spațiul de nume UnityEditor’. Vă lipsește o referință de ansamblu?

Se precizează că aveți un script (MainMenuManager.cs) care încearcă să apeleze codul (EditorApplication) din spațiul de nume UnityEditor, , care nu există.

Acesta nu există pentru joc construit deoarece biblioteca UnityEditor, care conține acel namespace, nu este inclusă în jocurile construite.

O soluție de rezolvare este utilizarea verificărilor de definire a preprocesorului dacă trebuie să aveți codul de editare și de execuție în același script, de ex:

Pentru codul doar pentru editor:

#if UNITY_EDITOR
using UnityEngine;
#endif

Pentru utilizarea unui cod diferit în editor față de orice altă platformă (țintă de construire):

#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif

(rețineți că, în exemplele de mai sus, evidențiazătorul de sintaxă colorează liniile care încep cu # ca fiind comentarii. Acestea sunt, de fapt, părțile pertinente ale exemplelor)

Unity are documentație privind suportul și utilizarea acestor definiții de preprocesor pentru compilarea în funcție de platformă. Preprocesorul modifică codul trimis către compilator. Când construiți, #if UNITY_EDITOR este falsă și compilatorul nici măcar nu va vedea codul din interiorul acelui bloc.


Pentru a explica de ce totul poate părea în regulă, Unity va partaja fișiere de proiect cu Visual Studio, ceea ce îi va permite să utilizeze compilatorul Visual Studio C# pentru propria funcționalitate, de exemplu, verificarea erorilor. Pentru a activa această funcționalitate în VS pentru scripturile editorului, Unity include o referință la biblioteca UnityEditor pentru un proiect „editor” în VS – făcând ca VS să raporteze că nu există erori, deoarece instrumentele sale au o referință la biblioteca UnityEditor, în timp ce compilatorul Unity care construiește jocul dumneavoastră nu are o astfel de referință.

Comentarii

  • Ok, dar am deja în același script atât „UnityEditor.EditorApplication.isPlaying = false;” cât și „Application.Quit();”.  > Por Ultra Gamer.
  • Ați observat liniile #if UNITY_EDITOR și altele similare? Ele sunt cele care spun ce bucăți de cod vor fi folosite. S-ar putea să nu fi fost clar, deoarece sunt colorate la fel ca și comentariile de aici.-  > Por Joe.
  • Bine, înțeleg, mulțumesc.  > Por Ultra Gamer.