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

Typy generyczne w Unity3D

Cloud VPS
0 głosów
344 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 921 wizyt
pytanie zadane 4 maja 2019 w C# przez Shimeo7 Obywatel (1,910 p.)
0 głosów
1 odpowiedź 677 wizyt
pytanie zadane 4 maja 2017 w C# przez Jakub Gonera Nowicjusz (140 p.)
0 głosów
1 odpowiedź 315 wizyt
pytanie zadane 12 listopada 2018 w Java przez Patryk01 Obywatel (1,270 p.)

93,486 zapytań

142,420 odpowiedzi

322,771 komentarzy

62,900 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

Kursy INF.02 i INF.03
...