Wpis z mikrobloga

Dlaczego nie mogę zrobić tak?

private void Start() {
GameObject cube = GameObject.Find("Cube");
Text cubeText = cube.GetComponent();

}`

Tylko muszę tak:

GameObject cube;
Text cubeText;

private void Start() {
cube = GameObject.Find("Cube");
cubeText = cube.GetComponent();
}

#unity3d #csharp #programowanie
  • 12
  • Odpowiedz
ponieważ w pierwszym przypadku zmienne są lokalne i dostęp do nich jest tylko w ciele metody.


@DoubleAxxis: kurde... Faktycznie. Strasznie mi się nie podoba, że w Unity deklaracja i inicjalizacja muszą być tak rozbite, żeby się dostać do komponentu.
  • Odpowiedz
@Goryptic: Ale to nie jest wina Unity tylko języka programowania. Przecież to działa tak samo w C, Java, C++, C#. Zmienna która jest zadeklarowana lokalnie w bloku czy tam metodzie jest dostępna tylko w tym bloku, metodzie.
  • Odpowiedz
@Goryptic: ale to nie do końca wina Unity. Tak to po prostu działa. Deklarujesz zmienną jako element klasy, albo deklarujesz zmienną jako zmienna dostępna wewnątrz ciała funkcji. Wszystko zależy od tego jak chcesz z nią pracować.

Wywołuje się Start, tam pobierasz wszystko co ci potrzebne potem w Update, żeby nie pytac o to co klatkę. Możesz też w Start pobrać je tak jak w przykładzie pierwszym, zrobić z nimi co
  • Odpowiedz
@tlustywalec: @Colos: @Saly: ale mi chodzi o to, że nie mogę POZA Startem od razu zrobić tak:

GameObject cube = GameObject.Find("Cube");

Muszę najpierw zadeklarować 'GameObject cube' poza Startem, a potem w Starcie 'cube = GameObject.Find("Cube");"

Za to jeśli w innym skrypcie zrobię sobie jakąś klasę, to obiekt tej klasy mogę sobie utworzyć gdziekolwiek - w Starcie, poza Startem, w Update, wszędzie.
  • Odpowiedz
@Goryptic: A no chyba że tak. Jak się nad tym zastanowić to ma to sens jednak.

Jak używasz swojej klasy poza metodą, to po prostu wywołujesz jej konstruktor i tworzysz nowy obiekt. I konstruktor Example ostatecznie wywoła się w konstruktorze klasy w której został zainicjalizowany. Nie ma tu żadnego problemu.

Example test = new Example();
Z
  • Odpowiedz
@Goryptic: wygląda, że tak rozwiązali cykl życia tego komponentu. Pewnie instancje tych MonoBehaviour powstają zanim wywołanie GameObject.Find() jest możliwe. Na pewno możliwy jest innych design (np. możemy tworzyć obiekt zamiast wołać Start() na gotowym obiekcie), choć z drugiej strony to rodzi inne problemy.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@Goryptic: ale jak robisz inicjalizacja po za metoda start to będzie się do działki za każdym razem kiedy tworzone jest instancja skryptu. Jak jest przypięty do prefaba to jak zaznaczysz prefab w projekcie to się to wydarzy.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@Goryptic: bo już wtedy masz pełnoprawną instancje skryptu, widzisz go w inspectorze, widzisz co ma wpięte w publiczne pola. Możesz wykonywać metody np przez custom inspector view
  • Odpowiedz