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ć “klocowaty” 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, 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).

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ą “IsPlayerTurn”, 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.

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/