Zagrajmy w grę… pamiętasz, z jakiego to jest filmu? A co, gdybym Ci powiedział, że możesz zagrać w grę stworzoną samodzielnie, w jeden wieczór?
Moja pierwsza gra w Unity powstała właśnie w jeden wieczór i jest całkiem grywalna! W tym wpisie podzielę się z Tobą moimi wrażeniami i spostrzeżeniami. Czytając ten artykuł, poznasz podstawowe elementy silnika Unity, które pozwolą Ci na zbudowanie pierwszej gry. Na samym wstępie chciałbym zaznaczyć, że nie zajmuję się profesjonalnie game devem. Omawiana gra to projekt w ramach odskoczni od zadań, którymi zajmuję się na co dzień. Jeśli widzisz jakieś nieścisłości lub coś, o czym warto wspomnieć, a zabrakło tego w artykule, to koniecznie zostaw komentarz pod wpisem!
Uważam, że warto, od czasu do czasu, poświęcić chwilę na jakiś projekt poboczny. Nie tylko pomoże Ci to poszerzyć horyzonty, ale pozwoli Ci rozwinąć kreatywność. W prywatnym projekcie nic Cię nie ogranicza. Tworzysz, w czym chcesz i co chcesz. Możesz zająć się czymś, co sprawi Ci frajdę lub przygotować narzędzie, które jakoś usprawni Twoją pracę. Zachęcam, aby taki projekt wykorzystywał inne technologie lub dotyczył innego obszaru niż ten, którym zajmujesz się w swojej pracy. Poszerzanie horyzontów i listy znanych technologii nie tylko wygląda fajnie w CV, ale też stanowi fajną odskocznię od codziennej rutyny. W moim przypadku wybór padł na Unity.
O Unity
Unity jest darmowym (o ile nie zarabiasz na swoich grach powyżej $100k rocznie) i jednym z najpopularniejszych silników do tworzenia gier komputerowych. Prawdopodobnie, możesz go kojarzyć z badziewnych gier za dolara na Steamie. Nie oznacza to jednak, że w Unity nie da się stworzyć dobrej gry. Przykładowe duże tytuły stworzone na Unity to Cities Skylines, Cuphead, Rust czy Hearthstone. Aby tworzyć fajne gry w Unity nie potrzeba też przerabiania tony kursów czy zaawansowanej programistycznej wiedzy. Świetnie pokazuje to przykład, w którym autor pokazuje swój progres dokonany w ciągu roku.
Podejście autora do nauki pokrywa się z moim. Najbardziej podstawowe mechanizmy gier takie jak sterowanie, obsługa zdarzeń, wyświetlanie tekstu, tworzenie scen i obiektów czy dynamiczne renderowanie elementów znajdziesz praktycznie w każdym tutorialu. Obejrzenie maksymalnie kilku tutoriali będzie bardziej niż wystarczające do zbudowania pierwszej gry. Najważniejsze jest, aby mniej czytać i oglądać, a więcej robić. Gdy napotkasz jakiś problem, którego nie umiesz rozwiązań czy potrzebujesz zaimplementować jakiś nowy mechanizm, Google is your friend. Możesz też skorzystać z dokumentacji Unity. Pamiętaj, że pierwsza gra to nie musi być rocket science. Nie musisz się też silić na kreatywność. Możesz stworzyć swojego klona Flappy Bird, Mario, czy jakiejkolwiek innej, prostej gry. Najwięcej nauczyłem się z poniższych filmów. Po ich obejrzeniu zakasałem rękawy, aby moja pierwsza gra w Unity ujrzała światło dzienne.
Pierwszy projekt
Unity pozwala na tworzenie gier 2D i 3D i wspiera tworzenie gier na większość popularnych platform. Aby rozpocząć przygodę z Unity, będziesz potrzebował/a założyć konto Unity ID. Będzie to konieczne w celu aktywowania licencji. Następnie, należy zainstalować program Unity Hub i zalogować się wykorzystując swoje konto Unity ID. Po zalogowaniu się można utworzyć projekt oraz wybrać wersję silnika. Rekomenduję wybranie najnowszej możliwe wersji, nawet jeśli materiały do nauki wykorzystują starszą wersję. Moje obserwacje i doświadczenia pozwalają mi stwierdzić, że większość kursów da się zastosować do nowszych wersji silnika. Nowsze wersje zawierają poprawki błędów i nowe funkcje. Po utworzeniu i uruchomieniu projektu Twoim oczom ukaże się kreator Unity.
W centrum pokazany jest widok sceny. O scenie możesz pomyśleć jak o pojedynczym widoku gry (na przykład menu gry) lub poziomie/mapie. Po scenie możesz się poruszać, przesuwając kursor na obszar sceny i klikając prawy przycisk myszy (PPM). W ten sposób ruchem myszy oraz przyciskami WASD możliwe jest przemieszczanie się po scenie.
Oprócz widoku sceny, do dyspozycji jest kilka dodatkowych paneli. Panel Hierarchy z lewej strony, który zawiera obiekty dla aktualnej sceny, oraz odwzorowuje relacje między nimi. Hierarchie obiektów są przydatne przy grupowaniu obiektów, czy w przypadku projektowania złożonych obiektów składających się z wielu mniejszych obiektów. Dwa domyślnie tworzone elementy dla sceny 3D to widok z kamery oraz źródło światła. Dolny panel Project przedstawia wszelkie assety wykorzystywane w tworzeniu gry. Przykładowymi assetami są: pliki graficzne (np. tekstury), pliki audio, obiekty 3D, skrypty czy zewnętrzne assety/prefaby. Oprócz panelu Project, w dolnej sekcji widoku kreatora do dyspozycji jest też widok konsoli, gdzie wyświetlane są treści błędów oraz treści drukowane przez nasz kod. Z prawej strony widnieje panel Inspector, którego treść dynamicznie zmienia się w zależności od obecnie edytowanego obiektu.
Aby dodać pierwszy obiekt, należy kliknąć PPM w panelu Hierarchy i wybrać obiekt. Po utworzeniu obiektu zostanie on automatycznie dodany do aktywnej sceny. Po wybraniu utworzonego elementu panel Inspector zostanie wypełnony opcjami edycji.
Jedną z najbardziej przydatnych opcji inspektora jest Transform. Dzięki Transform możliwe jest ustawienie pozycji obiektu na scenie, dopasowanie kształtu czy ustawienie kąta pochylenia. Korzystanie z Transform jest, moim zdaniem, znacznie bardziej wygodne niż ustawianie obiektów z wykorzystaniem myszy. Ustawianie obiektów na scenie 3D z wykorzystaniem myszy działa bardzo topornie i zdecydowanie NIE polecam tego podejścia.
Modyfikacja obiektów i dodawanie komponentów
Mając już pierwszy obiekt, warto nadać mu nieco życia. Podstawowe obiekty Unity, domyślnie są białymi bryłami. Aby zmienić ich kolor, w panelu Project należy stworzyć nowy Material. Kliknij PPM na panelu Project i wybierz Create > Material
. W panelu Inspector wybierz kolor. Możesz też użyć tekstury lub zdjęcia. Następnie, przesuń utworzony Material na uprzednio dodany obiekt w widoku sceny lub w panelu Hierarchy.
Aby zaimplementować fizykę obiektu, w panelu Inspector należy dodać komponent Rigidbody. W celu dodania nowego komponentu kliknij przycisk Add Component
i wyszukaj potrzebny komponent. Teraz możesz dostosować obiekt poprzez włączenie dla niego grawitacji oraz ustalenie masy. Tutaj wychodzi siła korzystania z gotowych rozwiązań. Nie potrzebujesz znać praw fizyki, aby je wykorzystać w swojej grze! Innym, przydatnym komponentem jest Collider, który jest wymagany, aby być w stanie reagować na kolizje z innymi obiektami. Koniecznie należy wtedy zaznaczyć opcję Is Trigger
.
Skrypty
Kod w Unity pisany jest w języku C#. Jeśli miałeś/aś styczność z TypeScriptem lub Javą, to przesiadka zajmie Ci dosłownie chwilę. Do edycji kodu wykorzystałem Visual Studio Code oraz rozszerzenie do C# od Microsoftu.
Kod w Unity można przypisać do konkretnego obiektu, dzięki czemu otrzymujesz dostęp do kilku predefiniowanych metod np. Start()
, Update()
. Metody te są wywoływane w poszczególnych momentach cyklu życia powiązanego obiektu. Przykładowy skrypt, który odpowiada za implementację ruchu w moim obiekcie gracza, wygląda następująco.
using UnityEngine;
public class MovePlayer : MonoBehaviour
{
public float speed = .5f;
private Rigidbody rigidbody;
void Start()
{
rigidbody = GetComponent();
}
void Update()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 moveDirection = new Vector3(horizontal, 0.0f, vertical);
rigidbody.AddForce(moveDirection * speed);
}
}
Powyższy kod sprawia, że obiekt będzie poruszał się zgodnie z kierunkiem wyznaczonym przez gracza, z wykorzystaniem przycisków WASD. Zdefiniowałem też publiczny parametr speed
. Publiczne parametry są widoczne i modyfikowalne z poziomu panelu Inspector. Parametr speed
, w tym przypadku, pozwala dostosować siłę ruchu.
Jeżeli w kodzie znajdzie się błąd, zostanie to zakomunikowane w konsoli przy próbie budowania projektu.
Innym, ciekawym przykładem zastosowania skryptów jest reagowanie na wydarzenia. Działa to na podobnej zasadzie jak addEventListener()
w programowaniu frontendów. W mojej grze dodałem obiekty bomb. Kolizja z bombą powoduje wybuch oraz powoduje wyzerowanie punktów gracza. Kod odpowiedzialny za to wygląda następująco.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BombCollide : MonoBehaviour
{
public GameObject tinyExplosionPrefab;
private void OnTriggerEnter(Collider other)
{
if ( other.CompareTag("Player") )
{
Instantiate(tinyExplosionPrefab,transform.position, transform.rotation);
Destroy(gameObject);
player.points = 0;
}
}
}
Wcześniej, w panelu Inspector, obiektowi Player nadałem odpowiedni tag. W momencie kolizji z obiektem gracza następuje stworzenie instancji prefaba z eksplozją, zniszczenie bomby oraz wyzerowanie punktów zebranych przez gracza.
Dźwięk
W grze równie istotny co obraz i interakcja ze światem gry, jest dźwięk. Dodawanie dźwięków jest banalnie proste i można do tego wykorzystać poznane już skrypty. W celu dodania dźwięku, w skrypcie należy zdefiniować źródło dźwięku oraz klip. Następnie, z poziomu skryptu wystarczy uruchomić dźwięk w odpowiednim momencie, na przykład w momencie kolizji, wydarzenia, czy przy starcie gry.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayMainTheme : MonoBehaviour
{
public AudioSource source;
public AudioClip clip;
void Start()
{
source.loop = true;
source.volume = 0.2f;
source.clip = clip;
source.Play();
}
}
Przedstawiony kod uruchamia główną ścieżkę dźwiękową, w pętli, przy uruchomieniu gry. Aby skrypt zadziałał poprawnie, wymagane jest ustawienie klipu (pliku audio) oraz źródła dźwięku. Źródło jest obiektem, z którego będzie emitowany dźwięk. Obie wartości ustawisz w panelu Inspector.
Uruchomienie gry
Mając już przygotowaną scenę, należałoby ją uruchomić i przetestować. W tym celu wystarczy nacisnąć przycisk play. Kreator Unity przejdzie wtedy w tryb gry. Pamiętaj, że zmiany wprowadzone w trybie gry znikną, gdy z niego wyjdziesz. Gorąco rekomenduję, aby tego pilnować, bo można się niemiło zaskoczyć.
Aby zbudować gotowy projekt gry, należy wybrać File > Build Settings > Build
. Spowoduje to wygenerowanie gotowej gry.
Co dalej?
Serdecznie zachęcam do spróbowania swoich sił z Unity. Na początku, polecam stworzyć prostą grę z wykorzystaniem opisanych elementów. Postaraj się zaimplementować jak najwięcej „smaczków” i detali, takich jak reagowanie na wydarzenia, proste animacje itp.. Pozwoli Ci to nauczyć się kolejnych mechanizmów i zmusi do researchu. Samodzielna praca nad detalami pozwala dostrzec, jak wiele pracy zostało włożone w gry dostępne na sklepowych półkach. Szczególnie zachęcam do samodzielnego zgłębienia mechanizmów pracy ze scenami oraz poznania biblioteki TextMeshPro. Pozwoli Ci to na stworzenie, na przykład, menu gry. Po stworzeniu pierwszej gry zachęcam do stworzenia czegoś bardziej ambitnego!
Jeśli interesuje Cię rozwój gier fabularnych, to zachęcam do zapoznania się z darmowym kursem „Światotwórstwo w grach komputerowych” autorstwa Krzysztofa M. Maja. W kursie poznasz teorię oraz narzędzia przydatne przy tworzeniu światów w grach komputerowych. Bardzo mi się podoba, że większość lekcji zawiera przykłady wykorzystania wiedzy w istniejących już grach.
Jeśli tworzysz gry komputerowe i chciałbyś/chciałabyś się podzielić swoimi osiągnięciami, to sekcja komentarzy jest twoja! 🙂
Źródła i materiały dodatkowe
- 15 Great Games That Use The Unity Game Engine
- Dokumentacja Unity
- What is Unity? – A Guide for One of the Top Game Engines
- 1 Year of Learning Game Development In 6 Minutes
- The Unity Tutorial For Complete Beginners
- Unity Full Beginner Tutorial 2020 | Make your first game!
- Unity Full Beginner Tutorial 2020 | Make your first game! (Part 2)
- 3 Tips to Learn any New Skill Faster
- Światotwórstwo w grach komputerowych
Zapisz się na mailing i odbierz e-booka
Odbierz darmowy egzemplarz e-booka 106 Pytań Rekrutacyjnych Junior JavaScript Developer i realnie zwiększ swoje szanse na rozmowie rekrutacyjnej! Będziesz też otrzymywać wartościowe treści i powiadomienia o nowych wpisach na skrzynkę e-mail.