piątek, 14 kwietnia 2017

[DSP2017] 14# Aaa, goni mnie zombi - preludium do gry

Zbliżamy się do półmetku, pasowałoby scalić dotychczasową wiedzę w jakąś prostą grę na HoloLens. Chciałbym sobie powalczyć z jakimiś stworami, które zaatakują mnie w pokoju. Strzelałbym sobie do nich laserem albo hm… wyrzutnią rakiet, one też mogłby mnie atakować. Najwyżej… zginę zastrzelony. BTW czy można zginąć w HoloLens?  Taka wizja na walkę w pokoju na początek wystarczy.

Pasowałoby jednak najpierw podszkolić się z samego Unity i pisania w nim gier. Rzuciłem okiem na kilka książek o Unity, całkiem dobrym wstępem wydaje się Unity for Absolute Beginners. Pokazuje sporo szczegółowych praktycznych kroków przy tworzeniu sceny z ogrodem, strachem na wróble, jakimiś dziwnymi stworzeniami (hm ni to świnia, królik, chomik)… Nie wiem czy jest tylko dla żółtodziobów, w każdym razie ukazuje sporo uporządkowanej wiedzy w oparciu o dość efektowną scenę i efekty, a nie każda książka jest taka. Eksperymentowałem coś z importem modelu i animowaniem go w trybie Humanoid. Odkryłem też polski portal http://mwin.pl/, który skupia się na Unity i grach, szczególnie interesujący wydaje się tam Unity3d FPS Tutorial złożony z kilkunastu odcinków. Jednak po jakimś czasie uznałem, że wejdę w temat przerabiając najpierw jakieś tutoriale z samego Unity. Jest tam esencja praktyki pokazywana na wideo. Najbardziej póki co przykuła moją uwagę gra Survival Shooter. Tam gracza reprezentuje biały skrzat ze strzelbą, a podążają za nim złe zombie, kojarzące mi się nieco… z misiem Uszatkiem.

Dziś napiszę trochę o tym, co zwróciło moja uwagę po wykonaniu 4 pierwszych części tutorialu:

Co prawda do HoloLens najbardziej przydatny myśle okaże się zombi z 4-tej części, ale wszędzie można się czegoś dowiedzieć. 

I tak przykładowo, biały skrzat (gracz) jest wiązany z Animator Controller-em PlayerAC, do którego przekazywane są parametry na tranzycjach między stanami. Dzięki temu możemy potem z poziomu skryptów sterować przechodzeniem między stanami animacji. Hola, hola może bardziej po kolei. Jak utworzymy Animator Controller, przeciągniemy go na obiekt Player i potem wejdziemy w zakładkę Animator, to stany możemy łatwo dodać przeciągając elementy Death, Idle i Move z modelu Player. Kolor pomarańczowy oznacza stan domyślny, jeśli chcemy by był to inny stan niż pierwszy przez nas przeciągnięty wystarczy wybrać Set As Layer Default State w menu kontekstowym pożądanego stanu. Tranzycję tworzymy na stanie wybierając z menu kontekstowego Make Transition i przeciągając ją na wskazany stan docelowy. Parametry definiuje się w zakładce Parameters. W tym przypadku jest to IsWalking typu bool oraz Die typu Trigger. Teraz w inspektorze tranzycji można w sekcji Conditions wskazać parametry, od ktorych będzie zależne działanie przejścia.

Game2

Skrypt PlayerMovement podpięty pod obiekt Player dzięki linii:

anim.SetBool("IsWalking", walking);

powoduje, że obiekt animatora ustawia zmienną IsWalking, co wpływa na odpalenie animacji Move dla skrzata.

Zarówno skrzat, jak i zombi mają obiekty typu RigidBody i collider (kapsuła, a w przypadku zombi także sfera). Jak już wiemy pozwala to m.in na odbicia i wykrywanie kolizji. Najciekawszy jest jednak tutaj zupełnie dla mnie nowy element NavMeshAgent. To dzięki niemu wrogie nam zombi wie, gdzie jesteśmy i wie, jak podążać za nami!!!  Zombi za nami idzie dzięki prostemu skryptowi EnemyMovement:

public class EnemyMovement : MonoBehaviour
{
    Transform player;   
    UnityEngine.AI.NavMeshAgent nav;

    void Awake ()
    {
        player = GameObject.FindGameObjectWithTag ("Player").transform;       
        nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
    }

    void Update ()
    {        
       nav.SetDestination (player.position);       
    }
}

Game1

Co się przesunę choćby klawiszami S, W, A, D to zombi i tak do mnie przyjdzie po jakimś czasie dłuższym lub krótszym. Nieuchronnie zawsze do mnie dotrze. Robi się groźnie, a do dopiero początek. Przede mną walka z całą armią zombie i to na dodatek w moim własnym pokoju!  Trzeba nabrać sił podczas świąt, by ta walka była wygrana.

Brak komentarzy: