Giter Site home page Giter Site logo

trolit / projectzero Goto Github PK

View Code? Open in Web Editor NEW
39.0 3.0 12.0 721.43 MB

Full game, open source project in Unity 3D engine(100+ scripts, about 6000 sloc, rich documentation available in polish and english)

Home Page: https://www.youtube.com/watch?v=UtQ0g11_Juc

License: MIT License

C# 72.22% ShaderLab 25.12% HLSL 2.66%
unity unity3d study-project engineering-work uwm game-project csharp full-game educational-rpg-game unity2018

projectzero's Introduction

projectzero's People

Contributors

gradampl avatar trolit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

projectzero's Issues

Zapis minigier

Wdrożenie zapisu ukończonych minigier za pomocą SaveMinigameStatus

Zapis powinien być dokonywany TYLKO i wyłącznie po wciśnięciu przez gracza przycisku powrotu na mapę

(Adam) Materiały i szczegóły

Propozycje do implementacji w projekcie dla @gradampl .

Uwaga

Polecam otwierać linki środkowym przyciskiem myszy albo prawym myszy i wybrać otwórz w nowej karcie

Propozycja 0 - Modele

Imperium Myszy - kraina JavaScript
Imperium Grzybów - kraina PHP
Domek do "imperium" muchomorów??

rycerz (dla mnie @trolit ): https://quaternius.itch.io/lowpoly-animated-knight

Propozycja 1 - Prefab sklepu

Kliknij mnie

Taki sklep umieściłbyś w każdym z terenów. Np. Sklep z książkami C# , oddzielny sklep z książkami Java itd..

Propozycja 2 - Minimapa

Kliknij mnie

Propozycja 4 - Schemat mapy

Mapę mógłbyś podzielić na "sekcje" przypisane do poszczególnych języków programowania żeby było ciekawiej :). Postaram się znaleźć jakieś "paczki" bo i tak będę musiał z nich korzystać do level-designu minigierek. No i z danego języka minigierki by miały dany motyw. Patrz np. puzzle C# co wysłałem filmik - teren zalesiony wiosna pasi 👍

Podział na motywy:

  • C# - teren zalesiony (wiosna)
  • Java - teren pustynny
  • HTML - teren górzysty
  • Javascript - teren zimowy
  • PHP - teren zalesiony (jesień)

No i gdybyśmy się spojrzeli z góry to by było tak:
image

Uwaga: Ziemia niczyja to po trochu z każdego "motywu" z którym sąsiaduje!

Propozycja 5 - Minigra wieżowiec

(wpadłem na ten pomysł 31-07-2019 22:30)

Tu masz paintowy koncept :)
image

Po krótce jak ma działać minigra quiz:
Na samym dole znajduje się "blok" na który jak spadnie postać to spowoduje odpalenie ekranu z informacją że minigierka została ukończona. Aby do niego się dostać bohater musi odpowiedzieć na pytania. Jeżeli wybrana zostanie zła odpowiedź to dana sekcja nie znika i pozostaje do momentu aż gracz wybierze poprawną odpowiedź. W momencie udzielenia prawidłowej odpowiedzi dana sekcja z pytaniem znika i gracz spada na "niższy poziom" wieżowca. W momencie wygranej gracz otrzymuje informację ile razy się pomylił. Przykładowo: 10 razy źle wybrał odpowiedź w 5 pytaniach to jak miał otrzymać za wygraną 250 pieniążków to zostanie mu potrącone 10 x 10 = 100 pieniążków. Kwota potrącenia do ustalenia - w przykładzie 10 potrącenia.

I teraz tak - obiekt z jednym pytaniem mógłby wyglądać tak:
Question1
---------Question1_desc
------------Text
------------Block
---------Question1_answ1
------------Text
------------Block
---------Question1_answ2
------------Text
------------Block

Gdzie Block to "klocek" a "Text" to treść umieszczona na nim (za pomocą np. TextMeshPro)

Zrzuty ekranów minigier (PinPin / Labirynt / Puzzle )

Tutaj umieszczę screeny(zrzuty ekranu) z przygotowanych przeze mnie scen minigier do wglądu w razie potrzeby dokumentacji aktualnego stanu albo przyda się @gradampl do inspiracji podczas designu poziomów minigry wieżowiec. Będę starał się złapać cały kadr chociaż nie będzie to możliwe w niektórych wypadkach. Zdjęcie będzie z widoku "Scene" w trakcie uruchomionej sceny w środowisku Unity.

Data wykonania zrzutów ekranu: 05-10-2019

Minigra Puzzle

Scena C# HTML PHP Java JavaScript
PinPin 1 image image image image image
PinPin 2 image image image image image

Minigra Labirynt

Scena C# HTML PHP Java JavaScript
Maze 1 image **1 image image image image
Maze 2 image image image image image

**1 - poziom jest "nocny" - nic nie widać normalnie, jednak na potrzeby zrzutu ekranu uruchomione zostało "światło testowe" żeby móc cokolwiek zobaczyć

Minigra PinPin

Scena C# HTML PHP Java JavaScript
Puzzle 1 image image image image image
Puzzle 2 image image image image image

Wycena książek

Klucz książki Tytuł książki Treść książki Cena sugerowana
C#01 Podstawy C# Wczytywanie danych (pobranych od użytkownika) w aplikacji konsolowej 324
C#02 Seesharp od tak Interfejsy 350
C#03 Pamiętnik Deva C# Zasada Open/Closed (pierwsza zasada SOLID) 390
C#04 Z C# na ty Praca z plikami 400
J01 Java tu i tam Klasy i obiekty w języku Java 357
J02 Podręcznik Java Składnia języka Java 295
J03 Java, o tak! Metody w języku Java 220
J04 Java i już Konstruktory 260
JS01 JS czy nie JS Funkcje w języku JavaScript 309
JS02 Podstawy JS Instrukcje w JavaScript 276
JS03 JS a cieszy Walidacja danych w formularzu HTML przy pomocy funkcji JavaScript 318
JS04 Ciekawie o JS Jak, za pomocą metod JS, dostać się do elementów HTML i je zmieniać 380
HTML01 Podstawy HTML Co to jest HTML, podstawowa budowa dokumentu HTML 245
HTML02 Poznaj sekrety HTML Jak w dokumencie HTML dołączyć link, a jak obrazek 276
HTML03 Z HTML przez świat Formatowanie tekstu w HTML 268
HTML04 Twarzą w twarz z HTML Tworzenie tabeli w HTML 240
PHP01 No to PHP Osadzanie skryptów PHP w dokumentach HTML 298
PHP02 ElePHPant Obsługa formularzy HTML w języku PHP 401
PHP03 PEHAPE Walidacja danych w formularzach 308
PHP04 Podstawy PHP Zmienne w języku PHP 233

C# - do przejścia
JS - do przejścia
Java - do przejścia
PHP - do przejscia
HTML - do przejscia

Minigra wieżowiec

Oczekiwania

  1. mechanika na zasadzie opisanej w materiałach implementacyjnych (tutaj: #3)
  2. jeżeli znajdujemy się na danym poziomie/etapie to jak wybierzemy złe pytanie to pojawia się "czerwone" obramowanie wokoło tego pytania i gracz ponownie może wybrać z pozostałych. W przypadku poprawnego pytania przechodzimy do kolejnego etapu.
  3. Ustalenie ilości potrącenia monet za każdą niepoprawną odpowiedź
  4. OnCollisionEnter, OnCollisionUpdate (może być ten trigger ew. - jak wolisz)
  5. W podsumowaniach umieszczone odpowiedzi na to dlaczego taka odpowiedź była prawidłowa a nie inna w krótkiej formie i zrozumiale :)
    Przykładowe działanie na jednym etapie
    image

Pierwszy poziom minigry wymaga wykonania mechaniki

Każdy poziom minigry to

  1. Dodanie unikalnej muzyki
  2. Design poziomu
  3. Przygotowanie zagadek
  4. Przygotowanie podsumowania na podstawie zagadek
  5. Korekta zawartości wstępnej informacji

Materiały fizyczne

**[Jeżeli zostanie czasu] @gradampl **

Przygotować jakiś materiał physX, który podepnie się pod np. "murek" i gracz zamiast "przyklejać" się do murku trochę zostanie odbity?

Pomyśleć ew. o innych w trakcie korygowania/podrasowywania scen minigier i mapy !

Raczej nie zdąży się tego zaimplementować. Narazie zostanie zamknięte @gradampl

Konsola deweloperska

Konsola ułatwiająca testowanie aplikacji (jej poszczególnych elementów) po zbuildowaniu zamiast kombinacji w stylu input/button?

  • przejście do sceny
  • ustawienie wartości klucza
  • uzyskanie wartości klucza
  • sprawdzenie czy ma się wybrany model postaci
  • uzyskanie listy komend lub z parametrem szczegółów na temat danej komendy

❌ doczepienie Debug.logów do niej?

--Aktualizacja: wywołanie konsoli planowane jest tylko na ekranie "menu gry" więc w sumie doczepianie Debug.logów wydaje się do niej zbędne (za dużo tam się nie "za-loguje").

STATUS: ZREALIZOWANE

Nagrody za medale

Dodanie ekstra zawartości do kupienia w sklepach

Prop1) Adres do głównej strony na podstawie której były tworzone kody i którą warto znać ;)
Prop2) Dodatkowa grywalna postać do gry
??

AKTUALIZACJA

Zamiast dodawać kolejne rzeczy do sklepu będzie sekcja "Nagrody". Odblokować je będzie można za zdobyte medale .

STATUS: Wykonane

Porządki hierarchii scen

Zadanie polega na zoptymalizowaniu porządków obiektów w hierarchii tam gdzie to konieczne. Dobrze by było jakby sceny danego typu minigry miał podobny schemat.

Zadanie to powinno być wykonane pod koniec projektu jeżeli starczy czasu.

Rozszerzenie skryptu MoveRandomly3

Rozszerzenie na zasadzie że zamiast jednego efektu dźwiękowego przekazać można listę dźwięków i efekt dźwiękowy jest uruchamiany losowo

STATUS: ZREALIZOWANE

Interaktywny NPC, poruszająca się istota (Nieaktualny szkic)

NPC z którym możemy wejść w interakcję

