Pierwsze kroki • •
Utworzyć nowy projekt (menu File -‐> New Project -‐> zakładka Create New Project). Rozpakować katalog z materiałami.
Stworzenie terenu. (3pkt) • • • •
Do nowego projektu Unity3d utwórz teren (menu Terrain -‐> Create Terrain). Ustaw szerokość i długość terenu na 1000, wysokość na 200 (menu Terrain -‐> Set Resolution). Z menu Terrain wybierz opcję Flatten Heightmap i ustaw wysokość na 50. W oknie Hierarchy zaznacz element Terrain. W oknie Inspector pojawią się opcje edycji terenu.
•
Na widocznym obrazku zaznaczona jest funkcja do podnoszenia lub obniżania terenu. W tym celu wystarczy użyć wybranego pędzla w oknie sceny. Dodatkowo można ustawić rozmiar pędzla oraz jego kształt. W celu obniżenia terenu należy trzymać wciśnięty klawisz shift. Inne funkcjonalności edytora to m.in. wyrównywanie terenu do danej wysokości i wygładzanie. Używając funkcji obniżania terenu stwórz z dodanego wcześniej terenu wyspę. Efekt może wyglądać tak, jak na obrazku:
• •
•
Przy tworzeniu sceny pomocna jest możliwość zmiany widoku. Można to robić za pomocą prawego i środkowego klawisza myszki (obrót, przybliżenie lub przesunięcie) lub za pomocą widocznych w prawym górnym rogu sceny osi. (obrazek)
•
Przy pomocy narzędzi do podwyższania dodaj góry. Efekt może wyglądać tak jak na obrazku:
•
Z menu Assets wybierz opcję Import Package i zaznacz Terrain Assets.
• •
W oknie inspektora zaznacz opcję do malowania tekstur (ikona pędzla). Kliknij w przycisk Edit Textures, następnie Add i dodaj kolejno tekstury: Good Dirt, Grass & Rock, Grass (Hill). Oteksturuj teren. Efekt może wyglądać następująco:
• •
•
•
Podobnie jak wcześniej zaimportuj wodę (Water (Basic)). Z okna Project wybierz Water (Basic) -‐> Daylight simple water i przeciagnij do sceny. W oknie inspektora ustaw odpowiednie wartości skali i położenia. Wynik powinien wyglądać podobnie jak na obrazku:
Z katalogu z materiałami skopiuj katalog Interstellar do katalogu Assets w projekcie (za pomocą eksploratora plików Windows). W oknie project znajdź zaimportowane obrazki i dla każdego w oknie inspektora ustaw Wrap Mode na Clamp. Utwórz nowy Asset typu Material (menu Assets -‐> Create -‐> Material). Nazwij go cubemap. W oknie inspektora ustaw typ shadera na RenderFX-‐>SkyBox.
• • •
•
Dodaj kolejno wcześniej zaimportowane tekstury do utworzonego Assetu ( tak, aby ustawienie tekstur się zgadzało). Aby ustawić nowo utworzony Asset jako cube mapę, wejdź do ustawień renderowania (menu Edit -‐> Render Settings) i w polu skybox material ustaw dodany wcześniej materiał. Jeżeli wszystko zostało ustawione poprawnie nowe tło będzie ciągłe, bez żadnych widocznych przerw między teksturami.
Zaimportuj (Import Package) o nazwie Light Flares. Dodaj do sceny światło kierunkowe (GameObject-‐>Create Other-‐>Directional Light). W oknie inspektora ustaw Flare -‐> Sun. Ustaw pozycje i rotacje światła, aby oświetlało wyspę i było w miejscu, gdzie na teksturze cube mapy znajduje się słońce.
• • • •
Zaimportuj paczkę o nazwie Character Controller. W oknie Project z Standard Assets wybierz First Person Controller i przeciągnij go do okna Hierarchy. W oknie Hierarchy skasuj istniejący wcześniej obiekt Main Camera. Za pomocą atrybutów Position w oknie Inspector lub za pomocą osi kamery w oknie sceny umieść kontrolera w odpowiednim miejscu na wyspie.
• • • •
•
•
Wciśnij ikonę Play i przetestuj sterowanie. Po skierowaniu kamery na słońce powinien być widoczny błysk. Gdy w oknie Hierarchy zaznaczony jest First Person Controller, opcje inspektora pozwalają na ustawienie parametrów ruchu, skakania i grawitacji. Ustaw tag controllera na Tag -‐> Player. Zaimportuj (Assets -‐> Import Custom Package) kolejno paczki drzewa, domek, house2, chapel. Drzewa na planszy można umieścić klikając w oknie Hierarchy na teren i w inspektorze wybierając narzędzie Place Trees. Należy dodać odpowiedni model drzewa (Edit Trees -‐> Add Tree). Analogicznie użyj narzędzia Place plants, stones and other small foilage aby dodać trawę do sceny.Następnie poprzeciągaj modele budynków na odpowiednie miejsca na planszy. Popraw ich rozmieszczenie i wygląd za pomocą atrybutów Rotation, Position i Scale. UWAGA DO WSZYSTKICH ZADAŃ: jeśli któryś z importowanych modeli ma po dodaniu do sceny za małą skalę, należy wybrać ten model w oknie Project, dobrać odpowiednią wartość Scale Factor, całość zatwierdzić przyciskiem Apply. Przykładowy efekt:
Dodanie broni. (2pkt) • •
•
Zaimportuj (custom package) paczkę o nazwie Minigun, następnie paczkę o nazwie RocketLauncher. Przeciągnij prefaba (ikonka sześcianu) minigun z okna Project do okna Hierarchy tak, aby obiekt był dzieckiem Main Camera w hierarchii First Person Controller. Ustaw pozycję i rotacje broni, tak, aby podczas gry widać było trzymaną broń. Podobnie zrób z obiektem rocketLauncher.
•
Dla obu broni w oknie inspektora wyłącz obiekt MeshCollider.
o o o
• •
• •
Dodaj nowy skrypt C# (menu Assets) i nazwij go Player. Podłącz go do obiektu Main Camera. W metodzie Start ustaw początkową widoczność broni.
W metodzie Update napisz obsługę przełączania broni. W tym celu możesz wykorzystać metody: o bool Input.GetKeyDown(string klawisz) – sprawdza czy dany klawisz jest wciśnięty o odwołanie do własnego obiektu Transform następuje poprzez zmienną lokalną transform. o Klasa Transform posiada pole childCount oraz metodę GetChild(int index), która zwraca inne obiekty klasy Transform, położone niżej w hierarchii. o Odwołanie do dołączonego obiektu GameObject następuje poprzez zmienną gameObject. o Aby ustawić stan aktywny lub nieaktywny obiektu GameObject, należy posłużyć się metodą SetActiveRecursively(bool). Przełączanie powinno nastąpić po wciśnięciu klawisza np. 1 lub 2, i tylko jedna broń powinna być widoczna. Zaimportuj (import package -‐> particles) z układami cząsteczkowymi. W oknie Project w folderze Standard Assets znajdź prefab o nazwie Sparks i przeciągnij go tak, aby znalazł się w oknie Hierarchy jako dziecko minigun.
•
Z katalogu z materiałami zaimportuj nowy asset o nazwie Minigun.cs. Przeciągnij go do obiektu minigun w oknie Hierarchy. Zapoznaj się ze skryptem. W miejscu wskazanym przez komentarz w metodzie Fire należy dopisać obsługę trafienia pociskiem dany obiekt w grze. o Najprościej zrobić to metodą Physics.Raycast(Vector3 position, Vector3 direction, out RaycastHit hit, float range). o Lokalna zmienna transform zawiera dane o położeniu i rotacji obiektu 1 o Za pozycję przyjąć aktualne położenie broni, a jako wektor direction kierunek, w który strzelamy (czyli naprzód). o Funkcja ta przyjmuje wektory w układzie świata. Transformacji pomiędzy wektorem w lokalnym układzie współrzędnych (Vector3.forward), a układem świata, można dokonać za pomocą metody TransformDirection obiektu transform. o Dodatkowo należy umieścić układ cząsteczkowy (iskry) w miejscu, w które trafiliśmy i obrócić go prostopadle do trafionej płaszczyzny. o Metoda Physics.Raycast w parametrze hit umieszcza dane o potencjalnym trafieniu. Miejsce trafienia możemy uzyskać z pola point obiektu RaycastHit, natomiast wektor normalny z pola normal. o Po każdym strzale w miejscu trafienia powinny pokazywać się iskry. o Aby obsłużyć trafienie obiektów fizycznych typu RigidBody, należy posłużyć się metodą rigidbody.AddForceAtPosition(Vector3 force, Vector3 point). o Zadawanie obrażeń będzie obsługiwała funkcja ApplyDamage. Aby ją wywołać w trafionym obiekcie należy użyc funkcji BroadcastMessage 2. o Przykładowa obsługa trafienia:
•
Zaimportuj (import custom package) paczkę o nazwie muzzleFlash. Przeciągnij obiekt, jako dziecko minigun. Ustaw teksturę na dowolną teksturę z ogniem i ustaw typ shadera na
1 2
http://unity3d.com/support/documentation/ScriptReference/Transform http://unity3d.com/support/documentation/ScriptReference/Component.BroadcastMessage.html
•
Particles-‐>Additive. Po kliknięciu w oknie Hierarchy na minigun, w oknie inspektora ustaw zmienną Błysk na dodany obiekt muzzleFlash. o Ustaw odpowiednie położenie, aby błysk był widoczny podczas strzelania. Aby możliwe było strzelanie, w skrypcie Player.cs należy po wciśnięciu danego przycisku wysłać wiadomość o nazwie „Fire”. Przykład:
• •
Zaimportuj paczkę Pocisk. Dodaj nowy skrypt do broni RocketLauncher. o Podobnie jak w przypadku Minigun stwórz metodę Fire, która będzie odpowiedzialna za wystrzeliwanie rakiet. o Zadbaj o to, aby strzelanie było możliwe nie częściej niż raz na sekundę (można posłużyć się klasą Time3). o Aby utworzyć nowy pocisk dodaj publiczne pole typu RigidBody reprezentujące rakietę. Gdy w edytorze zaznaczony jest skrypt, w oknie inspektora powinno być widoczne utworzone pole. Przeciągnij do niego prefab Pocisk. Tworzenie pocisku po strzale należy wykonać metodą Instantiate 4. o Rakiecie należy nadać początkową prędkość (pole velocity). o Upewnij się, że Prefab Pocisk połączony jest ze skryptem Pocisk.cs, a prefab Wybuch z Pociskiem. o Aby ignorować kolizję między bronią a wystrzeloną rakietą należy użyć metody Physics.IgnoreCollision 5 (collider rakiety i collider gracza, który otrzymamy z transform.root.collider). o Przetestuj strzelanie rakietami -‐ gdy rakieta uderzy w obiekt powinna nastąpić eksplozja.
3
http://unity3d.com/support/documentation/ScriptReference/Time-‐time.html http://unity3d.com/support/documentation/ScriptReference/Object.Instantiate.html 5 http://unity3d.com/support/documentation/ScriptReference/Physics.IgnoreCollision 4
Wybuchające beczki. (zadanie dodatkowe) • • •
Zaimportuj paczkę o nazwie beczka. Dodaj do niej komponent typu rigid body i box collider. Utwórz skrypt, który w metodzie ApplyDamage() będzie odpowiadał za zliczanie „zdrowia” beczki. Jeżeli spadnie do zera, utwórz eksplozję – jako przykład użyj skryptu pocisk.cs. Po wybuchu beczka przestaje zliczać obrażenia.