Tworzenie gry 3D dla jedności Androida. Tworzenie gry na Androida. Co to jest projektant gier

Tworzenie gier na urządzenia z systemem Android wymaga podejścia podobnego do tworzenia gier na iOS. Z drugiej strony sprzęt urządzeń z Androidem nie podlega jasnym standardom, co powoduje konieczność rozwiązywania problemów, których nie ma podczas pracy z iOS. Istnieją również różnice między wersjami Unity na Androida i iOS.

Przygotowywanie środowiska programistycznego Androida

Zanim będziesz mógł testować swoje gry na urządzeniu, musisz przygotować swoje środowisko programistyczne. W szczególności pobierz i zainstaluj Android SDK żądanej platformy i dodaj swoje urządzenie do systemu (proces ten jest inny dla Windows i Mac). Jest to szczegółowo opisane w witrynie Android Developers, a także Dodatkowe informacje może być dostarczony przez producenta urządzenia. Ponieważ jest to dość skomplikowany proces, przygotowaliśmy małą instrukcję, która pomoże Ci przygotować wszystko, czego potrzebujesz do rozwoju. Jeśli potrzebujesz więcej informacji, możesz je uzyskać z portalu Android Developer Portal.

Dostęp do funkcji Androida

Unity udostępnia interfejs API umożliwiający dostęp do danych wejściowych i ustawień systemu Android. Dostępne klasy są udokumentowane na stronie Code for Android Assemblies.

Łączenie kodu C, C++ lub Java ze skryptami

Unity umożliwia wywoływanie funkcji napisanych w C/C++ bezpośrednio ze skryptów (funkcje Java można wywoływać pośrednio). Aby dowiedzieć się, jak uzyskać dostęp do funkcji z kodu natywnego z Unity, odwiedź stronę tworzenia wtyczek do systemu Android.

Usuwanie okluzji (obcinanie niewidocznej geometrii)

Unity zapewnia obsługę eliminacji okluzji, co jest bardzo przydatne podczas optymalizacji pod kątem platform mobilnych. Więcej informacji można znaleźć na stronie uboju okluzji.

Dostosowywanie ekranu startowego

Ekran powitalny wyświetlany po uruchomieniu gry można dostosować - zobacz tę stronę, aby uzyskać więcej informacji.

Rozwiązywanie problemów i raportowanie błędów

Istnieje wiele przyczyn awarii lub nieprawidłowej pracy Twojej aplikacji. Nasz przewodnik po rozwiązywaniu problemów specyficznych dla Androida pomoże Ci uporać się z przyczynami błędów w jak najkrótszym czasie. Jeśli po przeczytaniu instrukcji założysz, że problem tkwi w Unity, powinieneś zgłosić błąd. Instrukcje znajdują się na tej stronie.

Czym Unity na Androida różni się od wersji na komputery?

JavaScript z silnym typowaniem

