Ostatnia modyfikacja: 10-05-2019
Tutaj znajdują się porady od @trolit aby zwiększyć efektywność swojej pracy w programie Unity.
Sekcja - Level design
(1) - Nie utrudniaj sobie roboty na scenie Map
@gradampl nie twórz terenu na podstawie takiej szachownicy jaką przygotowałem sobie ja. Ona jest dobra bo na minigierki jest jej niewiele i nie jest trudna do zarządzania. W przypadku mapy gdy terenu będzie ciut więcej lepiej aby podłoże było danego typu. Np. ścieżka to jakaś utwardzona brązowa ziemia a pozostała powierzchnia zielony kolor który ma sugerować trawę. I na nim umieszczasz potem prefab trawy w losowych miejscach Teren w zależności od motywu , i tyle :)
(2) - Jak podejść najlepiej do projektowania sceny?
- Tworzymy najpierw koncept do którego zalicza się - zakres obszaru, uziemienie
- Wypełniamy utworzony koncept prefabami np. drzewa, domy
- Dbamy o szczegóły np. trawa, kamyki gdzieś, gdzieś ogrodzenie etc.
- Jeżeli konieczne - projektujemy ograniczenia za pomocą Collider
(3) - Idealne narzędzie do level designu 🆙
![image](https://user-images.githubusercontent.com/25982919/63716152-96cfa500-c845-11e9-8c96-a8b73e5eba05.png)
Kiedy projektuje się poziom, idealnym narzędziem jest to zaznaczone na zdjęciu - chcesz np. teraz umieścić kamienie albo trawe na mapie? Bierzesz to narzędzie, tworzysz kamień i potem za pomocą CTRL-D duplikujesz. Przenosisz w inną pozycje i możesz go szybko obrócić, skalować i skorygować pozycję.
Osobiście najczęśniej zdarza mi się używać to zaznaczone oraz te dostępne pod skrótami W i E.
W - przesuwanie w jednej osi
E - rotacja
wcześniej wspomniane narzędzie pod przyciskiem Y to mix wszystkiego - możliwość przesuwania, rotacji, przesuwania według jednej osi, skalowania etc
(4) - Uważaj na materiały czyli "materials"
Przyjmijmy taką sytuację. Położyłeś na mapie ten sam zamek trzy razy. Wszystkie są niebieskie. Pomyślałeś, że chciałbyś aby jeden z nich miał inny kolor np. żółty, co robisz? Większość by kliknęła na obiekt, rozwinęła materiał i zmodyfikowała kolor ale tak się nie robi. Dlaczego? Modyfikujesz materiał, który jest nałożony na wszystkie 3 zamki. Więc jak zmienisz kolor jednego - pozostałych też się zmieni.
Co zrobić? Proste - utworzyć nowy materiał z zamierzonym kolorem / efektem i nałożyć go na jeden z zamków. 👍
(5) - Domki w motywie zimowym
@gradampl Jeżeli nie będziesz wiedział jak sobie wyciągnąć domki z pakietu dla motywu zimy to musisz dać znać:)
Aktualizacja: domki zostały przygotowane w formie prefabów także nie powinno być problemu je wykorzystać ale nadal w tym pakiecie mogą być rzeczy, które może ci się przydadzą.
(6) - Trawy dużo czy nie?
Zawsze warto postawić sobie pytanie czy jest sens tworzyć "dywan" z trawy? Odpowiedź brzmi: to zależy. W przypadku projectZero gdy mamy perspektywe z "lotu ptaka" - NIE. Jeżeli całą ziemię otoczymy skupiskiem trawy to nie będzie ona wyglądała jako trawa tylko stos "patyków" wystających z ziemi co pogorszy wizualne odczucia. Zalecałbym zatem nie pokrywanie całej ziemi trawą 😄
Gdyby była trawa rodem z gry AAA czyli taka, która jest gęsta i reaguje na to czy ktoś po niej chodzi to wtedy można by było pomyśleć o "dywanie" trawy 🍔
(7) - Polub jednolitą ziemię na mapie głównej (scena Map)
Szachownicę tylko zrób dla mapy C# bo nie wyrobisz się ze swoimi zadaniami więc jak będziesz się zajmował pozostałym terenem to zerkaj (najlepiej na minigre puzzle) jakie jest podłoże i takie aplikuj na scenie Map 👍
(8) - Przed projektowaniem przejrzyj prefaby
Jeżeli zabierasz się za projektowanie czegoś to warto w pierwszej kolejności przejrzeć prefaby , które ma się dostępne. Jeżeli pada stwierdzenie że jest ich za mało należy pogrzebać w necie i je uzupełnić o to co by się jeszcze przydało :) (ewentualnie szukać w edytorze Unity)
(9) - Mesh Collider w low poly jest fajny
Niektórzy autorzy paczek oprócz tworzenia modeli robią również siatki dzięki czemu nie musimy męczyć się z tworzeniem collidera a użyć jedynie "Mesh Collider". Czy jest to obciążające? W sumie to nie bo przypisujemy ten collider do obiektów, które nie zmieniają swojego położenia. Dodatkowo modele low poly są tak wykonane aby ich siatki składały się z mniejszych wielokątów, które nie są "obliczeniowo skomplikowane" do kalkulacji.
(10) - Unikaj tzw. Z-Fightingu
Z-Fighting to sytuacja gdy obiekty o różnych teksturach zahaczają o siebie (w praktyce tutaj na początku filmiku jest pokazana ta sytuacja). Gdy pojawi się ten problem to obiekty zaczynają walczyć o dominację co ma być renderowane. Widać to bardzo jeżeli kamera się przemieszcza. Jeżeli jest w miejscu to po prostu widzimy trochę jednej tekstury a trochę drugiej. Najprostszym rozwiązaniem jest rozmieszczenia obiektów w taki sposób aby nie było braków ale też żeby te obiekty "nie wchodziły na siebie".
(11) - Rozciąganie obiektów (na ogół) jest złe
Nie wszystkich. Wyobraź sobie np. teksturę drogi. Jeżeli ma ona jednolity kolor i jest bez żadnych "dodatków" to rozciąganie nie wpływa na jakość tekstury. Widoczne jest to natomiast w sytuacji gdy nasza tekstura ma więcej elementów (jest bardziej szczegółowa). Jeżeli będziemy ją rozciągać bardziej w jednym kierunku to zauważymy utratę jakości na teksturze, którą posiada (popatrz na środkowy przypadek na zdjęciu umieszczonym poniżej). Rozwiązania na to są dwa. Jedno - skorzystanie z proporcjonalnego skalowania (z białego kwadracika na zdjęciu najbardziej wysuniętym na prawo poniżej) ale to nam nie pomoże jeżeli chcemy np. położyć chodnik bo będzie za duży i dziwny. Warto to stosować gdy chcesz zrobić większe/mniejsze drzewo, źdźbło trawy itd.. Drugie rozwiązanie - ustalasz sobie rozmiar obiektu a następnie duplikujesz go i kładziesz takie samo obok. Uzyskasz w ten sposób fajny, równy chodnik i unikniesz utraty jakości tekstur.
Zdjęcie
![image](https://user-images.githubusercontent.com/25982919/64918857-3e385b80-d7a4-11e9-9ee6-ccf419f0ab07.png)
(12) - Kopiowanie między scenami to też opcja
Każdy kto skorzystał z Unity pewnie zastanawiał się nad tym czy można np. skopiować fajny obiekt z jednej sceny i wrzucić do drugiej bo przykładowo jest tam w dobrych proporcjach, ma wszystkie skrypty, ma zamodelowany collider i nie trzeba będzie tego wszystkiego kłaść na nowo... Tak można i warto wiedzieć że jest taka możliwość. Pewnie w tym momencie pomyślisz - a czemu by nie zrobić prefaba? No można by ale jeżeli ten obiekt użyjemy po jednym razie 3 scenach to czy jest to aż takie super efektywne? Nie powiedziałbym. W dodatku mnie np. irytuje jak z takiego prefaba potem nie mogę usuwać części bo rozpadnie się prefab albo jak usune komponent to zostaje o tym informacja removed...
(13) - Czasami idealne to też przesada... 🆕
Zdarza się, że próbujemy wszystkie obiekty wręcz idealnie umiejscowić aby uniknąć problemu z-fightingu, aby wszystko było równiutko i symetrycznie jednak może okazać się, że nasza praca jest nadmiarowa. Należy brać pod uwagę ile będzie widział użytkownik. Na czym może skupić wzrok itd. Musimy też przewidywać problemy i weryfikować czy efekt pracy nie będzie powodował złych wrażeń. Decyzja czy jakiś element powinien byc wykonany bardzo precyzyjnie czy w przybliżeniu należy do wykonawcy. Najlepiej postawić się w postaci gracza i wtedy rozważyć za i przeciw.
Sekcja - AI
(1) - Czym jest navMesh?
navMesh albo inaczej navigation Mesh to struktura, która jest wykorzystywana w Unity do tego aby zaprojektować poruszanie się NPC / obiektów otoczenia np. zwierząt itd.. Zawiera w sobie informacje o tym, które pola są do przejścia a, które nie (jeżeli takowe dodamy). NavMeshAgent to komponent, który wykorzystuje navMesh. Obiekt, który ma ten komponent musi mieć umieszczony collider tak aby był na siatce navMesh. Mając taki komponent navMeshAgent możemy w skrypcie go wrzucić jako zmienną i potem skorzystać z wbudowanej funkcji - SetDirection - pozwalającej na rozkazanie przemieszczenia się do nowego celu. Droga którą musi przebyć obiekt posiadający te cechy zostanie wyliczona na podstawie wbudowanego algorytmu A*.
(2) - Jak przygotować navMesh (Sposób 1 - preferowany)
- Tworzymy z jakiegoś prefaba pewien obszar.
- Oznaczamy go jako static.
- Przechodzimy do Navigation.
- Naciskamy przycisk "Bake".
- Utworzy się nam siatka z kwadratów.
- navMesh jest przygotowany.
- Prefab możemy wyłączyć aby nam nie przeszkadzał (siatka została zapisana).
Uwaga obszary, w których nie powinien stawać np. dom robimy tak, że oznaczamy, że jest jako "Not-walkable". Jeżelli wybierzemy obiekty to będzie to dostępne w sekcji Navigation. Alternatywnie możemy stworzyć odpowiednio przygotowany obszar poruszania.
Tutaj jest pokazane jak zrobić obszar "nie do przejścia" LINK
(3) - Jak przygotować navMesh (Sposób 2)
- Wybieramy teren po którym może poruszać się NPC.
- Oznaczamy jako static.
- Przechodzimy do Navigation.
- Naciskamy przycisk "Bake".
- Utworzy się nam siatka z kwadratów.
- navMesh jest przygotowany.
(4) - Jak sprawić żeby postać sobie chodziła po navMesh?
- Do postaci doczepiamy skrypt MoveRandomly*
- Konfigurujemy skrypt MoveRandomly *
- Ustawiamy ten "collider", który powstał przez navMeshAgent na siatce navMesh.
- Włączamy.
- Obserwujemy jak postać się porusza.
*MoveRandomly to skrypt, który posiada losowanie (w przypadku gry top-down view) pozycji X,Z a potem wykorzystanie funkcji .SetDirection() która jest umiejscowiona w komponencie NavMeshAgent. Taki skrypt wystarczy gdy postać cały czas się porusza ale jeżeli chcemy zrobić istotę która raz chodzi a raz się zatrzymuje w danym obszarze to należałoby stworzyć modyfikację tego skryptu np. MoveRandomlyNPC
Sekcja - Lokalizacja elementów w projekcie
Należy pamiętać, że jeżeli zgrywamy dodatkowy model lub paczke żeby umieścić link do paczki, którą się pobrało w pliku tekstowym wykorzystane.txt
(1) - Gdzie mogę umieścić obiekty, które są do level designu?
Katalog Lvl Obj jest do przechowywania wszystkich modelów.
(2) - Gdzie mogę umieścić materiał który chce stworzyć?
--> Materials
(3) - Gdzie mogę umieścić grafiki?
--> Useful images :)
(4) - Gdzie mogę umieścić podkłady muzyki do plansz?
--> Soundtracks
Sekcja - Skróty klawiszowe
(1) - Skróty klawiszowe - PPM i ŚPM uwielbiają Unity
Prawy przycisk myszy (PPM) i środkowy przycisk myszy (ŚPM) to dwa najważniejsze przyciski przy tworzeniu poziomu. Będąc na ekranie sceny PPM pozwala na szybkie przesunięcie widoku nie zmieniając położenia. ŚPM pozwala w scenie na szybkie przemieszczanie w danej osi.
(2) -F (FFFF ! )
Jeżeli chcemy żeby przy zmiane położenia obiektu nasz ekran również się przesuwał możemy kliknąć na obiekt, trzymać przycisk F i przesuwać. Ekran sceny będzie podążać za obiektem.
(3) - Przybornik najważniejszych narzędzi jest pod QWERTY
![image](https://user-images.githubusercontent.com/25982919/63716542-8cfa7180-c846-11e9-8232-c06ff5c53df9.png)
Za pomocą przycisków Q,W,E,R,T,Y możemy szybko zmieniać obecne narzędzie. Łatwo zapamiętać.
(4) - Skalowanie proporcjonalne
Jeżeli chcemy jakiś obiekt rozciągnąć proporcjonalnie to możemy mająć odpowiednie narzędzie przytrzymać przycisk "Shift" i rozciągać bądź skurczyć - wtedy proporcjonalnie będzie zmniejszany obiekt.
(5) - Ctrl + P
Kombinacja Ctrl + P odpowiada za uruchomienie bieżącej sceny
(6) - Ctrl + D
Szczególnie użyteczne gdy kreujemy poziom. Spójrz na przykład poniżej to zobaczysz dlaczego
Przykład:
Jeżeli dodajemy do mapy kawałki trawy w sposób - przeciągam prefab na scene, skaluje, obracam, pozycjonuje to przy założeniu że zajmuje to 20 sekund a trawy musimy posadzić z 30 obiektów to zajmuje nam to 600 sekund ~ 10 minut. Gdy pomyślimy o tym, że do mapy dodajemy też drzewa, ogrodzenie, kamienie i inne obiekty to widzimy jak ten czas masakrycznie wzrasta.
Gdy natomiast korzystamy z dobroci Ctrl + D to zwróćmy uwagę, że obiekt jest już zeskalowany do akceptowalnej formy, jedyne co robimy to go przesuwamy. Możemy też go szybko obrócić lub zmienić ciut rozmiar za pomocą narzędzia pod skrótem klawiszowym Y. Podczas gdy umieszczenie pierwszego obiektu zgodnie z celem zajmuje nam 20 sekund to rozmieszczenie pozostałych 30 obiektów zajmuje nam max 10 sekund. Czyli w najgorszym przypadku redukujemy czas pracy o 5 minut! A możemy ten czas 10 sekund zredukować nawet do 5 osiągając piękny wynik 2,5 minut na 30 obiektów.
Diametralna różnica, prawda? 👍
(7) - Snapping - love czy nie love?
Gdy chcemy umieścić nasze np. podłoże równiutko pod względem wysokości, aby żaden obiekt w siebie nie wchodził i nie było przerw możemy to zrobić na kilka sposobów.
Pierwszy - jeżeli przestrzegamy siatki, którą widzimy na scenie (o ile jej nie wyłączyłeś) to możemy umieszczać według siatki (tzw. snapping). Jest to wygodne ponieważ sami możemy ustalić "krok" co ile ma się przemieszczać obiekt podczas snappingu i w ten sposób unikniemy problemów związanych z "dziurami" między np. podłogą, nakładających się na siebie obiektów czy też problemu z utrzymaniem równej wysokości.
Drugi - obserwujemy współrzędne. Jeżeli chcemy w równej odległości mieć obiekty to możemy sobie przeliczyć współrzędna dodając wartość, która ma dzielić obiekty. Jeżeli zależy nam na wysokości to po prostu kopiujemy wartość do kolejnych obiektów itd. Trochę bardziej czasochłonny sposób niż snapping :)
Domyślnie jeżeli mamy włączone narzędzie W to trzymanie przycisku CTRL aktywuje tryb snappingu.
Wiem, że przy obracaniu dziala ale przy przemieszczaniu po osiach nie sprawdzałem ;P
*Przy skalowaniu również można stosować snapping
(8) - CTRL+Z i CTRL+Y
Zdarza się, że możemy źle przemieścić obiekt albo dać na niego zły materiał. Z pomocą przychodzą dwa skróty. Pierwszy - CTRL+Z pozwala cofnąć się o jeden krok do tyłu. Czasami też zdarza się, że po cofnięciu patrzymy na obiekt i mówimy - eeeee, jednak było lepiej wtedy gdy był tamten uprzedni materiał. Wtedy korzystamy z CTRL+Y co powoduje o pójście jeden krok do przodu.
(9) - Strzałki nawigacji ⬆️ ⬇️ ➡️ ⬅️
Jeżeli robimy jakiś projekt w Unity to na 90% hierarchia będzie składała się z dużej liczby obiektów. Nie będziemy bawić się w pakowanie non-stop w obiekty elementów. Co za tym idzie jak np. wybierzemy jakiś obiekt na scenie to w hierarchii również się on nam pokaże. Żeby nie musieć robić tzw. scrollowania aby zwinąć katalog albo zobaczyć w jakim znajduje sie wybrany obiekt możemy użyć strzałek lewo/prawo żeby cofnąć się do poprzedniego katalogu lub przejść do kolejnego. Możemy też użyć strzałek góra/dół aby chodzić po obiektach w hierarchii.
(10) - 2x LPM na obiekcie w hierarchii
Kliknięcie dwa razy LPM (lewy przycisk myszy) na obiekcie z hierarchii spowoduje przemieszczenie kamery sceny do niego
(11) - 2x LPM na obiekcie na scenie
Jeżeli obiekt który klikniesz 2x LPM na scenie ma rozleglejszą hierarchię to w ten sposób szybko dostaniesz się do elementów "bardziej zagnieżdżonych"
(12) - PPM na komponencie ratuje życie 🆕
Jeżeli chcesz kopiować jakiś komponent X razy to nie próbuj na siłę rozwijać tej zębatki bo na 99% przez przypadek wybierzesz Edit Script jeżeli chcesz kopiować skrypt :) i wtedy Visual studio denerwuje na pierwszym planie. Lepiej jest na nazwie komponentu w inspektorze nacisnąć prawy myszy i ukażą się te same polecenia co w przypadku rozwinięcia zębatki. Ratuje mase czasu :)
Sekcja - Unity setup
(1) - Dobre ułożenie panelu
Ułożenie sobie narzędzi w wygodny sposób to też sposób na zwiększenie efektywności pracy, mój układ:
![image](https://user-images.githubusercontent.com/25982919/63716325-ffb71d00-c845-11e9-8b71-575af9176ca3.png)
Taki układ ma sens w przypadku gdy korzystamy z jednego ekranu. Gdy do dyspozycji mamy np. dwa ekrany - monitora i laptopa to można pomyśleć o lepszej organizacji Unity ;)
Sekcja - Audio
(1) - Jakość utworów
Jeżeli wrzucasz jakieś audio czy to soundtracki czy efekty to warto mieć na uwadze to, że w przypadku Unity wystarczy "quality" na wartości 70 a load type powinien być ustawiony na "streaming". Przy wartości 70 muzyka jest ok i waży mniej :) Doczytałem się o tym w artykule, który przy projekcie Last Human pomógł mi rozdzielić dźwięki na 3 kanały - Master (ogólny), SFX (efekty) i Soundtrack (podkład muzyczny)