Mirki szukam metody na wskazywanie skryptom obiektów w grze. Dotychczas używałem przeszukiwania wszystkich obiektów "GameObject.Find("hero"+playerNumber);" albo bezpośredniego linkowania ale to jest upierdliwe albo procesorożerne. Musi być jakaś metoda że np. podaję listę przyporządkowań np. hero1="GameObject.hero1" a Unity wie że jak go gdzieś wpiszę to chodzi o konkretnego ludka bez szukania i kombinowania
Może takie coś: masz jedne statyczne dictionary gdzieś w jakiejś klasie gdzie masz key jako string a val jako twój ludek i do każdego ludka dodajesz prosty skrypt który w funkcji Start dodaje go do tego statycznego globalnego dictionary . Potem jak będziesz potrzebował jakiegoś ludka po nazwie to szukasz w tym dictionary i masz.
@moje_bagno: czyli do dictionary dodaję jakby powiązania ludków tak samo jak do skryptu i potem tylko wskazuję który element z dictionary chcę wziąć? Czyli tak samo jakbym dodał wszystkich do jakiegoś globalnego skryptu i potem ciągnął z tego skryptu val który jest tym właśnie podlinkowanym ludkiem?
@ewolucja_myszowatych: Dokładnie po prostu przechowujesz wszystkie referencje do swoich ludków w jednym dictionary do którego masz dostęp za pomocą jakichś statycznych metod dzięki temu możesz wszędzie w kodzie uzyskać do nich dostęp
@denis-szwarc: Linq jest fajny i przyjemny w użyciu, ale ma spory narzut na wydajność. Radzenie użycie czegoś takiego w grze, w sytuacji gdy można to załatwić prostym dictionary jest delikatnie mówiąc nie na miejscu.
@ewolucja_myszowatych: Najłatwiej będzie zrobić tak jak doradził @moje_bagno . Przy tworzeniu nowego obiektu zapisujesz go do słownika i wyciągasz gdy potrzebujesz. Takie rozwiązanie ma swoje wady, ale będzie najprostsze do wykonania.
@ewolucja_myszowatych: Listy są dobrym pomysłem ale ich przeszukiwanie jest długie (żeby znaleźć ostatni element na liście należy przejść przez wszystkie elementy). W związku z czym wraz z ilością obiektów rośnie czas przeszukiwania. Za to dodawanie i usuwanie elementów z listy jest w miarę szybkie.
@denis-szwarc: Linq jest fajny i przyjemny w użyciu, ale ma spory narzut na wydajność. Radzenie użycie czegoś takiego w grze, w sytuacji gdy można to załatwić prostym dictionary jest delikatnie mówiąc nie na miejscu.
@Hirunkan: masz rację, można też zwykłym foreachem: foreach(var h in heroes) { if(h.name == "hero" + id) { return h; } }
@denis-szwarc: @Hirunkan: @nowa_zielonka: @moje_bagno: wielkie dzięki za podane zostowania. Przetestuję słownik bo najlepiej mi pasuje, obiekty są różne - od przelatującego ptaka po joint łączący 2 elementy więc nie ma sensu ich wypisywać, chodziło mi tylko o to że "GameObject.Find" musi przeszukać każde pojedyncze ździebko trawy żeby rzeczonego ptaka odnaleźć co mi jeżyło włosy na plecach
Jeden bankrut pożycza drugiemu bankrutowi. 400 mld euro poszło na odbicie malutkiej wsi robotajne a na tagu radość bo 61 mld dolarów przegłosowali xD Starczy na 2 miesiące po czym znów będzie objazd po wszystkich krajach prosząc o pieniądze bo za mało było xD #ukraina #rosja
#unity3d #gamedev
List heroes;
potem wystarczy funkcja:
GameObject GetHeroById(int id) {
return heroes.Where(h => h.name == "hero" + id).ToSingle();
}
lub jeśli herosy są pokolei to wystarczy:
return heroes[id];
@ewolucja_myszowatych: Najłatwiej będzie zrobić tak jak doradził @moje_bagno . Przy tworzeniu nowego obiektu zapisujesz go do słownika i wyciągasz gdy potrzebujesz. Takie rozwiązanie ma swoje wady, ale będzie najprostsze do wykonania.
Jeśli elementy przechowywane w kolekcji są dodawane i usuwanie w miarę rzadko, to o wiele lepszym pomysłem jest przechowywanie jako hashTable ( https://docs.microsoft.com/pl-pl/dotnet/api/system.collections.hashtable?view=netframework-4.8 ). Dostęp do obiektu
@Hirunkan: masz rację, można też zwykłym foreachem:
foreach(var h in heroes) {
if(h.name == "hero" + id) {
return h;
}
}
Ja wszystko co mogę robię na linq i nigdy procesor nie jest bottleneckiem, zawsze to karta graficzna spowalnia grę.
Np ta moja gra: https://youtu.be/hvuMQvNec5o
Wszystko co można wymyślić używa list i linq, listy są nawet gdzieniegdzie tworzone co ramkę. Gra śmiga dobrze na starych androidach 4.1 i jedyne co
Komentarz usunięty przez moderatora