Tak, tym razem na serio, będę kontynuował walkę bezpośrednią. Zauważyłem, że jeśli skupię się na kodzie i robię wpis “Code First”, a nie “Theory First” – jak to miało miejsce w poprzednim wpisie, to powstaje dużo kodu, a zostaje mało czasu na jego opis. Będę więc się trochę streszczał. 🙂
Refactoring LifeLike
Z racji wkurzających żółtych podpowiedzi w nowym Rider oraz paru pomysłów związanych z przeciwnikami, postanowiłem zrobić lekką refaktoryzację – w tym zmiany namespace i foldery plików + parę narzędzi do zarządzania przeciwnikami.
Wróg… jest czerwony!
W poprzednim wpisie wspominałem o inspiracji Superhot, w tym postanowiłem słowa zamienić w czyny i stworzyć tego wroga. Jest to, lekka modyfikacja naszego playera, który swoją drogą, również zmienił grafikę. W przyszłości, każdy zasłuży na swój własny wygląd.W tym, będzie po prostu Red Manem ..i wygląda tak:
Przeciwniku, pojaw się na mapie!
A przy okazji dodaj się do listy Przeciwników, aby łatwo Cię było potem wybrać … i zabić.
…
private void AddEnemy(MapElement[,] map, int x, int y) { if (MaxEnemies <= 0) return; var chance = _random.Next(100)==1; if (chance) return; if (map[x,y]!=MapElement.Floor) return; var enemy=Instantiate(Enemies.FirstOrDefault(), GetPosition(x, y), Quaternion.identity , EnemiesCollection); GameManager.Instance.AddEnemy(enemy); MaxEnemies--; }
Założyłem sobie, że przeciwnik musi pojawić się na podłodze, a nie w ścianie. A i musi być w ograniczonej liczbie. 🙂 Póki co, generator działa ze zbyt dużą częstotliwością, więc szansa na pojawienie się przeciwnika jest bardzo duża – za duża.
Ale cóż, ważne, że takim oto sposobem, nasz czerwony wróg pojawił się na mapie !
Przeciwniku, bądź Oznaczony!
Kolejnym kluczowym elementem, jest wiedza … kogo zaatakowaliśmy. 🙂
…
Przeciwnik dostał ten sam shader, co podłoga, więc nie jest widoczny w nocy, ale dodałem mu jakiś element oznaczenia. Małą lampkę, która oznacza, że przeciwnik jest zaznaczony. Zaznaczenia zmieniamy, przez kliknięcie TAB (lub innego przypisanego klawisza)
private void SelectEnemy() { if (Enemies.Count < = 0) return; if (EnemyUtils.EnemyIndex == Enemies.Count) EnemyUtils.EnemyIndex = 0; foreach (var enemy in Enemies) { enemy.IsSelected = false; } Debug.Log("Selected Enemy: "+EnemyUtils.SelectedEnemy.EnemyCharacter.Name + "Current Index: "+ EnemyUtils.EnemyIndex); Enemies[EnemyUtils.EnemyIndex].IsSelected = true; EnemyUtils.EnemyIndex++; }
Podsumowanie
To tyle w dzisiejszym odcinku. Temat kontynuowany będzie też w następny wpisie. Jak widać, nie jest to wcale mało rozbudowany system, a gdy będziemy chcieli do tego dodać jeszcze walkę dystansową i mierzenie, czy dany przeciwnik faktycznie jest w zasięgu bezpośredniego czy dalekiego ataku, to system będzie naprawdę sporo rozbudowany. Nie zapominajmy też, że będzie UI, szansa trafienia oraz okno z logiem naszych ataków.
Link do gry i aktualnej wersji jak zwykle na githubie