Co należy przygotować?

  1. kontroler postaci z animacjami
    a) jeżeli postać będzie się poruszać / zatrzymywać to posiada dwie animacje - bezczynności i ruchu
    b) jeżeli postać będzie wykonywać określoną czynność np. wskazywanie palcem albo cięcie pnia to jedna animacja

  2. grafika która będzie się unosić nad głowami NPCów informująca o tym, że można wejść w interakcję z tą istotą. Przykład. Należy pamiętać, że musi to być albo twór własny albo grafika na licencji Public License albo CC

  3. skrypt pozwalający na wysłuchanie co istota ma do powiedzenia
    Skrypt powinien być "przylepialny" do istoty. Na tej istocie powinien być collider, który posłuży do tego aby sprawdzić czy postać jest w obszarze żeby z nią porozmawiać. Jeżeli tak - to po kliknięciu przycisku np. "F" ta istota stoi w miejscu i nad jej głową pojawiają się dymki w których jest tekst. Do tego aby tekst pojawiał się jak pisany na maszynie jest gdzieś gotowy skrypt. Po końcu wypowiedzi pada pytanie - czy gracz chce zagrać w minigre czy nie. Jeżeli tak to sprawdzane jest czy posiada odpowiednią ilość punktów w języku żeby móc zagrać (dobrze by było jakby ta zmienna była widoczna w inspektorze żeby można było ją ustawić - jako scroller/slider między pełnymi wartościami 1 a 9). Jeżeli nie to postać mówi, że gracz nie ma wystarczających umiejętności aby mu/jej pomóc.

    Skrypt powinien mieć listę, którą będzie widać w inspektorze. Ta lista stringów będzie przechowywać fragmenty dialogów które będą po kolei pokazywane. W ten sposób potem będzie łatwiej projektować dialogi innych NPCów. Powinien też móc obsługiwać wciśnięcie przycisku X żeby "przeskipować" - pominąć daną linię dialogu. Gdy NPC mówi powinien być uruchamiany dźwięk rozmowy. Narazie jest tylko jeden - Talk1 ale pewnie przydałoby się poszukać jeszcze jakiś albo ten zmodyfikować żeby nie było że wszyscy mają taki sam głos.

    Przykład jak mógłby wyglądać rezultat: LINK

  4. fragment terenu na którym zbudowany jest navMesh
    Tak jak mówiłem lepiej jest przygotować sobie taki fragment mały żeby nie okazało się nagle że zbudujesz cały teren mapy bo wtedy mógłby pójść nawet do obcej krainy a tego nie chcemy.

  5. postać na scenie do której można dodać 2 rzeczy. Skrypt navMeshAgent oraz skrypt zmodyfikowany pod istoty NPC na podstawie MoveRandomly (polecam stworzyć oddzielny skrypt na podstawie tego MoveRandomly (⚠️ w trakcie projektowania poziomów PinPin przygotowane zostały skrypty MoveRandomly2 oraz MoveRandomly3, wyjaśnienie dostępne jest poniżej) i nadać nazwę np. MoveRandomlyNPC), który pozwoli w odpowiednich momentach uruchamiać odpowiednie animacje - np. bezczynności albo ruchu jeżeli postać ma 2 animacje. W takim skrypcie też w przyszłości można będzie zrobić że jeżeli gracz wejdzie w interakcje z tym NPC to ten NPC odwraca się do niego żeby nie było sytuacji że mówi do niego plecami...

Wyjaśnienie skryptów

  • MoveRandomly - skrypt pod postaci, które tylko wykonują jedną animację ruchu
  • MoveRandomly2 - skrypt pod postaci, które wykonują dwie animacje: bezczynność i ruch
  • MoveRandomly3 - skrypt pod postaci, które wykonują dwie animacje: bezczynność i ruch oraz w przypadku zbliżenia się pod określony obszar protagonisty "wydają dźwięk"

Istota, która porusza się w danym obszarze

Co należy przygotować?

  1. kontroler postaci z animacjami jeżeli postać będzie się poruszać / zatrzymywać to posiada dwie animacje - bezczynności i ruchu

  2. fragment terenu z navMesh

  3. postać ze skryptami navMeshAgent oraz MoveRandomlyNPC umieszczona na zbudowanym navMesh

Istota, która tylko wykonuje jedną animację

Uwaga
Jeżeli postać wykonuje tylko określoną czynnośc np. cięcie pnia albo siedzenie to wystarczy sam kontroler animacji oraz collider żeby gracz nie mógł przenikać tego NPC. Collider trzeba tak ustawić aby gracz nie mógł "przesuwać" istoty - to nie jest pożądane zachowanie.

Problemy z otwieraniem książek

Po wstawieniu okładki próbnej do książki C#01, kiedy otwiera się książki w kolejności: C#01, C#02 (na razie jedyne dwie kupione), pierwsza i druga wyświetla się prawidłowo. Kiedy jednak otwiera się je w kolejności C#02, C#01, to zamiast C#01 otwiera się znowu C#02.

Kompresja projektu

Celem zadania jest weryfikacja jakie elementy projektu zajmują najwięcej pamięci i poddanie ich kompresji w celu redukcji wagi projektu np. tekstury (warto wspomnieć, że muzyka jest już skompresowana)

Zadanie do wykonania raczej pod koniec prac nad grą

