poniedziałek, 1 maja 2017

[DSP2017] 18# Holowizja - zabiłem pierwsze zombi w pokoju

Ten wpis miał pojawić się w niedzielę, ale z uwagi na liczne problemy techniczne pojawia się z lekkim opóźnieniem teraz. Postanowiłem opracować wersję gry Survival Shooter na HoloLens.

Ostatnio w pierwszym kroku umieściłem jednego z wrogów o nazwie ZomBunny w pokoju.

HZ1

Można do niego strzelać (tap click, póki co bez błysku światła i promienia). Jeśli strzelimy i będzie przez nas namierzony kursorem to straci część swojego życia. Po kilku celnych strzałach padnie na wznak i zniknie.

Aktualne źródła umieściłem w HoloSurvivalShooter na github. A jak to wygląda od strony Unity?

Bazując na projekcie HoloVision9 usunąłem z niego sześciany oraz skrypt do rzucania piłką z kamery. Zamiast tego dodałem na scenę Zombunny bez NavMeshAgent’a i na razie z jednym skryptym EnemyHealth z zakomentowanymi odniesieniami do tego agenta i do ScoreManager.

image

Na kamerze umieściłem AudioSource z dźwiękiem wystrzału oraz uproszczony skrypt PlayerShooting, tym razem łapiący “kliknięcie” użytkownika poprzez SetGlobalListener.

HZ3

Kod tego skryptu aktualnie wygląda tak:

public class PlayerShooting : MonoBehaviour, IInputClickHandler
{
    public int damagePerShot = 20;
    public float timeBetweenBullets = 0.15f;
    public float range = 100f; 


    float timer;
    Ray shootRay = new Ray();
    RaycastHit shootHit;
    int shootableMask;
    AudioSource gunAudio;
    float effectsDisplayTime = 0.2f;


    void Awake ()
    {
        shootableMask = LayerMask.GetMask ("Shootable");
        gunAudio = GetComponent<AudioSource> ();
    }


    void Update ()
    {
        timer += Time.deltaTime;

        if(timer >= timeBetweenBullets * effectsDisplayTime)
        {
            DisableEffects ();
        }
    }


    public void DisableEffects ()
    {
        //to do         
    }

    public void OnInputClicked(InputEventData eventData)
    {
        if(timer >= timeBetweenBullets && Time.timeScale != 0)
        {
            Shoot ();
        }
    }


    void Shoot ()
    {
        timer = 0f;

        gunAudio.Play ();

        shootRay.origin = transform.position;
        shootRay.direction = transform.forward;


        if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
        {
            EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
            if(enemyHealth != null)
            {
                enemyHealth.TakeDamage (damagePerShot, shootHit.point);
            }            
        } 
    }
}

Jakie dalsze kroki?

  1. Wiele rodzajów zombi
  2. Tablica zdobytych punktów
  3. Poruszanie się zombi po podłodze pokoju w kierunku gracza (kamery)
  4. Atak zombi i utrata życia przez gracza
  5. Informacja o stanie życia grającego i o końcu gry
  6. Dynamiczne dodawanie zombi na scenę
  7. Ogień, światło i promień z naszej lufy (kamery lub dłoni)
  8. Muzyka w tle

Jak widzimy trochę tego jest, więc będzie co dłubać w maju. Początkowo wydawało się, że przeniesienie ze zwykłego Unity będzie znacznie szybsze, ale natrafiłem na kilka problemów.

Po instalacji Visual Studio 2017 lub updacie Windows 10 w edycji Insider przestał działać mi emulator HoloLens. Znany błąd o braku uprawnień w ACL, czytałem, potem doszedłem do problemu z wgrywaniem i… skończyło się na instalacji czystej wersji Windows 10 oraz Visual Studio 2017 i Unity. Plusem całej sytuacji jest to, że działam na Visual Studio 2017 zgodnie z opisem na stronie o narzędziach dla HoloLens. Przejściowym minusem jest nieco mniejszy stopień integracji z Unity (do edycji skryptów uruchamia mi się Mono Develop). Nie chciałem też iść w najnowsze Unity 5.6 z obawy o kompatybilność i wybrałem wersję 5.5.3.

Inny problem to czarny ekran w emulatorze. Jak próbowałem dodawać dynamicznie wroga na scenie, to ani razu mi się siatka pokoju nie wyświetliła. Wróciłem nawet do ostatnio używanej wersji Unity 5.5.2, ale nic to nie zmieniło. Niezależnie od tego losowo czasami i tak ta siatka może się nie pojawić, ale tak było u mnie zawsze (może trzeba stosować jeszcze starsze Unity jak to ostatnio znane na stronie z narzędziami?). W porównaniu do zwykłego Unity testowanie związane z eksportem do Visual Studio i odpalaniem przez emulator jest dużo bardziej uciążliwe niż odpalenie w ekranie Unity.

Kolejna rzecz, która mnie spowolniła to ogień z lufy. Myślałem że przeniesienie będzie proste, ale jakoś ten błysk świetlny widoczny nawet w edytorze nie wyświetlał się w emulatorze, a promień czy światło w sumie też nie pozwalały się zauważyć (sporadycznie kawałek promienia zostawał gdzieś na siatce pokoju). Na razie to wyrzuciłem i bedę nad tym myślał.

Pewną zagadką do rozwiązania będzie też przemieszczanie się po podłodze w kierunku grającego. Tutaj siatka pokoju jest dodawana dynamicznie, a NavMeshAgent wymaga w trakcie edycji stworzenia płaszczyzny do poruszania. Z tego, co rzuciłem okiem, nie wiadomo, czy go się w ogóle użyje.

Tablicę z punktami, pasek życia czy tym bardziej niebieski ekran game over też się nie przeniesie bez zmian. Gdzieś wyczytałem, że w HoloLens obiekty stale zakrywające pole widzenia użytkownika nie są zalecane. Do przemyślenia.

Do zobaczenia następnym razem. A nastąpić musi on stosunkowo niedługo z uwagi na dzisiejszą małą obsuwę.

Brak komentarzy: