• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Typy generyczne w Unity3D

Object Storage Arubacloud
0 głosów
238 wizyt
pytanie zadane 3 czerwca 2019 w C# przez rubesom Obywatel (1,690 p.)
zmienione kategorie 3 czerwca 2019 przez draghan

Hej

Chodzi mi o kod ze strony LINK

Jest tam taka konstrukcja:

public Rigidbody rb;
rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(0, 10, 0);

Pierwsza linijka to referejncja do obiektu klasy Rigidbody. Druga to użycie metody GetComponent z zadeklarowanym typem Rigidbody bez podania żadnych parametrów?
I nie rozumiem czemu trzeba było zrobić w ten sposób, żeby w trzeciej linijce zadeklarować użycie metody Velocity z konkretnym konstruktorem.
Da się to przedstawić na jakimś prostym przykładzie co się pod tym kryje?

1
komentarz 3 czerwca 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)

Pierwsza linia to utworzenie zmiennej typu Rigidbody.
Druga linia to pobranie referencji Komponentu typu Rigidbody.
Trzecia linia to zmiana wartości pola (nie metody) velocity.

Odnośnie GetComponent<T> () - to przeciążenie metody wykorzystuje parametr typu (generyczny) aby wiedziała jakiego, dołączonego do obiektu, komponentu szukać. Jednocześnie zwraca typ Rigidbody.

rb = (Rigidbody) GetComponent (typeof (Rigidbody));

Drugie przeciążenie ma argument - jest nim typ Komponentu, jednak metoda zwraca object nie  Rigidbody dlatego należy użyć rzutowania, czy też konstrukcji as

Oto link do strony dokumentacji opisującej tą metodę:

https://docs.unity3d.com/ScriptReference/Component.GetComponent.html

W trzeciej lini należy użyć konstruktora, gdyż Vector3 jest struct, więc aby przekazać pewne wartości, należy właśnie użyć konstruktora. Inaczej nie da się podać wartości do velocity.
Można co prawda odwoływać się kolejno do pól x, y, z jednak jeśli velocity jest null'em, to kod rzuci błąd NullReferenceException.

komentarz 4 czerwca 2019 przez rubesom Obywatel (1,690 p.)
Głównie druga linijka sprawia mi problem. Czemu muszę pobrać referencję na obiekt typu Rigidbody kiedy mam już zadeklarowany typ obiektu rb na Rigidbody?

Pewnie dalej coś źle rozumiem.
komentarz 4 czerwca 2019 przez rubesom Obywatel (1,690 p.)

@piotrsz109,

A jak to jest, że do Rigidbody2D mogę się dostać bez używania GetComponent? Np.:

public Rigidbody2D rb;

i już mam dostęp np. do 

rb.velocity =

 

komentarz 4 czerwca 2019 przez piotrsz109 Stary wyjadacz (13,730 p.)
Zmienna na starcie nie posiada żadnej wartości, więc gdy po prostu ją deklarujesz jest ona null'em. Dopiero użycie GetComponent ustawia jej wartość.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
3 odpowiedzi 690 wizyt
pytanie zadane 4 maja 2019 w C# przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 585 wizyt
pytanie zadane 4 maja 2017 w C# przez Jakub Gonera Nowicjusz (140 p.)
0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 12 listopada 2018 w Java przez Patryk01 Obywatel (1,270 p.)

92,543 zapytań

141,386 odpowiedzi

319,493 komentarzy

61,929 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...