Teraz projekt waży 1,6GB , okazało się, że te 3,4GB ważyły skyboxy które zostały wyrzucone.. więc narazie nie ma potrzeby kompresji 👍

Problem z postacią robota na scenie Map

Postać robota na scenie Map jest przyciemniona (i taka była w momencie wrzucenia do mastera zaprojektowanej krainy C# @gradampl), w minigrach jest w porządku. Próbowałem na zasadzie kopiowania właściwości direct lightning sceny mini-gry do sceny Map ale za dużo to nie pomogło.

Gdyby z kolei zwiększyć Intensity - Direct Lightning i przestawiając Lightning Settings w ustawieniach Unity to coś tam idzie jaśniejszą postać uzyskać ale wtedy z kolei budynki są z jednej strony czarne że sprawia wrażenie jakby nic tam nie było :)

Aktualizacja

Niestety mysz z imperium PHP też na to reaguje :< ⛽️

Zabezpieczenie przed ujemną wartością

Zliczanie nagrody np. na minigrach typu maze (labirynt) czy wieżowiec i pinpin należy zabezpieczyć w przypadku gdyby gracz popełnił tak dużo błędów że kwota wyjściowa może osiągnąć wartość ujemną.

Status: ZREALIZOWANE

Kamery prezentacyjne

Dodać we wszystkich scenach kamery prezentacyjne do screenshotów, narazie są w 2 scenach minigier - przed dodawaniem takich kamer zobaczyć jak są nazwane oraz jak aktywować inny ekran poprzez "Display" na scenie Game (o ile dobrze pamiętam obydwie sa na Puzzle_PHP scenach)

Aktualizacja:
Kamery wrzucone do wszystkich 30 przygotowanych minigier. W przypadku gdy dodane zostaną pozosałe 10 minigier typu wieżowiec również i tam zostaną dodane.

(Adam) Unity, Wskazówki

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?

  1. Tworzymy najpierw koncept do którego zalicza się - zakres obszaru, uziemienie
  2. Wypełniamy utworzony koncept prefabami np. drzewa, domy
  3. Dbamy o szczegóły np. trawa, kamyki gdzieś, gdzieś ogrodzenie etc.
  4. Jeżeli konieczne - projektujemy ograniczenia za pomocą Collider

(3) - Idealne narzędzie do level designu 🆙

image
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

(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)

  1. Tworzymy z jakiegoś prefaba pewien obszar.
  2. Oznaczamy go jako static.
  3. Przechodzimy do Navigation.
  4. Naciskamy przycisk "Bake".
  5. Utworzy się nam siatka z kwadratów.
  6. navMesh jest przygotowany.
  7. 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)

  1. Wybieramy teren po którym może poruszać się NPC.
  2. Oznaczamy jako static.
  3. Przechodzimy do Navigation.
  4. Naciskamy przycisk "Bake".
  5. Utworzy się nam siatka z kwadratów.
  6. navMesh jest przygotowany.

(4) - Jak sprawić żeby postać sobie chodziła po navMesh?

  1. Do postaci doczepiamy skrypt MoveRandomly*
  2. Konfigurujemy skrypt MoveRandomly *
  3. Ustawiamy ten "collider", który powstał przez navMeshAgent na siatce navMesh.
  4. Włączamy.
  5. 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
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

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)

Wysokość kamery

Potestować wysokość kamery na wszystkich poziomach i dobrać optymalne wartości

Labirynt
PHP -> 423.39
JS -> 456.5 i 340.43
Java -> 340.43
HTML -> 340.43
C# -> 340.43

PinPin
2575

Puzzle
326.6

Refaktoryzacja VerifySection

Skrypt mógłby brać zamiast jednego obiektu Ground Object - listę obiektów(ObjectsWithCollider), które też mają "collider" i wtedy po stronie kodu przelecieć po liście i poniszczyć / pochować te obiekty. Obecnie collidery w typie gry PinPin są wrzucane na obiekt, który jest "Empty" bo był problem że te obiekty po zetknięciu z colliderem bohatera nie znikały zatem w ten sposób można by to było rozwiązać.

Aktualizacja
Z drugiej strony - wrzucając je pod obiekt który jest obiektem pustym mamy wieksza kontrole nad nimi. Jezeli zrefaktoryzujemy w ten sposób VerifySection to mozna skorzystac z MeshCollider ale potem i tak trzeba bedzie porobic "zabezpieczenia" żeby gracz nie wypadl poza mape celowo badz przez przypadek. Narazie zamknięte bo z tego wyniknie więcej roboty niż pożytku a są inne zadania.

Światło przechodzące przez obiekty z Collider'em

Problemem do rozwiązania jest światło przechodzące przez obiekty które mają Collider. Widać to przykładowo na zimowej scenie typu maze (labirynt). Jedna ze scen języka JavaScript (JS).

Aktualizacja
Zależy od jakości jaką gracz wybierze - dla mnie przy hard shadows nadal jest ten sam problem.

Własna klawiszologia

Wprowadzenie możliwości personalizacji ustawień klawiszów przez gracza

Warto wspomnieć że wiążałoby się to ze zmodyfikowaniem ekranów informacyjnych każdych z minigier

