Tworzę, co w zasadzie jest moim własnym systemem prefabrykowanym. Obiekty gry są definiowane przez plik danych czytelny dla człowieka. Chciałbym utworzyć pusty GameObject, załadować go ze składnikami zdefiniowanymi w pliku danych i przygotować go i czekać na Instantiate()
połączenie. Jednak za każdym razem, gdy używam GameObject go = new GameObject()
nowego obiektu, do sceny jest dodawany obiekt.
Korzystając z wbudowanych prefabrykatów Unity, mogę załadować prefabrykat jako GameObject i nie jest on dodawany do sceny. (Patrz przykład poniżej)
Uzasadnieniem tego jest chęć posiadania jednej listy zawierającej obiekty GameObject, niektóre generowane przez ładowanie prefabrykatów Unity, a inne tworzone przez mój własny system prefabrykatów. Musi się to zdarzyć w czasie wykonywania i nie może obejmować edytora Unity (ponieważ idealnie użytkownicy końcowi mogliby definiować własne pliki danych).
Jak mogę stworzyć nowy GameObject, bez Unity, który automatycznie utworzy go dla mnie?
Na przykład mogę wykonać takie połączenie:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
I dostanę listę GameObjects, z których żaden nie jest dodawany do sceny, kiedy jest wykonywane połączenie. Zasadniczo tworzę LoadAll
metodę dla moich własnych prefabrykatów i podobnie nie chcę tworzyć instancji GameObjects podczas wykonywania połączenia.
źródło
Destroy
GameObject. Co usuwa go ze sceny i uwalnia, co czyni go bezużytecznym.go.SetActive(false)
jest najlepszym sposobem na utworzenie czegoś takiego jak pula obiektów. Nie jest to dokładnie to, czego chcesz, ale być może możesz mieć małą grupę nieaktywnych obiektów, które później zostaną sklonowane w celu utworzenia niestandardowej instancji.Odpowiedzi:
Mógłbyś zmienić hideFlags GameObject?
Właśnie próbowałem uruchomić to:
... i tam jest, ale nie ma go w hierarchii. Technicznie rzecz biorąc, jest na scenie, ale nie widzisz go, dopóki nie zmienisz jego flag z powrotem na HideFlags.None. Nie jest to odpowiedź, której szukasz, ale przynajmniej jeśli chodzi o udostępnienie tego programistom, jest czystsza niż grupowanie obiektów.
źródło
Niestety nie możesz tego dokładnie zrobić. Można jednak wykonać ten sam wzorzec projektowy (tj. Wyodrębnić budynek swoich obiektów, a następnie po prostu wywołać je za pomocą jednego polecenia później) za pomocą wzorca fabrycznego .
Kiedy chcesz obiekt, zadzwoń jakoś
Factory.CreateGameEntity()
, a ta metoda obsłuży wszystko za kulisami.źródło
GetComponent<>() != null
. W przypadku moich plików danych analizator składni musi wyszukać odpowiedni składnik w danych. To samo dotyczy uzyskiwania wartości z wnętrza komponentu i tak dalej.GameObject
Klasa udostępnia wiele funkcji, które muszą być powielane przez parser.Nie można tego zrobić
go = new GameObject();
bez dodania go do sceny.Pracuję nad RTS, w którym baza graczy musi być trwała i zasadniczo serializujemy wszystko, co zrobili, i ładujemy ją z powrotem w czasie wykonywania, używając zmodyfikowanych zasobów ze sklepu.
Większość danych wyjściowych do XML lub JSON, więc ładowanie pliku i manipulowanie nim jest dowolne.
źródło
Właściwym sposobem jest utworzenie prefabrykatu, przydzielenie go jako obiektu, a następnie za każdym razem, gdy chcesz utworzyć instancję, po prostu użyj odwołania do tego obiektu i rzuć go jako obiekt GameObject.
np .:
źródło
Aby załadować prefabrykat do zmiennej, aby można było utworzyć go później, należy użyć następującego kodu:
Zrobiłem to w projekcie z Unity 5.5. Będzie dostępna do tworzenia instancji, ale nie będzie w scenie lub części hierarchii, dopóki nie zostanie utworzona w normalny sposób.
źródło