Wpis z mikrobloga

Ktoś mi łaskawie wytłumaczy

a = GetComponent ();
a = GameObject.FindObjectOfType(typeof(cosTam)) as cosTam;

Dlaczego w Unity, C#, wymagane jest dopowiedzenie jeszcze, że poszukiwanym obiektem jest np. CosTam jako (as) coś tam? Dlaczego muszę doprecyzowywać po "as" jeszcze to, skoro już wcześniej wyraziłem się, że typeoff to jest właśnie cosTam? :)

#unity3d #unity #unity #gamedev #csharp

Dziękuję za odpowiedź.

EDIT: i dlaczego musze jeszcze powiedzieć że a to weź komponent od skoro już na dzień dobry stwierdziłem/zdefniowałem sobie, że
cosTam a;
  • 28
  • Odpowiedz
@Wextor: hmm, sprawdzę :) W każdym razie, ciekawi mnie, czy to "as" ma jakieś zastosowanie, że mogę prosić o znalezienie jakiegoś obiektu, ale zdefiniować go inaczej?
  • Odpowiedz
@Szmerg: właśnie z tym zwracaniem obiektu, zamiast as cośam też możesz chyba użyć a = GameObject.FindObjectOfType(typeof(cosTam)).GetComponent()
  • Odpowiedz
@Szmerg: Wynika to z tego że typeof(MójTypik) zwraca instancję typu System.Type reprezentującą twój typ ale robi to dopiero w czasie działania programu.
Mechanizm wnioskowania typów nie jest w stanie na tej podstawie wywnioskować konkretnego typu zwracanego funkcji. Gdybyś miał ten typ podany jako parametr generyczny to zadziałałoby.
Zwracany jest zapewne System.Object który castujesz sobie z użyciem 'as'.
  • Odpowiedz
@Szmerg: Nie znam Unity ale sprawdź czy nie ma metody GameObject.FindObjectOfType(). Np w Autofac są metody przyjmujące System.Type (zwracają one System.Object) i są też generyczne zwracające podany typ.
  • Odpowiedz
@Szmerg: teoretycznie nie musisz uzywac as. Mozesz traktowac zwrocony obiekt jako Object aczkolwiek jesli chcesz uzyc wlasciwosci konkretnego obiektu cosTam to musisz go zrzutowac na dany typ i sprawdzic czy rzutowanie uzywajac as sie powiodlo.
  • Odpowiedz
EDIT: i dlaczego musze jeszcze powiedzieć że a to weź komponent od skoro już na dzień dobry stwierdziłem/zdefniowałem sobie, że

cosTam a


@Szmerg: GetComponent to metoda generyczna, musisz wtedy podać typ. Sygnatura tej metody to mniej więcej: T GetComponent() . W ciele tej metody wykonywana jest logika dla której niezbędne jest podanie w parametrze generycznym T, typu jaki chcesz mieć zwrócony. Generalnie to C# jest językiem TypeSafe i nie będzie
  • Odpowiedz