Aby poprawić wydajność w wersji Unity na Androida, dynamiczne pisanie w JavaScript jest zawsze wyłączone (tak jakby #pragma strict były automatycznie stosowane do każdego skryptu). Należy o tym pamiętać, jeśli przenosisz projekt na Androida ze starszych platform i jeśli napotkasz błędy kompilacji, problemu należy szukać przede wszystkim podczas pisania. Takie błędy są zwykle łatwe do pokonania, upewniając się, że typy wszystkich zmiennych są jawnie określone lub rzutowane podczas inicjalizacji.

Podczas gdy Unity Android obsługuje tekstury DXT/PVRTC/ATC, Unity dekompresuje tekstury do formatu RGB(A) w czasie wykonywania, jeśli te metody kompresji nie są obsługiwane na określonym urządzeniu. Może to poważnie wpłynąć na wydajność renderowania GPU, dlatego zaleca się używanie formatu ETC. Jest to de facto standard dla Androida i powinien być obsługiwany przez wszystkie nowoczesne urządzenia. Z drugiej strony, ETC nie obsługuje kanału alfa, a czasami 16-bitowe tekstury RGBA będą najlepszym wyborem pod względem jakości, rozmiaru i szybkości renderowania tam, gdzie potrzebny jest kanał alfa.

Unity 3D będzie niezastąpionym narzędziem dla tych, którzy profesjonalnie podchodzą do zadania tworzenia wysokiej jakości materiału. Aplikacja integruje gotowe modele, skrypty i tekstury, które możesz uzupełnić o własne treści - obrazy, dźwięki i filmy.

Gotowe produkty tworzone w Unity 3D są kompatybilne z prawie wszystkimi popularnymi platformami - od telefony komórkowe a kończąc na telewizorach SMART.

Funkcje programu:

  • silnik uczenia Unity;
  • elastyczny wielofunkcyjny edytor;
  • wysoka prędkość kompilacji;
  • łatwy do nauczenia interfejs;
  • kompatybilność z dużą liczbą platform.

Zasada działania

Aby korzystać z programu, musisz pobrać platformę Unity Hub, a za jej pośrednictwem możesz wypróbować funkcje bezpłatnej wersji Personal. Jest dostępny z wielkościami monetyzacji do 100 tysięcy dolarów rocznie.

Oprócz wersji bezpłatnej możesz subskrybować dwie inne zaawansowane wersje:

Unity Plus (~25 USD miesięcznie) - zapewnia ograniczony dostęp do usługi Customer Success Advisor, zbiera informacje o awariach na urządzeniach użytkowników, monitoruje informacje zwrotne.

Unity Pro (~125 USD miesięcznie) to maksymalna opcja subskrypcji. Zapewnia wsparcie profesjonalnych programistów, pozwala uzyskać priorytetowy dostęp do wsparcia ze strony twórców programu, zawiera ulepszone możliwości monitorowania wydajności i zbierania statystyk.

Budowanie wszystkich działania w grze opiera się na wystarczająco wysokiej jakości fizycznym rdzeniu programu (PhysX), od którego zależy zachowanie modeli. Dzięki możliwości importowania tekstur i obiektów możesz uczynić produkt wyjątkowym lub skorzystać z narzędzi zintegrowanych przez programistę. Ważne jest, aby zrozumieć, że każdy obiekt utworzony w tym konstruktorze to określony zestaw skryptów i zdarzeń, którymi możesz samodzielnie sterować.

Aby profesjonalnie pracować z Unity 3D, potrzebujesz trochę czasu na zapoznanie się z interfejsem i funkcjami aplikacji. Aby to zrobić, możesz znaleźć wiele filmów w Internecie lub odwiedzić specjalistyczne kursy, które odbywają się w wielu dużych miastach.

Należy zauważyć, że do pracy z grafiką 3D potrzebny jest nowoczesny komputer ze sprzętową kartą graficzną.

Plusy:

  • prawie nieograniczona funkcjonalność tworzenia projektów;
  • obsługa grafiki 3D opartej na przeglądarce;
  • kompatybilny z konsole gier i nowoczesne telewizory;
  • duża liczba narzędzi wizualizacyjnych;
  • dostępna jest darmowa wersja.

Minusy:

  • do stworzenia produktu wysokiej jakości potrzebna jest szczególna wiedza;
  • nie ma możliwości bardzo precyzyjnego dostrojenia fizycznego rdzenia programu;
  • nie ma tłumaczenia interfejsu na rosyjski.

Możesz pobrać Unity 3D nie tylko po to, aby przygotować konkurenta do popularnej internetowej zabawki Juggernaut (która jest również rysowana narzędziami bohatera naszej recenzji), ale także do tworzenia eleganckich prezentacji 3D. Niech to potrwa trochę dłużej, ale efekt wow dla publiczności gwarantowany.

Aby zapoznać się z możliwościami platformy wystarczy pobrać Darmowa wersja Jedność 3D. Jeśli potrzebujesz dostępu do kodu źródłowego, spójrz na wersje płatne.

Analogi:

  • edytor gier- Darmowa aplikacja tworzyć gry;
  • Construct 2 to popularny konstruktor gier z prostym interfejsem.
  • Construct 2 to potężny program do tworzenia projektów 2D.

Cześć wszystkim! Nauczywszy się tworzyć gry na tym silniku, chcę Cię tego samego nauczyć. Po pierwsze, potrzebujemy samego Unity3d, dowolnego edytora modeli 3D i prostych ramion wyrastających z ramion.

1. Nauka programu

Na początek polecam zainstalowanie Monodevelop! Rozumiemy, czym jest Unity. Unity to wieloplatformowe środowisko do tworzenia gier. To właśnie ze względu na jego prostotę i zrozumiałość co trzecia osoba przynajmniej raz stworzyła na nim gry.

Rozważ powyższy zrzut ekranu:

  • Scena jest twoją kreatywną piaskownicą.
  • Projekt - tutaj znajdują się wszystkie animacje i modele, dźwięki i tekstury.
  • Aby zainstalować modele na górnym pasku narzędzi, wybierz Zasoby-Importuj nowy zasób. Możesz również skorzystać z opcji Zasoby-Importuj pakiet-Niestandardowy pakiet. W drugim przypadku pakiet musi być w rozszerzeniu .unity.
  • Hierarchia — wszystkie obiekty w scenie. Tam tworzysz rodziców dla obiektu. Po prostu przenieś obiekt do innego w menu hierarchii, a zostanie on dołączony. Rezultatem będzie rodzaj folderu.
  • Pasek narzędzi - lista narzędzi. Tam możesz włączyć tryb 2D, 3D.
  • Inspektor - funkcja obiektu, w której dodajesz animacje, skrypty i nie tylko. Tam możesz użyć narzędzi: przesuń kamerę, przesuń obiekt, rozciągnij, obróć obiekt.


Teraz widzisz w nim menu obiektów, możesz dodać animację, skrypty i wiele więcej.

Myślę, że z tym menu nie będziesz miał problemów.
Kliknij, aby utworzyć dowolny obiekt.

Ogólnie przestudiowaliśmy program, wkrótce będzie można pisać własne gry.

2. Stwórz prostą grę

Najpierw utwórzmy terytorium Create-Terrain. Dodaj trawę i drzewa. Klikając na ziemię po prawej stronie pojawi się okno, wybierz drzewa, trawę.


Twórz również góry i wyboje. Następnie załaduj pakiet kontrolera Characher do projektu. Następnie szukamy w oknie z projektem sterownika Standard assets-Characters i wybieramy widok pierwszoosobowy (kapsuła) lub trzecioosobowy (mechanik).
Jeśli pierwsza osoba, to po prostu połóż ją na ziemi. Jeśli od trzeciego, musisz pobrać animację. Polecam również ustawienie oświetlenia sceny na Create-Directional Light.


Aby dodać muzykę, przeciągnij ją do żądanego elementu.
Gra jest gotowa, ale jak ją skompilować?

Aby to zrobić, przejdź do ustawień File-Build settings-player settings (dla etykiety i nazwy). Wybierz platformę i voila, gotowe. Aby to zrobić, musisz zainstalować Android SDK. Ale tam musisz określić folder z SDK i potrzebujesz nie tylko SDK, ale API pożądanego poziomu (na przykład Android 4.2 ma API 17). Na przykład, aby gra działała w systemie Android 4.0+, musisz zainstalować te interfejsy API.

W następnym artykule opowiem jak skonfigurować kontrolki dla Androida lub iOS i nauczę się samodzielnie pisać skrypty.

Rozwój aplikacje mobilne jest jednym z najbardziej dochodowych zawodów w branży komputerowej. Stworzenie gry na Androida kosztuje setki lub tysiące dolarów, a zysk może sięgać nawet miliona dolarów. W związku z tym wiele osób jest zainteresowanych tworzeniem aplikacji na telefon. W tym artykule dowiesz się, jak stworzyć grę na Androida od podstaw przy użyciu komputera, który silnik i projektant najlepiej wybrać.

Nic udana gra nie mogę się bez niego obejść piękna grafika Dlatego tworzenie designu jest jednym z najważniejszych etapów rozwoju. Projektowanie w systemie operacyjnym Android jest realizowane za pomocą „dokumentu projektowego” lub dokumentu projektowego. Musisz zacząć tworzyć zabawkę od jej szczegółowego badania. Plik zawiera:

  1. Modele obiektowe;
  2. Specyfikacje funkcjonalne;
  3. Zawartość gry;
  4. Interfejs.

Rozważmy każdy z punktów bardziej szczegółowo.

Modele obiektowe

To są informacje o funkcjonalności każdego elementu. Modele obiektów odpowiadają za możliwość kupowania i sprzedawania przedmiotów, a także poprawianie charakterystyki gry postaci.

Specyfikacje funkcjonalne

Opisuje rozgrywkę, główne cechy każdej postaci. Również tutaj znajduje się opis cech przedmiotów w grze - broni, apteczek, zbroi i innych. Zasadniczo specyfikacje funkcjonalne to zasady, według których proces gry. Im lepiej opracujesz tę sekcję, tym łatwiej będzie stworzyć wysokiej jakości grę na Androida.

Zawartość gry

To jest tekstowe wypełnienie gry. Opisuje dialogi postaci i jakie bronie mogą być użyte do zadawania obrażeń, ile zdrowia zabierze trafienie, jakie cechy wzrosną przy korzystaniu z różnego ekwipunku. Zawiera również szczegółowy opis każda sztuka.

Interfejs

Interfejs to sposób interakcji użytkownika z grą. Zawiera przyciski, za pomocą których możesz sterować postacią oraz sekcje menu: na przykład gra, wynik, ustawienia, najlepsi gracze, pomoc. Jeśli nie masz doświadczenia w tworzeniu aplikacji na Androida, przed stworzeniem własnej, pobierz z Play Market i przeanalizuj popularne gry i przenieś najlepsze rozwiązania do swojego projektu.

Silnik gry

Sercem każdej gry jest silnik. Jest to oprogramowanie, które pozwala go rozwijać i uruchamiać. Zawiera całą gamę programów, w tym silnik renderujący, silnik fizyczny, dźwięk, animację i wiele innych. Aby ułatwić proces pisania programów, zewnętrzni programiści tworzą własne silniki gier specjalnie dla aplikacji na Androida.

Każdy z nich oferuje inne funkcje: niektóre są przeznaczone do 3D, inne do 2D, można obsługiwać wiele platform. Istnieje ogromna liczba takich silników, ale jeśli jesteś początkującym, lepiej wybrać jeden z najpopularniejszych, ponieważ będą tam obecne wszystkie niezbędne funkcje.

UDK

Moment dokręcania 2d/3d

Kim jest projektant gier?

Constructor to program, który łączy silnik gry i zintegrowane środowisko programistyczne. Konstruktor udostępnia proces rozwoju osobom, które nie mają umiejętności programistycznych. Niektórzy z projektantów pozwalają tworzyć gry określonego gatunku, inni mają maksymalną funkcjonalność, ale kosztują znacznie więcej pieniędzy. Dla początkującego twórcy aplikacji mobilnych wybór projektanta to jeden z najważniejszych momentów, bo od jej możliwości zależeć będą losy przyszłej aplikacji.

Konstruktor umożliwia tworzenie gier z różnych gatunków na systemy Windows, Android i iOS. Oferuje duży wybór gotowe lokalizacje, obiekty, postacie i projekty dźwiękowe, więc stworzenie pierwszej gry na Androida nie zajmie dużo czasu. Użytkownicy znający języki programowania JS i C++ mogą korzystać z wbudowanego GML. Jedyną wadą jest to, że program nie jest tłumaczony na język rosyjski.

Wniosek

Tworzenie gry na Androida nie jest łatwym, ale bardzo dochodowym biznesem. Jeśli zdecydujesz się stworzyć grę i na niej zarabiać, najpierw wymyśl pomysł. Następnie napisz „dokument projektowy” i zdecyduj się na silnik gry, który może zmaksymalizować jego potencjał. Następnie możesz przejść bezpośrednio do tworzenia aplikacji w konstruktorze.

Wideo

Aby dowiedzieć się więcej o procesie tworzenia gier na Androida, obejrzyj serię filmów poświęconych tej aktywności.

Jak szybko i stosunkowo łatwo stworzyć prostą grę lub aplikację na Androida? Przeczytaj o tym w poniższym artykule, który zajmuje się pracą z silnikiem Unity3D.

Czy grasz w gry komputerowe? Jeśli tak, to na pewno w trakcie przechodzenia kolejnego hitu gry, czasami miałeś myśli typu: „Ale tutaj zrobiłbym to źle!”. Chcesz sam zostać programistą? Następnie proponuję Wam małą, ale bardzo rozrywkową „przygodę” ;)

