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.