Aktualizacja
Z racji że wiąże się to z dużymi modyfikacjami a czasu nie jest jakoś dużo to narazie pomysł zostanie zepchnięty do zamkniętych. W zależności od postępów będzie można do tego wrócić?

Ulepszenie GUI w minigrze typu labirynt

Opcjonalne ulepszenie GUI polega na zastąpieniu tekstu "zebrane fragmenty" fajną grafiką (ujęciem) bloku, który należy zebrać np. na labiryncie języka C# będzie to "blok" z napisem C#. Dodatkowo dorzucenie do UI informacji o liczbie zebranych bugów (tak samo grafika "bloku") i liczba.

Podział zadań

@gradampl

Lp. Treść zadania Typ zadania Status
1. Pomoc przy wyszukaniu prefabów postaci planowane
2. Opracowanie (level design) krainy C# na scenie Map planowane
3. Minigra wieżowiec (udział w designie 4 scen i tworzeniu mechaniki) planowane
4. Implementacja panelu z książkami + mechanik (z pomocą @trolit) planowane
5. Wprowadzenie zawartości do 20 książek planowane
6. Wycena książek planowane
7. Minigra wieżowiec (wdrożenie zagadek i podsumowań) planowane
8. Przygotowanie kwestii dialogowych każdego z NPC planowane

@trolit