Co to jest silnik i dlaczego jest potrzebny?

Wcześniej, w czasach pierwszych komputerów gry i programy były tworzone metodą „hardcore”. Oznacza to, że do pełnoprawnego rozwoju wymagany był dość doświadczony programista, który dokładnie zna swój język programowania i potrafi napisać prawie całą grę (w tym grafikę pikselową i efekty specjalne!) w prostym Notatniku. Takich osób było niewiele i były one wysoko cenione (i nadal są cenione)...

Dziś próg wejścia w temat programowania znacznie się obniżył. A ułatwia to nie tylko dostępność literatury i wszelkiego rodzaju materiałów szkoleniowych, ale także coraz bardziej uproszczony proces tworzenia. W dzisiejszych czasach rzadko spotyka się prawdziwych „hardkorowych” ludzi, ponieważ pojawiły się dość wygodne środowiska programistyczne, zwane „silnikami”.

Istotą silnika jest to, że pozwala on zaimportować wszystkie niezbędne obiekty gry w uproszczonym trybie wizualnym, rozmieścić je na wirtualnej scenie i skonfigurować wszystkie ich parametry. Oznacza to, że zadaniem programisty jest tylko poprawne napisanie logiki gry!

Za wygodę pracy trzeba jednak zapłacić lekkim zwiększeniem rozmiaru projektu (czasem nawet kilkukrotnie!) w porównaniu z jego odpowiednikiem, napisanym w stary „hardcore” sposób. To z tego powodu niektórzy programiści nie lubią silników lub próbują pisać własne, w których wykorzystywane są tylko potrzebne im komponenty…

Ale ty i ja jesteśmy dalecy od prawdziwych programistów :) Dlatego stwórzmy prostą grę na Androida opartą na popularnym i potężnym silniku Unity3D.

Rozpoczęcie pracy z projektem w Unity3D

Dlaczego więc zdecydowaliśmy się na Unity3D:

  • możliwość tworzenia pełnoprawnych gier 2D i 3D;
  • możliwość skompilowania gotowej gry na dowolne urządzenie;
  • względna łatwość sterowania silnikiem;
  • dobra rozszerzalność funkcjonalności poprzez podłączenie wtyczek;
  • stosunkowo niewielki rozmiar końcowego montażu gry (w porównaniu do innych silników).

