Unity || Bot AI


#1

Dzisiaj po wielu trudach i przeciwnościach losu, postanowiłem że zabiorę się za zrobienie prostej gry na androida i do ogrania na pc. Naprawdę nic złożonego, bez tekstur tylko z samymi kolorami i akcja niczym w greckim przedstawieniu o jedności czasu miejsca akcji. Nie chcę dużo opisywać żeby nie zapeszać. Mam zaplanowane po kolei czym się chce zajmować i co prawda do tego momentu nie doszedłem, jednak wstępnie rozeznać się mogę…

Jakie byłyby metody dobre na randomizowanie ataków przeciwnika, wychwytywanie ataków gracza do obrony i zachodzenie gracza z boków podczas podchodzenia? Założeniem jest że i gracz i bot mieliby tyle samo “akcji” które kończyłyby się atakiem bądź blokadą i zależnie od tagu na kolizji (lub jej braku)atak kończyłby się zabraniem hp, odbiciem ataku, bądź po prostu zakończeniem ruchu.

W głowie mam mniej więcej jak można te wychwytywanie kolizji zrobić ale ta botowska kombinatoryka ataku trochę mnie przeraża, do tej pory to moi przeciwnicy byli jak ci u serious sama :confused: .


#2

Po pierwsze - czy masz jakieś doświadczenie z programowaniem w C#? Nie mam na myśli tutoriala do Unity, tylko pisania kodu w czystym C#. Takiego który wyświetla wyjście w konsoli.

Dlaczego pytam? Bo wydaje mi się, że gdybyś umiał swobodnie programować to nie zadawałbyś tego pytania.

Wracając do sedna - załóżmy że istnieją następujące metody ataku
//pseudokod
void machnijSfordem(){}
void machnijAksem(){}
void kastnijSpella(){}
.
.
.
//list goes on

Możemy sobie zdefiniować zmienną

int wybieraczAtaku = Random.Range(0, iloscAtakow);

i na jej podstawie dokonać wyboru

switch(wybieraczAtaku){
case 0:
machnijSfordem();
break;
case 1:
machnijAksem();
break;
// i tak dalej
}

Inny sposób (który umożliwi Ci określenia prawdopodobieństwa każdego ataku)

int wybieraczAtaku = Random.Range(0, 100);

if(wybieraczAtaku>0 && wybieraczAtaku<50)
machnijSfordem();

else if(wybieraczAtaku>=50 && wybieraczAtaku<60)
kastnijSpella();

//i tak dalej

Jeżeli chodzi o reagowanie na ataki przeciwnika - możemy u postaci określić zmienną:

string wykonanyAtak; //polecam enumami

I w trakcie wykonywania ataku przypisywać jej odpowiednią wartość:

void machnijAksem(){
wykonanyAtak=“AKS”;
//…
}

Potem w metodzie określającej jak ma dana postać reagować

void reaguj(przeciwnik){
switch(przeciwnik.wykonanyAtak){
case “AKS”:
//Można wykorzystać dowolny z wcześniej wspomnianych sposobów
}
}

To powinno dać Ci kilka pomysłów.


#3

Oh dzięki ci panie za łaskę zbawienną, nie jestem programistą 15k i nigdy nie pisałem w c# bezpośrednio do terminala, czasami się zastanawiam czy to źle czy dobrze :confused: .