Lp. Treść zadania Typ zadania Status
1. Dokumentacja na github planowane
2. Menu i ustawienia gry planowane
3. Kreator bohatera planowane
4. Szybkie menu pod przyciskiem Escape planowane
5. Panel informacyjny pod przyciskiem I planowane
6. Ekran rozpoczęcia minigry i zakończenia planowane
7. Utworzenie 'customowych' budynków na potrzeby krainy PHP planowane
8. Przygotowanie mixerów (master, music, sfx) planowane
9. Minigra puzzle (10 poziomów i mechanika) planowane
10. Minigra labirynt (10 poziomów i mechanika) planowane
11. Minigra podpięcie (10 poziomów i mechanika) planowane
12. Minigra wieżowiec (design 10 poziomów) planowane
13. Przygotowanie interakcji z NPC planowane
14. Wdrożenie mini-mapy planowane
15. Loading screen gry planowane
16. Dodanie i opracowanie zakładki medale planowane
17. Opracowanie ekranu wczytywania minigry (+mechanika) planowane
18. Opracowanie ekranu uznań (credits) planowane
19. Przygotowanie sklepu z mechaniką na bazie waluty bohatera planowane
20. Przygotowanie zapisów poziomów, stanu gry, wczytywania, resetu stanu gry planowane
21. Korekta wyglądu książek planowane
22. Level design pozostałej części świata na scenie map planowane
23. Sklejenie gry w całość planowane
24. Testy aplikacji i korekty znalezionych bugów dodatkowe
25. Kamery prezentacyjne (#16) dodatkowe
26. Konsola deweloperska (#34) dodatkowe
27. Nagrody za medale (#24) dodatkowe
28. Wdrożenie dodatkowej postaci (rycerza) dodatkowe
29. Implementacja kolorów reprezentacyjnych w minigrach typu puzzle/labirynt/pinpin (#30) dodatkowe
30. Losowanie płomienia PinPin (#31) dodatkowe
31. Kolory pucharów PinPin (#10) dodatkowe
32. Zabezpieczenie przed ujemną wartością PinPin/Maze (#20) dodatkowe
33. Rozszerzenie MoveRandomly3 (#22) dodatkowe
34. Refaktoryzacja skryptów z rodziny MoveRandomly (#25) dodatkowe
35. Liście 2.0 (#39) dodatkowe
36. Wysokość kamery (#11) dodatkowe
37. Dźwięki gry (#18) dodatkowe
38. Rozszerzenie menu pod escape (możliwość edycji ustawień dźwięku) dodatkowe
39. Redesign okna ustawień (przechodząc z menu głównego) dodatkowe
40. Rework skryptu Pickup dodatkowe
41. Ulepszenie GUI na minigrach typu labirynt (#21) dodatkowe
42. Redesign GUI (ikon) na scenie map dodatkowe
43. Rozbudowa okna informacyjnego o postaci (#43) dodatkowe
44. Animowany loading (#45) dodatkowe
45. Zapis i wczytanie współrzędnych istot (#17) dodatkowe
46. Podpowiedzi raz na podejście (#46) dodatkowe
47. Oflagowanie krain (#40) dodatkowe
48. Dodanie mapy do gry pod przyciskiem M (#50) dodatkowe
49. Rozłożenie poziomów/minigier do odblokowania (#49) dodatkowe
50. Rework skryptów dla minigry typu puzzle dodatkowe

Oflagowanie krain

Oflagować wejścia krain zgodnie z barwami reprezentacyjnymi, włącznie z ziemią niczyją żeby było wiadomo w jaką ścieżkę skręcić żeby trafić do danej krainy

Wdrożone

Rozgrywka - szczegóły

Wstępne informacje

  • Książki będą po 4 na język (łącznie 20) .
  • 1 książka = 1 dodatkowy punkt umiejętności
  • Na start mamy do rozdysponowania 5 punktów umiejętności (może zostać ulepszone do wartości 6)
  • Maksymalna liczba punktów per język wynosi 9 (z przekłamaniem na "10" z racji możliwości uzyskania bonusowego punktu)
  • Każdy język programowania ma po 8 poziomów ( po 2 danego typu minigry spośród puzzle, labirynt, pinpin i wieżowiec ).

Odblokowania

Język\Poziom 1 2 3 4 5 6 7 8 9 10
C# X MA2 PI2 PU2 SK2 MA1 PI1 PU1 SK1 X
HTML SK1 MA1 PU1 SK2 PI1 PU2 PI2 MA2 X X
PHP X PI2 MA2 PU1 SK1 PU2 MA1 PI1 SK2 X
JavaScript X MA1 PU1 SK2 PI1 PU2 MA2 SK1 PI2 X
Java X PU1 SK2 PI1 SK1 PU2 MA2 PU1 MA1 X

Legenda
X - oznacza brak odblokowania żadnej z minigier na tym poziomie
(uwaga: nie nadpisywać miejsca X)
MA - poziom typu Maze
PI - poziom typu PinPin
PU - poziom typu Puzzle
SK - poziom typu Skyscraper

Pieniążki

W minigrze labirynt każdy zebrany bug to -20 pieniędzy.
W minigrze wieżowiec każda błędna odpowiedź to -15 pieniędzy.
W minigrze puzzle nie ma kar.
W minigrze pinpin każda błędna odpowiedź to -20 pieniędzy.

Poniżej prezentuje się tabelka ile można zyskać pieniędzy z danego poziomu

Poziom min max
Maze_C#_1 130 250
Maze_C#_2 130 250
Maze_HTML_1 30 250
Maze_HTML_2 70 250
Maze_Java_1 130 250
Maze_Java_2 90 250
Maze_JS_1 70 250
Maze_JS_2 0 250
Maze_PHP_1 0 250
Maze_PHP_2 0 250
Puzzle_C#_1 250 250
Puzzle_C#_2 250 250
Puzzle_HTML_1 100 100
Puzzle_HTML_2 125 125
Puzzle_Java_1 215 215
Puzzle_Java_2 215 215
Puzzle_JS_1 200 200
Puzzle_JS_2 200 200
Puzzle_PHP_1 225 225
Puzzle_PHP_2 200 200
Wszystkie poziomy PinPin 0 250
Wszystkie poziomy Skyscraper 25* 250

*Przy założeniu, że ktoś nie wybierze drugi raz tej samej, błędnej odpowiedzi

Pieniążki - podsumowanie

Z obecnych danych można uzyskać następujące min/max wartości pieniędzy za ukończenie danego "bloku" / języka.

Nazwa języka min max 90% od max
C# 760 1750 1575
HTML 325 1725 1552,5
PHP 425 1925 1732,5
Java 650 1930 1737
JavaScript 470 1900 1710

Wdrożenie zalet i wad postaci

Postaci do wyboru dotychczas to

  1. Królik
  2. Kaktus
  3. Robot

Jeżeli postępy będą szybkie z projektem to rozważmy wdrożenie dodatkowych czynników do postaci i tak

  1. Królik: szybko biega ale wolno przenosi puzzle
  2. Kaktus: wolno chodzi ale szybko przenosi puzzle
  3. Robot: umiarkowanie chodzi i umiarkowanie przenosi puzzle

Aktualizacja
Wydaje się, że dawanie plusów/minusów pod względem prędkości chodzenia byłoby słabe bo najprawdopodobniej nikt by nie wybrał kaktusa gdyby miał przejść ten sam odcinek mapy o minutę dłużej? Narazie pomysł trafia do kosza.

Wdrożenie skyboxów

Dodanie do scen minigier / mapy skyboxów gdzie konieczne lub modyfikacja istniejących

Aktualizacja:
Skyboxy które można było wykorzystać okazały się mocno zajmujące miejsce więc raczej albo w niewielu poziomach będą albo wcale. Za dużo ich nie widać a jedynie wpływają na efekt wizualny co można by rozwiązać Shaderem.

Podpowiedzi raz w podejściu

Dodanie podpowiedzi, które pokażą się wyłącznie jeden raz jeżeli gracz rozpocznie nową grę

Podpowiedź 0 - krótko o grze, co należy robić, co widać na ekranie
Podpowiedź 1 - gdy podejdzie do NPC'a z którym może porozmawiać poinformowanie o tym że można wejść w interakcje z NPC za pomocą danego przycisku
Podpowiedź 2 - co daje sklep
Podpowiedź 3 - gdy nie ma żadnych aktywnych zadań
Podpowiedź 4 - gdy gracz ukończy wszystkie 8 poziomów z danego jezyka

WDROŻONE

Refaktoryzacja skryptów z serii MoveRandomly

Zobaczyć czy czegoś się nie da uwspólnić i wywalić do np. klasy abstrakcyjnej

Refaktoryzacja przeprowadzona została w następujący sposób:
image

Uwaga
Okazało się, że MoveRandomly2 nie jest potrzebne ale z racji, że jest implementowana na scenach minigier to narazie zostaje w projekcie. (BYĆ MOŻE) Jako oddzielny issue zostanie zrobione wdrożenie MoveRandomlyAdvanced zamiast MoveRandomly2

Aktualizacja
MoveRandomly2 nie jest już używana w projekcie

Status: ZREALIZOWANE

Bug w ustawieniach

Gdy zapiszemy antyaliasing X4 to jak wrócimy w opcje to pokazuje X8 mimo, że funkcja prawidłowo wchodzi do sytuacji dla X4 i przypisuje wartość 2 aby wyświetlić tekst "X4"

Ujednolicenie dźwięków gry

Znaleźć dobry poziom danych efektów dźwiękowych (czy to jakiś krótki dźwięk czy soundtrack) na scenach minigier / mapy i ustawić taką samą wartość na wszystkich poziomach. W przypadku gdyby optymalna głośność była "za głośna" lub "za cicha" na jakiejś konkretnej scenie dopuszczalne jest ustawienie niestandardowe.

W każdej minigrze jest soundtrack, dodatkowo są efekty dźwiękowe typu dobra odpowiedź, zła odpowiedź, wygrana, dźwięki zwierząt (na jednej scenie?)

Ustawienia
PODKŁAD MUZYCZNY -> 0.12
EFEKTY DŹWIĘKOWE -> 0.05
DŹWIĘK RUCHU -> 0.059

Rozbudowa Details - "I"

Wprowadzenie do informacji bohatera ile poziomów z danej mapy jest aktywnych a ile nieaktywnych 👍 co by było wiadomo ile jeszcze jest do przejścia a ile do odblokowania !

Minigra PinPin - modyfikacja kolorów

Status: Wykonane

Na niektórych poziomach typu PinPin potrzebne jest dobranie kolorów pucharów i przycisków

Status: Wykonane

Na pozostałych minigrach - korekta kolorów na podstawie tabelki z kolorami reprezentacyjnymi krain :)

Prezentacje wideo (Some video previews from development)

O czym na czym? (Maze/Puzzle/PinPin)

Informacje o podsumowaniach minigier Maze oraz Puzzle czego dotyczą

Nazwa sceny (poziomu) Co porusza podsumowanie?
Puzzle_C#_1 pętla for, if
Puzzle_C#_2 klasa i konstruktor
Puzzle_HTML_1 schemat HTML
Puzzle_HTML_2 znaczniki ol, ul
Puzzle_Java_1 programowanie obiektowe, implementacja interfejsu
Puzzle_Java_2 pętla while i instrukcja continue
Puzzle_JS_1 kod JS w HTML i brak konieczności podawania typów
Puzzle_JS_2 instrukcja switch i funkcja Date()
Puzzle_PHP_1 znaczniki, if, echo, $, funkcja date("H")
Puzzle_PHP_2 stałe w PHP przy pomocy define
Maze_C#_1 funkcje w programowaniu
Maze_C#_2 programowanie obiektowe, wspomnienie o SOLID i Dependency Injection
Maze_Java_1 Java a C# - podobieństwo
Maze_Java_2 pojęcie tablicy
Maze_JS_1 defincja obiektu
Maze_JS_2 operatory logiczne i różnica między === a ==
Maze_HTML_1 lubię dużo znaczników i wspominka o Bootstrap
Maze_HTML_2 o znacznikach: img src, a href i button
Maze_PHP_1 o array() i wspominka o gotowych funkcjach sortujących
Maze_PHP_2 instrukcja warunkowa - konstrukcje

Informacje o tematyce wyborów w minigrze PinPin

Nazwa sceny (poziomu) Wybór 1 Wybór 2 Wybór 3
PinPin_C#_1 pętla for obiekt/przypisanie szablon funkcji
PinPin_C#_2 klasa konstrukcja interfejsu konwersja do int
PinPin_JS_1 instrukcja if stała includes/contains/strpos
PinPin_JS_2 komentarz jednoliniowy długość łańcucha(string) sortowanie tablicy
PinPin_Java_1 implementacja interfejsu ArrayList dziedziczenie po klasie
PinPin_Java_2 zczytywanie danych od użytkownika klasa abstrakcyjna pętla while
PinPin_HTML_1 lista nienumerowana atrybut class komentowanie
PinPin_HTML_2 odnośnik/odsyłacz znacznik img atrybut style
PinPin_PHP_1 tworzenie funkcji pętla do..while.. sortowanie tablicy
PinPin_PHP_2 definicja zmiennych i czyszczenie ich mądre PHP i konwersja string do daty odczyt, zapis, zamknięcie pliku

Tablice wszystkich kluczy ProjectZero

Jak zapisać?
PlayerPrefs.Set("klucz", <wartość>)

Jak pobrać
PlayerPrefs.Get("klucz")

Dostępne klucze w grze

Klucz Typ danych Przeznaczenie
money int stan konta gracza
newgame int informacja o tym czy gracz rozpoczął nową grę (gdy 1 - TAK)
model int identyfikator modelu, który gracz wybrał przy tworzeniu postaci
name string imie/pseudonim gracza
csharp int liczba punktów w języku C#
html int liczba punktów w języku HTML
php int liczba punktów w języku PHP
java int liczba punktów w języku Java
javascript int liczba punktów w języku JavaScript
c#timesUnique int liczba rozegranych minigier dla języka C#
php#timesUnique int liczba rozegranych minigier dla języka PHP
html#timesUnique int liczba rozegranych minigier dla języka HTML
js#timesUnique int liczba rozegranych minigier dla języka JS
java#timesUnique int liczba rozegranych minigier dla języka Java
medalsUnlocked int liczba zdobytych medali
playerX float ostatnia wartość współrzędnej X postaci gracza
playerZ float ostatnia wartość współrzednej Z postaci gracza
knightHelmet int rodzaj hełmu (0 - 2)
knightShoulders int czy rycerz ma mieć naramienniki (0 - tak, 1 - nie)
devConsole int konsola dewelopera włączona/wyłączona
<kluczSceny>passed int przechowuje informacje czy poziom został rozegrany po raz pierwszy
<LP>npcX int przechowuje położenie X niezależnej istoty o danym id
<LP>npcZ int przechowuje położenie Z niezależnej istoty o danym id
<kluczKsiążki>_isReadFirstTime int przechowuje informacje czy książka została przeczytana pierwszy raz
interactNpcTip int przechowuje informacje czy została odczytana porada interakcji z NPC
startGameTip int przechowuje informacje czy została odczytana porada przy rozpoczęciu nowej gry
bookStoreTip int przechowuje informacje czy została odczytana porada o księgarni
noActiveTasksTip int przechowuje informacje czy została odczytana porada o braku aktywnych zadań
finishOneLandTip int przechowuje informacje czy została odczytana porada o ukończeniu zadań z jednej krainy

Dostępne klucze książek

Uwaga: Klucze książek przechowują wartość 0 lub 1 typu int. Wartość 1 oznacza, że książka została zakupiona przez gracza.

Język Książka 1 Książka 2 Książka 3 Książka 4
C# C#01 C#02 C#03 C#04
HTML HTML01 HTML02 HTML03 HTML04
Java J01 J02 J03 J04
JavaScript JS01 JS02 JS03 JS04
PHP PHP01 PHP02 PHP03 PHP04

Dostępne klucze poziomów

Uwaga: Klucze poziomów przechowują wartość 0 lub 1 typu int. Wartość 1 oznacza, że poziom został ukończony.

Nazwa sceny (poziomu) Klucz
Puzzle_C#_1 PU_C#1
Puzzle_C#_2 PU_C#2
Puzzle_HTML_1 PU_HTML#1
Puzzle_HTML_2 PU_HTML#2
Puzzle_Java_1 PU_Java#1
Puzzle_Java_2 PU_Java#2
Puzzle_JS_1 PU_JS#1
Puzzle_JS_2 PU_JS#2
Puzzle_PHP_1 PU_PHP#1
Puzzle_PHP_2 PU_PHP#2
PinPin_C#_1 PI_C#1
PinPin_C#_2 PI_C#2
PinPin_HTML_1 PI_HTML#1
PinPin_HTML_2 PI_HTML#2
PinPin_Java_1 PI_Java#1
PinPin_Java_2 PI_Java#2
PinPin_JS_1 PI_JS#1
PinPin_JS_2 PI_JS#2
PinPin_PHP_1 PI_PHP#1
PinPin_PHP_2 PI_PHP#2
Maze_C#_1 MA_C#1
Maze_C#_2 MA_C#2
Maze_HTML_1 MA_HTML#1
Maze_HTML_2 MA_HTML#2
Maze_Java_1 MA_Java#1
Maze_Java_2 MA_Java#2
Maze_JS_1 MA_JS#1
Maze_JS_2 MA_JS#2
Maze_PHP_1 MA_PHP#1
Maze_PHP_2 MA_PHP#2
Skyscraper_C#_1 SK_C#1
Skyscraper_C#_2 SK_C#2
Skyscraper_HTML_1 SK_HTML#1
Skyscraper_HTML_2 SK_HTML#2
Skyscraper_Java_1 SK_Java#1
Skyscraper_Java_2 SK_Java#2
Skyscraper_JS_1 SK_JS#1
Skyscraper_JS_2 SK_JS#2
Skyscraper_PHP_1 SK_PHP#1
Skyscraper_PHP_2 SK_PHP#2

Liście 2.0 (Leafs 2.0)

Przygotowanie skryptu który na trigger przy graczu będzie dawał troche siły (AddForce) liściom że będą się przemieszczać

Coś tam się ruszają :)

Status realizacji: zrealizowane

Odblokowania

Tabela

Język\Poziom 1 2 3 4 5 6 7 8 9 10
C# X MA2 PI2 PU2 SK2 MA1 PI1 PU1 SK1 X
HTML SK1 MA1 PU1 SK2 PI1 PU2 PI2 MA2 X X
PHP X PI2 MA2 PU1 SK1 PU2 MA1 PI1 SK2 X
JavaScript X MA1 PU1 SK2 PI1 PU2 MA2 SK1 PI2 X
Java X PU1 SK2 PI1 SK2 PU2 MA2 PU1 MA1 X

Legenda
X - oznacza brak odblokowania żadnej z minigier na tym poziomie
(uwaga: nie nadpisywać miejsca X)
MA - poziom typu Maze
PI - poziom typu PinPin
PU - poziom typu Puzzle
SK - poziom typu Skyscraper

PS: Treści podsumowań mini-gier typu Puzzle / Maze / PinPin znaleźć można tu: #7

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.