Głównym atutem Unity3D jest oczywiście jego wszechstronność i wieloplatformowość. Ukończona gra(być może z niewielkimi poprawkami) Możesz przenieść na PC (Windows, Linux lub MacOS), Android, PlayStation lub XBox! Aby to zrobić, musimy pobrać tylko sam silnik, który nawiasem mówiąc „waży” więcej niż gigabajt i niezbędne SDK (jeśli planowany jest rozwój platformy mobilne lub konsola). Jeśli chcesz stworzyć grę dla systemu Windows, nie musisz niczego pobierać, ale ponieważ zamierzamy stworzyć grę na Androida, będziemy musieli również pobrać Android SDK (Software Development Kit). Radzę pobrać SDK w archiwum ZIP dla większej wygody pracy z nim.

Po pobraniu wszystkiego możesz rozpakować do dowolnego wygodnego folderu Android SDK, a następnie przystąpić do instalacji samego Unity3D. Jest instalowany jak każdy zwykły program Windows, więc nie powinno być problemów z instalacją. Po instalacji silnik się uruchomi i najpierw musimy stworzyć nowy projekt:

Aby to zrobić, będziemy musieli zamknąć wszystkie okna powitalne i wprowadzające, a następnie wybrać „Nowy projekt” z menu „Plik”. W oknie, które się otworzy (patrz zrzut ekranu powyżej), zostaniemy poproszeni o określenie folderu zapisywania projektu (jego nazwa będzie taka sama jak nazwa projektu), zaimportowanie kilku standardowych zestawów funkcji (nie potrzebujemy ich) i określenie tryb pracy. Wybierz tryb 2D i kliknij przycisk „Utwórz”. Na tym kończy się część przygotowawcza pracy :)

Interfejs silnika i hierarchia projektu

Po utworzeniu projektu zostanie on wczytany do obszaru roboczego Unity3D:

Sam obszar roboczy ma budowę modułową i składa się z kilku zagnieżdżonych okien, które można dowolnie przesuwać. Mam to ustawione w ten sposób (od lewej do prawej i od góry do dołu):

  1. Okno Hierarchia - wyświetla hierarchiczną pozycję aktywnych i nieaktywnych obiektów na scenie. Domyślnie jedynym obiektem znajdującym się bezpośrednio na liście jest kamera główna.
  2. Okno sceny - wyświetla całą scenę gry i znajdujące się na niej obiekty (w tym kamery, dźwięki, tekstury itp.).
  3. Okno inspektora - wyświetla wszystkie właściwości obiektu wybranego w hierarchii lub na scenie oraz umożliwia ich edycję, uzupełnianie lub usuwanie.
  4. Okno gry - wyświetla świat gry widoczny dla kamery i pozwala wybrać rozmiar okna wirtualnego testu gry w pikselach. Umożliwia również aktywację rozszerzenia okna gry w pełnym rozmiarze (Maksymalizuj w Play) oraz włączanie / wyłączanie wyświetlania różnych informacji dla programisty.
  5. Okna projektu i konsoli. Okno projektu służy do poruszania się po zasobach projektu: przesłanych obrazach, dźwiękach, modelach i tak dalej. Również za pomocą tego okna (menu kontekstowego) możesz tworzyć nowe puste obiekty gry różnych typów i skryptów. Okno konsoli służy do wyświetlania komunikatów o błędach (czerwony), ostrzeżeń (żółty) i różnych żądanych przez Ciebie informacji debugowania (szary).
  6. Okno Etykieta zasobów to dolna część okna inspektora, w której wyświetlany jest podgląd obiektu lub pliku wybranego w oknie Projekt.

Oprócz wszystkich powyższych zwróć uwagę na trzy przyciski u góry pośrodku. Pozwalają na rozpoczęcie projektu, zatrzymanie go (czasem przydatne podczas debugowania, aby zobaczyć, co jest robione w Hierarchii, na przykład) i odpowiednio go wyłączyć.

Stworzymy symulator instrumentu muzycznego: indyjskich bębnów ludowych o nazwie „tabla”, dlatego na początek stworzymy w projekcie dwa puste foldery, w których będą przechowywane dźwięki i obrazy. Możesz utworzyć nowy folder, wywołując menu kontekstowe w oknie Nawigatora projektu i wybierając pozycję „Folder” z listy „Utwórz”.

W tym miejscu warto powiedzieć kilka słów o tym, jak te foldery powinny się nazywać. W przypadku prostej gry, takiej jak nasz symulator, foldery można zasadniczo „nazywać” według własnego uznania, jednak istnieją co najmniej dwie nazwy, których lepiej nie używać, ponieważ są one zarezerwowane przez silnik. Są to nazwy Zasoby i Wtyczki. W dużych projektach folder Resources jest tworzony natychmiast, a wszystkie „części zamienne” gry (zdjęcia, dźwięki, modele, tekstury i prefabrykaty) są już w nim przechowywane (posortowane według podfolderów). We wtyczkach, jak sama nazwa wskazuje, przechowywane są wszystkie dodatkowe zestawy funkcji stron trzecich (tak zwane „zasoby” (zasoby)) których jest sporo w Asset Store - sklepie z rozszerzeniami dla Unity3D.

Importowanie plików i tworzenie obiektów gry

Przed utworzeniem nowego projekt gry pożądane jest wcześniejsze przygotowanie wszystkich plików niezbędnych do jego działania. W naszym przypadku są to obrazy i dźwięki. Najłatwiejszym sposobem zaimportowania ich do projektu jest po prostu przeciągnięcie ich i upuszczenie do wybranego folderu. Zacznijmy od zdjęć...

Gdy obrazy pojawią się w naszym folderze Obrazy, należy je nieco poprawić:

Faktem jest, że Unity3D domyślnie kompresuje wszystkie obrazy dodane do projektu z utratą jakości. Jeśli nie potrzebujemy takiego ubytku (szczególnie dotyczy to gier z grafiką HD), to powinniśmy zaznaczyć każdy obraz i w oknie Inspektora zmienić wartość parametru „Format” z „Skompresowany” na „Truecolor” w „Domyślne”. ”. Może być również konieczna zmiana parametru „Maksymalny rozmiar”, jeśli jest on mniejszy niż rzeczywista szerokość obrazu (domyślnie 1024 piksele). Po wszystkich zmianach musisz pamiętać, aby kliknąć przycisk „Zastosuj”, aby je zastosować. W razie potrzeby wykonujemy podobne czynności dla wszystkich pozostałych obrazów.

Teraz stwórzmy obiekty gry z naszych zdjęć. Aby to zrobić, po prostu przeciągnij żądany obraz do okna Hierarchia. Obraz lub model 3D zostanie automatycznie przekształcony w obiekt gry i wyświetlony w początkowym punkcie współrzędnych przed kamerą.

