Maj 2, 2017 Daj Si臋 pozna膰 Programowanie Unity3d 0
LifeLike

Witam na maj贸wkowym wpisie 馃檪 Pogoda za oknem nie rozpieszcza, aby chodzi膰 na d艂ugie spacery po g贸rach. Dzisiaj troch臋 o kontrataku oraz modernizacji modelu ruchu na mniej dynamiczny, ale za to bardziej stabilny.

Podsumowanie poprzednich wpis贸w na temat聽LifeLike

W poprzednim odcinku atakowali艣my wroga (link). Tym razem, wr贸cimy do tematu i go rozwiniemy o kontratak ze strony przeciwnika. Dodatkowo wprowadzi艂em zatrzymanie si臋 na innym obiekcie, a nie na graczu, wi臋c nie wejdziemy na niego, a jednocze艣nie go zaznaczymy (tzn. przeciwnika).

Edytor kodu

Od ostatniego odcinka zmieni艂em IDE. Wiecie, na Macu mam 艣redni wyb贸r do c#, a Mono Develop i jego klony 鈥 to nie wyb贸r. InteliJ wyda艂 艣wietnego Ridera, ale potrafi by膰 鈥渒locowaty鈥 dla pami臋ci i czasami niestabilny. Wyb贸r pad艂 na Visual Studio Code, kt贸ry jest klonem lekkiego edytora, zwanego ATOM. Ma 艣wietne wsparcie dla C# oraz Unity. Tak偶e dla innych j臋zyk贸w. Obs艂uguje git鈥檃, a nawet i posiada debugger. Czyli du偶o potrzebnego stuffu鈥 poza sprawny refactoringiem, kt贸ry dostarcza nam np. wspomniany InteliJ Rider, czy wtyczka do VS – Resharper (tak偶e od InteliJ).

LifeLike

Visual Studio Code

Ruch

Poprzedni model ruchu inspirowany by艂 kursem od Unity – Rogue Like. Nie by艂 on doskona艂y, poniewa偶, gdy naci艣n臋li艣my zbyt du偶o klawiszy na raz, nasza posta膰 porusza艂a si臋 zbyt niestabilnie i wychodzi艂a poza kratk臋. Tym razem poruszamy si臋 my oraz przeciwnik o ca艂膮 klatk臋.

  public IEnumerator Movement(Vector3 destination)
        {
            var remainingDistance = (transform.position - destination).sqrMagnitude;
            //Tak by艂o wcze艣niej:
            // while (remainingDistance>float.Epsilon)
            // {
            //     var newPosition=Vector3.MoveTowards(_rb2D.position, destination, _inverseMoveTime * Time.deltaTime);
            //     _rb2D.MovePosition(newPosition);
            //     remainingDistance = (transform.position - destination).sqrMagnitude;
            //     yield return null;
            // }      
	//Tak jest teraz:
            transform.position=destination;
            yield return null;
        }

System Turowy

Jest to prosty system – On atakuje albo my atakujemy. 呕ycie jest Proste! 馃檪
W GameManagerze doda艂em now膮 zmienn膮 鈥淚sPlayerTurn鈥, od kt贸rej zale偶y, do kogo nale偶y obecnie tura. Tzn. ruch jest zablokowany, a przeciwnicy jeden po drugim si臋 poruszaj膮.

   public void EndPlayerTurn()
    {  
	//Zostanie zmienione na co艣 konkretniejszego o ruchach
        UiUtils.AddLog("Enemies Turn");
        IsPlayerTurn = false;
        if (PlayerObject!=null && PlayerStatistic!=null)
        	EnemyUtils.EnemiesMove(PlayerObject);
  	//Zostanie zmienione na co艣 konkretniejszego o ruchach
      	UiUtils.AddLog("Player Turn");
        IsPlayerTurn = true;
    }

Dodatkowo parametr PlayerObject zostanie om贸wiony w nast臋pnym punkcie.

Poruszanie si臋 za nami

Skoro ju偶 wiemy, za kim maj膮 si臋 rusza膰, to przejd藕my do ruchu za nami. W klasie Enemy, doda艂em metod臋 MoveToPlayer, w kt贸rej pobieramy vector ruchu pomi臋dzy graczem a przeciwnikiem, a nast臋pnie skracamy do warto艣ci -1,0,1 ( w zale偶no艣ci, do strony, w kt贸r膮 ma si臋 porusza膰). Odbywa si臋 to w metodzie RoundEnemyMoves

 public void MoveToPlayer(GameObject playerObject)
        {       
            var moveVector = (Vector2)(transform.position- playerObject.transform.position);
            RoundEnemyMoves(ref moveVector);
            transform.eulerAngles=SetRotation(moveVector);
       
           if (Math.Abs(moveVector.x) > TOLERANCE || Math.Abs(moveVector.y) > TOLERANCE)
                AttemtMove<MovingObject>(moveVector);        
        }

Atak na gracza

Jak wspomina艂em na wst臋pie, wprowadzi艂em tak偶e kolizj臋, gdy przeciwnik wejdzie na gracza. Dodatkowo, dzi臋ki nowemu systemowi walki musia艂em sporo zmieni膰 logi. 馃檪 Ze wzgl臋du na charakter, jakby艣my m贸wili sami do siebie. Wypada艂oby to przebudowa膰 bardziej, ale to ju偶, gdy b臋d臋 pracowa艂 nad system s艂ownika.
W ka偶dym razie, je艣li przeciwnik natknie si臋 na nas, a dystans mi臋dzy nami wyniesie 1 (w przypadku walki bezpo艣rednie) 鈥 to w贸wczas przyst臋puje do ataku na nas.

 
 if (Distance==1)
    GameManager.Instance.FightSystem.AttackPlayer(EnemyCharacter);

Update UI

Dodatkowo doda艂em par臋 zmian do Interfejsu U偶ytkownika. Czyli jaki艣 pocz膮tkowy UI do naszych statystyk, p贸ki co HP i imi臋, wkr贸tce do艣wiadczenie i poziom r贸wnie偶 znajd膮 swoje miejsce.

LifeLike

Nowy panel w lewym G贸rnym rogu

Podsumowanie

To tyle na dzisiaj! My atakujemy przeciwnika, on atakuje nas.
Linki jak zwykle na githubie : https://github.com/aluspl/RogueLikeDSP
Nowy Player pod :聽https://aluspl.github.io/RogueLikeDSP/Versions/version5contrattack/