Przede wszystkim dodaliśmy obrazek tła, który powinien być wyświetlany na pełnym ekranie. Możesz sprawdzić, czy tak jest, wybierając kamerę w oknie hierarchii i patrząc na to, jak wyświetlana jest jej ramka. Na powyższym zrzucie ekranu widać, że część naszego tła pozostaje poza widokiem kamery, więc musimy dostosować rozmiar tego widoku, przeciągając klatkę bezpośrednio na scenę lub edytując parametr „Rozmiar” w oknie Inspektora. W naszym przypadku musieliśmy zmienić domyślną wartość (5) na 5.4.

To wszystko, nie dotykamy już aparatu, ale dodajemy i dostosowujemy resztę zdjęć. Dodając, widzimy, że niektóre z nich są za duże dla naszej gry. Możesz je zredukować fizycznie w edytorze graficznym lub za pomocą silnika. Wypróbujmy ostatnią metodę. Aby to zrobić, wybierz obraz w oknie Hierarchia, aw oknie Inspektora zmień wartości „Skala” dla współrzędnych X i Y z 1 na 0,5 (czyli zmniejsz o połowę). W tym samym miejscu, aby uniknąć nakładania się, pożądane jest przypisanie wszystkim obiektom gry (z wyjątkiem tła) niezerowej kolejności warstw (Order in Layer):

Ostatnim krokiem w przygotowaniu obiektów gry z obrazków będą „wiszące” na nich zderzacze. W Unity3D zderzacze są używane jako detektory interakcji między obiektami. Oznacza to, że w rzeczywistości na nasze zdjęcie nakładana jest wirtualna powłoka, która może rejestrować dotyk.

Aby dodać collider do obiektu, zaznacz go w oknie Hierarchia, a następnie kliknij przycisk „Dodaj składnik” w oknie Inspektora. Na wyświetlonej liście komponentów szukamy Physics 2D (zwykła fizyka 3D nie zadziała w naszym trybie) i ze wszystkich opcji najbardziej odpowiednia dla nas jest "Circle Collider 2D". Wybieramy go. Wokół naszego obiektu pojawi się zielony obrys, który wyświetla granice zderzacza. Pozostaje tylko zaznaczyć pole wyboru „Is Trigger”, aby nasz zderzacz rejestrował tylko kliknięcia i nie wchodził już w interakcję z otaczającą przestrzenią gry:

Podobne czynności są powtarzane dla wszystkich pozostałych obiektów. Tylko nasze tło będzie się różnić od innych obiektów. W tym celu zastosujemy Box Collider 2D i ustawimy Position Z na większą od zera, aby wepchnąć collider i samo tło do tła (będziemy tego potrzebować później).

Praca z dźwiękiem

Z dźwiękiem w Unity 3D na pierwszy rzut oka wszystko jest nieco zagmatwane. Ale spróbujmy to rozgryźć w kolejności :)

Przede wszystkim musimy przeciągnąć wszystkie dźwięki do folderu Dźwięki i trochę je poprawić:

Jeśli poziom głośności wszystkich dźwięków jest wstępnie dostosowany, wystarczy wyłączyć przetwarzanie dźwięku 3D. W grach 3D przetwarzanie to jest potrzebne, aby zasymulować zbliżanie się źródła dźwięku, gdy kamera się do niego zbliża. Ale w 2D nie potrzebujemy tego, więc wybieramy każdy dźwięk po kolei i odznaczamy z niego „Dźwięk 3D”.

Teraz możemy zacząć dodawać dźwięki do obiektów w grze. Aby to zrobić, musimy wybrać kolejno każdy przycisk i dodać do niego nowy komponent „Źródło dźwięku” z sekcji „Audio”. Po dodaniu komponentu wybierz odpowiedni przycisk „Klip audio” i odznacz pole wyboru „Odtwarzaj po przebudzeniu” aktywne domyślnie (odtwarzaj, gdy się pojawi):

Kiedy wszystkie dźwięki zostaną dołączone do odpowiednich przycisków, nadszedł czas na zabawną część - pisanie skryptów...

Pierwszy skrypt

Zanim zaczniemy parsować nasz pierwszy skrypt, warto chyba powiedzieć kilka słów o systemie skryptowym w samym Unity 3D.

Unity pozwala na pisanie kodu jednocześnie w trzech językach: JavaScript (a dokładniej jego nieco zmodyfikowana wersja UnityScript), C# i Boo. W wielu książkach i przewodnikach można znaleźć opinię, że dla początkujących pisanie skryptów w Unity jest łatwiejsze do opanowania na przykładzie JavaScript. Jednak ten język nie jest tak wygodny jak inne, a w przyszłości najprawdopodobniej będziesz musiał się uczyć od nowa. Dlatego lepiej zacząć od razu od nauki C# (Boo też jest dobry, ale jest na nim niewiele materiałów szkoleniowych).

Teraz o tym, gdzie napisać kod. Domyślnym edytorem kodu w Unity 3D jest MonoDevelop IDE. Zaletą tego środowiska programistycznego jest to, że zawiera wskazówki dotyczące szybkiego wprowadzania standardowych metod, klas i funkcji, a także system sprawdzania składni. Jednak dla mnie wadą była masywność i duża intensywność zasobów. Na szczęście w ustawieniach Unity można ustawić cokolwiek jako edytor tekstu, więc „zawiesiłem” dla siebie lekkiego i funkcjonalnego Notepad++ (prawie wszystkie przykłady będą w nim pokazane).

I ostatni. Oczywiście bez materiałów referencyjnych w opanowaniu wszystkich zawiłości silnika nie zajdziesz daleko, więc oto lista kilku sensownych zasobów internetowych na temat Unity 3D:

  • http://docs.unity3d.com/ru/current/Manual/UnityManualRestructured.html - oficjalny podręcznik silnika z częściowym tłumaczeniem na język rosyjski (pojawił się niedawno i czasami jest niestabilny);
  • http://docs.unity3d.com/ru/current/ScriptReference/index.html - oficjalny podręcznik obsługi skryptów w języku angielskim;
  • http://unity3d.ru/distribution/index.php - rosyjskie forum dla programistów Unity 3D;
  • http://habrahabr.ru/post/141362/ - seria lekcji na temat tworzenia trójwymiarowych gier na Habrahabr;
  • http://msdn.microsoft.com/ru-ru/library/618ayhy6.aspx — oficjalne odniesienie do języka C# firmy Microsoft w języku rosyjskim.

No cóż, żeby długo tego nie przeciągać, proponuję od razu stworzyć pierwszy skrypt. Pod skryptami, jeśli jest ich dużo, lepiej przydzielić osobny folder, ale nasza gra będzie prosta, więc możemy stworzyć skrypt bezpośrednio w folderze głównym projektu. W tym celu wywołaj menu kontekstowe w oknie Projekt, wybierz listę Utwórz i kliknij „Skrypt C#”. Nazwijmy nasz nowy skrypt, na przykład, Dźwięki i otwórzmy go podwójnym kliknięciem. Po usunięciu standardowych metod Update i Start, a następnie, po zarejestrowaniu niezbędnych, otrzymujemy następujący skrypt:

Jeśli nie przekonfigurowałeś edytora, nasz skrypt otworzy się w MonoDevelop. Przyjrzyjmy się jego strukturze...

W rzeczywistości każdy skrypt C# składa się z trzech głównych części:

  1. Na samej górze znajduje się lista bibliotek, które muszą być połączone, aby skrypt działał (np. „using Unity.Engine” łączy pracę samego silnika, a „using System.Collections” – bibliotekę zawierającą liczbę wbudowanych klas dla skryptu do pracy w różnych systemach).
  2. Deklaracja klas i zmiennych. W C# nie ma koncepcji skryptu jako takiego. Zamiast tego używane jest pojęcie „klasy”, które obejmuje szereg metod i funkcji. Chociaż w rzeczywistości w kontekście Unity 3D jest to prawie to samo :) Najważniejszą rzeczą do zapamiętania jest to, że nazwa klasy musi odpowiadać nazwie, którą nadaliśmy skryptowi. Specyfika zmiennych w C# polega na tym, że muszą (z wyjątkiem zmiennych tymczasowych, które są zadeklarowane w samym skrypcie) być wpisane. W praktyce oznacza to, że dla zmiennej musi być określony poziom dostępu (prywatny lub publiczny) oraz typ (int, float, bool lub jak mamy w skrypcie AudioClip). lub możesz od razu nadać mu wartość przypisaną.
  3. Zestaw metod i funkcji. Metoda w języku C# to prawie każda funkcja, która wykonuje określone akcje. W zasadzie w literaturze dotyczącej Unity 3D nazywa się je funkcjami, ale jeśli mówimy o C# jako o osobnym języku programowania, to są to przecież metody :). Czyste funkcje w Unity to na przykład standardowe funkcje do wyprowadzania dźwięku, rysowania elementów GUI itp., które są używane wewnątrz metod.

Znając teraz strukturę skryptu, łatwo zrozumieć jego znaczenie, które sprowadza się do tego, że... W klasie Dźwięki (skrypt) deklarujemy 9 zmiennych typu AudioClip o nazwach, których potrzebujemy dla wygody ich rozróżnienie. Upubliczniamy je koniecznie (prywatne nie będą wyświetlane w edytorze i będziemy musieli „zawiesić” na nich dźwięki przez edytor). A następnie w ciele skryptu używamy standardowej metody „void OnMouseDown()”. Wcześniej odpowiadał on tylko za przetwarzanie kliknięcia myszą, ale w nowych wersjach interpretowany jest również jako dotknięcie ekranu dotykowego. W nim zapisujemy warunki, według których sprawdzamy nazwy wciśniętych colliderów i jeśli wykryjemy naciśnięcie jednego z nich, wyprowadzamy odpowiedni dźwięk (używamy standardowej funkcji audio.PlayOneShot();).

Podczas pisania kodu uważaj, aby uwzględnić wszystkie nawiasy otwierające i zamykające, w przeciwnym razie będziesz stale otrzymywać raporty o błędach w konsoli i nie będziesz mógł w ogóle uruchomić swojego projektu! Zwróć także uwagę na użycie wielkich liter w nazwach metod i funkcji. Często też są przyczyną błędów. I oczywiście zwróć uwagę na wszystkie znaki (kropki, dwukropki i nawiasy), w skrócie składnię języka. Na początku będzie to trudne, ale z czasem zaczniesz pisać od zera bez błędów!

Gdy skrypt jest gotowy, zaznacz go iw oknie Inspektora przypisz do każdej zmiennej inny dźwięk. Teraz musimy tylko zastosować nasz skrypt do obiektów w scenie. Najłatwiej to zrobić ponownie, przeciągając skrypt bezpośrednio na żądany obiekt gry na liście Hierarchia:

Jeśli skrypt został przeciągnięty poprawnie, powinien pojawić się w oknie Inspektora obok obiektu, na który go przeciągnęliśmy. W związku z tym przeciągamy skrypt do wszystkich obiektów, które powinny brzmieć w grze i możemy spróbować go uruchomić. Kiedy klikniesz nasze przyciski gry, teraz wreszcie zabrzmi określony dźwięk!

Wprowadzenie do GUI

W zasadzie Gra już u nas funkcjonuje, ale jakoś jest zbyt „łysa”. Czegoś w nim brakuje... A przynajmniej napisu z nazwą, który jest przed nami! Innymi słowy, musisz zaimplementować jakiś zrozumiały interfejs użytkownika.

W rzeczywistości GUI to skrót od angielskiego. „Graficzny interfejs użytkownika”, czyli graficzny interfejs użytkownika. Tradycyjnie zawiera takie komponenty jak:

  • guziki;
  • okno;
  • obszary tekstowe;
  • pola wyboru i/lub przyciski radiowe;
  • suwaki (paski przewijania) itp.

W Unity 3D Wszystko to (a nawet coś więcej) jest w pełni obecne. Najważniejsze jest, aby nauczyć się go używać! Przyjrzyjmy się, jak GUI Unity może tworzyć prosty nagłówek.

Aby to zrobić, utwórz nowy skrypt o nazwie Interface i zmodyfikuj go w następujący sposób:

Przyjrzyj się uważnie skryptowi na zrzucie ekranu. Tutaj piszemy tylko jedną publiczną zmienną typu GUIStyle, co jest dla nas nowością. Ten typ pozwala na wizualną zmianę wyglądu elementów, do których przypisany jest ten styl. Style są przydatne, gdy istnieje wiele elementów interfejsu tego samego typu (na przykład przyciski), ale powinny mieć inny wygląd.

Następnie tworzymy przycisk ("GUI.Button"), który ma następującą składnię: warunek - 4 współrzędne (wcięcie poziome od lewej krawędzi, wcięcie pionowe od górnej krawędzi, szerokość, wysokość) - widoczny tekst w cudzysłowie i dalej , opcjonalnie, wskazanie stylu. Niezbędne funkcje są zapisane w stanie przycisku. W naszym przypadku zarejestrowaliśmy przejście na stronę deweloperów ("Application.OpenURL("");").

Skrypty GUI mogą działać na dowolnych obiektach gry, ale zwykle zaleca się „zawiesić” je na kamerze, co zrobimy przeciągając skrypt na obiekt Main Camera. Teraz, jeśli zaznaczymy go w oknie Hierarchii, to w oknie Inspektora będziemy mogli zobaczyć zmienną publiczną naszego stylu, rozszerzając ją uzyskamy pełny dostęp do ustawień tego stylu!

W każdej sytuacji możemy określić kolor tekstu i teksturę tła (dla przycisku należy zarejestrować jego trzy opcje (Normalny - widok normalny, Hover - po najechaniu i Aktywny - po kliknięciu), ustawić padding i dostosować czcionkę. Domyślnie jedyną czcionką dostępną w Unity 3D jest czcionka Arial, jednak możesz ręcznie załadować dowolną inną czcionkę do projektu i zastosować ją w polu „Czcionka”, ustawiając wszystkie powiązane parametry.

Co ciekawe, a jednocześnie niezbyt wygodne, elementy GUI nie wyświetlają się na scenie, dopóki nie rozpoczniemy projektu, więc dostosowanie parametrów każdego elementu może zająć dużo czasu. Uruchommy projekt i zobaczmy, jak będzie wyglądał nasz utworzony powyżej przycisk:

Zmiana interfejsu według warunków i zmiennych statycznych

Dużo już zrobiliśmy, ale zawsze jest miejsce na ulepszenia :) Dlatego proponuję, jako ostatni przykład, stworzenie okna pomocy, za pomocą którego zwykli programiści zazwyczaj dostarczają swoje gry i aplikacje. Aby to zrobić, dodaj zdjęcie takiego przycisku w postaci znaku zapytania do folderu z obrazami i utwórz z niego obiekt gry. Zawieśmy na nim zderzacz i napiszmy skrypt o nazwie np. „Pomoc” o treści:

W tym skrypcie mamy dwie zmienne. Pierwsza zmienna definiuje skórę, która będzie używana dla wszystkich elementów interfejsu opisanych w tej klasie. W przeciwieństwie do stylów, które omówiliśmy powyżej, skórki pozwalają na zmianę wyglądu nie tylko pojedynczego elementu, do którego są przypisane, ale wszystkich elementów określonego typu jednocześnie. Ponadto, w przeciwieństwie do stylów, skórki nie są przypisywane do elementów, ale są deklarowane natychmiast dla całej metody i działają do momentu zadeklarowania innej skórki. Należy również pamiętać, że skórki istnieją nie tylko jako zmienne, ale również jako osobne pliki. Dlatego przed zadeklarowaniem skórki należy ją natychmiast utworzyć w oknie "Projekt" z menu kontekstowego: "Utwórz" - "Skórka GUI".

Druga zmienna, którą mamy, to logiczna (lub inaczej Boolean). Może mieć tylko dwie wartości: „prawda” (prawda) lub „fałsz” (fałsz). Ze względu na swój binarny charakter zmienna taka doskonale nadaje się do implementacji wszelkiego rodzaju przełączników. W naszym przypadku będzie odpowiadał za wyświetlenie tekstu opisującego naszą grę.

Jeśli jednak przyjrzysz się uważnie, zauważysz, że ostatnia zmienna ma jeden wspaniały parametr - „statyczny”. Dodanie tego parametru do zmiennych pozwala na uczynienie ich statycznymi i dostęp do nich z innych skryptów!

Wróćmy jednak do reszty kodu. Znana nam tutaj metoda „void OnMouseDown()” posłuży jako przełącznik zmiennej „isVisible” przy użyciu prostego warunku. Jednak po warunku jest inna funkcja. Ta funkcja ("Debug.Log();") służy do wyprowadzania "w locie" do Konsoli wartości potrzebnych nam zmiennych (wpisujemy je bez cudzysłowów w nawiasach). Jak widać, wewnątrz funkcji można łączyć zarówno niezmienny tekst (zapisany w cudzysłowie) jak i zmienne (bez cudzysłowów). Najważniejsze, że między wszystkimi danymi powinien znajdować się znak „+”.

W dalszej części tekstu skryptu mamy metodę rysowania interfejsu ("void OnGUI()()"), wewnątrz której widzimy deklarację nowej skórki ("GUI.skin = HelpSkin;") oraz nową element interfejsu typu GUI.Box. W przeciwieństwie do przycisku, pudełko jest elementem nieaktywnym i zwykle służy do wyświetlania różnych danych tekstowych lub graficznych.

Zwróć uwagę na to, jak ustawiamy pozycjonowanie pudełka. Tutaj wszystkie wartości nie są określone bezpośrednio, ale za pomocą wyrażeń matematycznych, co w rzeczywistości jest odpowiednikiem „układu płynnego” w tworzeniu stron internetowych. Problem polega na tym, że przy określaniu dokładnych rozmiarów elementów GUI przy różnych rozdzielczościach ekranu, nie będą się one dostosowywać i mogą być albo za małe, albo odwrotnie, duże. W kolejnej wersji silnika programiści obiecują, że GUI będzie adaptacyjny, ale na razie musimy wypaczyć :(

Ostatnim krokiem na drodze do sukcesu będzie personalizacja naszej skóry. Plik skórki określamy w zmiennej skryptu, a następnie wybieramy ten plik w oknie projektu. Podobnie jak w przypadku innych plików, ustawienia skórki zostaną wyświetlone w oknie Inspektora. Tutaj szukamy elementu, który ma ulec zmianie (w naszym przypadku Box), otwieramy go i ustawiamy w taki sam sposób, jak omówiony powyżej styl:

Aby sprawdzić, czy nasz skrypt działa poprawnie, uruchommy projekt i spróbujmy kliknąć przycisk pomocy:

Teraz wszystko działa, ale nie zawsze wygodnie jest nacisnąć przycisk pomocy, aby ukryć opis. Bardziej zwyczajowe jest umieszczanie powiadomień w dowolnym wolne miejsce niż celowanie w przyciski. I tu wystarczy wykorzystać fakt, że zrobiliśmy statyczną zmienną "isVisible" oraz zawieszony na obrazku w tle zderzacz...

Wróćmy do naszego pierwszego skryptu („Dźwięki”), który śledził naciśnięcia przycisków w celu odtwarzania dźwięków. Wystarczy, że napiszemy w nim tylko jedną linijkę (dokładniej wewnątrz metody „void OnMouseDown()”:

if (this.name != "HelpButton")(Help.isVisible = false;)

Za pomocą tej linii ustawiamy warunek: jeśli nazwa wciśniętego collider'a nie jest taka sama jak nazwa przycisku pomocy, to zmienna "isVisible" w skrypcie "Help" będzie równa "false". Tylko konieczne jest, aby zmienna "isVisible" na pewno miała dopisek "static", inaczej dostaniemy błąd.

Teraz, podczas uruchamiania, zobaczymy, że nasze okno pomocy jest zamykane nie tylko po kliknięciu przycisku w prawym górnym rogu, ale także po dotknięciu dowolnej wolnej części ekranu. Jedyne, co można poprawić, to ukryć okno po kliknięciu... To będzie twoja "praca domowa" ;) Mogę tylko powiedzieć, że trzeba będzie zmienić okno GUI na podobnie zaprojektowany przycisk, ponownie , z ustawieniem skóry i przypisaniem funkcji zmieniającej zmienną "isVisible". Wszystko, bądź cicho :)

Kompilowanie gry i zapisywanie projektu

Nareszcie wszystko działa dla nas! Oznacza to, że nadszedł czas, aby zapisać naszą grę i przetestować ją na prawdziwym urządzeniu. W tym celu należy go skompilować do pliku wykonywalnego (w systemie Windows na przykład w EXE, a w systemie Android w APK).

Jeśli chcesz skompilować grę na PC, nie musisz dokonywać żadnych wstępnych ustawień. Jednak w przypadku Androida musisz najpierw podłączyć Android SDK, który pobraliśmy na samym początku. Odbywa się to po prostu: przejdź do menu „Edycja”, wywołaj element „Preferencje” iw oknie, które zostanie otwarte, przejdź do zakładki „Narzędzia zewnętrzne”. Tutaj szukamy wiersza „Lokalizacja SDK Androida” i wskazujemy w nim ścieżkę do rozpakowanego archiwum z SDK (patrz zrzut ekranu poniżej). Nawiasem mówiąc, tutaj możesz również zmienić monstrualny edytor tekstu MonoDevelop aktywny domyślnie na swój ulubiony :)

A teraz nadeszła chwila prawdy! Przejdź do menu „Plik” i poszukaj tam elementu „Ustawienia kompilacji”. W oknie, które się otworzy, będziemy musieli od razu dodać sceny do montażu. Jeśli jest tylko jedna scena (jak w naszym projekcie), to wystarczy kliknąć przycisk „Dodaj bieżącą”. Jeśli jest ich kilka, będziesz musiał otworzyć każdy z nich i dodać je do listy scen w ten sam sposób, a następnie, przeciągając i upuszczając, dostosować ich żądaną kolejność:

Następnym krokiem jest wybranie platformy kompilacji (planujemy grę na Androida, co oznacza, że ​​ją wybieramy) i kliknięcie przycisku „Ustawienia gracza” poniżej. Okno Inspektora otworzy szereg ustawień, z których niektóre są obowiązkowe lub bardzo pożądane. Pożądane jest wskazanie nazwy firmy deweloperskiej, programu i jego ikony (odpowiednio Nazwa firmy, Nazwa produktu i Ikona domyślna) u góry listy ustawień.

Na dole, w sekcji „Inne ustawienia” znajdują się dwa wymagane parametry: „Identyfikator pakietu” i „Wersja pakietu”. Domyślna wersja jest ustawiona na 1.0, ale identyfikator będzie musiał zostać utworzony ręcznie i najlepiej unikalny. Powinien składać się z trzech części oddzielonych od siebie kropkami: zastrzeżonego słowa „com”, następnie nazwy firmy deweloperskiej, a na końcu nazwy samej aplikacji.

Możesz zmienić pozostałe ustawienia montażu według własnego uznania lub nie zmieniać ich wcale. Najważniejsze jest to, że teraz kompilacja będzie już mogła się rozpocząć. Aby to zrobić wystarczy kliknąć przycisk „Buduj” w oknie „Ustawienia kompilacji” i poczekaj, aż program poda nam gotową aplikację spakowaną w pliku APK :)

Wniosek

Na tym kończymy naszą lekcję-przegląd na temat tworzenia najprostszych aplikacji na Androida. Abyś mógł powtórzyć wszystko, o czym rozmawialiśmy, na końcu artykułu podam link do archiwum, które będzie przechowywać wszystkie zasoby gry jako osobny folder (jeśli chcesz zrobić wszystko od zera) i jako plik z rozszerzeniem unitypackage. Ta ostatnia pozwala na jednoczesne zaimportowanie całego projektu do Unity, w tym zależności itp.

Aby zaimportować nasz projekt (i przy okazji wszelkie wtyczki pobrane z Internetu lub Sklepu Zasobów), należy przejść do menu „Zasoby”, wybrać pozycję „Importuj pakiet”, a w nim „Pakiet niestandardowy”, następnie podaj ścieżkę do naszego pliku i naciśnij przycisk „Importuj”. Nawiasem mówiąc, możesz wykonać pełną kopię zapasową swojego projektu, zapisując go w takim pakiecie jednostkowym, z tego samego menu („Zasoby”), klikając element „Eksportuj pakiet”.

Wydaje się, że wszystko :) Jako osoba, która sama opanowała Unity 3D od podstaw, w artykule starałem się odpowiedzieć na maksymalną liczbę pytań i podkreślić główne niuanse pracy z silnikiem, które pojawiają się na początku. Ale być może komuś to nie wystarczy, dlatego jeśli masz jakieś pytania, możesz skontaktować się ze mną bezpośrednio pocztą lub na forum: pomogę ci w każdy możliwy sposób!

Życzę wszystkim powodzenia i udanej realizacji wszystkich projektów!

PS Dozwolone jest dowolne kopiowanie i cytowanie tego artykułu pod warunkiem wskazania otwartego aktywnego linku do źródła i zachowania autorstwa Rusłana Tertysznego.