sztuczna inteligencja - unity

0

Mam mianowicie mały problem . Moze go rozpisze bo sam tytuł nic nie mowi . Chodzi o to , że za moją postacia chodzi pomocnik . Utworzyłem sobie kolekcje w której znajdują sie moi wrogowie . Jak sprawdzic o której postaci z listy podszedł moj pomocnik wraz ze mna i go atakował . Jak pobrac index postaci z listy . Bo jak na razie zrobiłem cos takiego ze kiedy moja postac wraz z nim podejdzie do danego wroga to wtedy index wynosi zawsze zero ....
Ponizej wstawiam kod :

using Assets.Scripts.Poziom1;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WodzAI : MonoBehaviour {
public Transform barbarzynca;
public Transform naomi;

public List<Enemy> potwory;

idWroga idWroga;
public GameObject wrogowie;



public int index;



//public Transform head;
//string state = "patrol";
//public GameObject[] punkty;
//int index;
//float dokladnoscPunkt = 5.0f;

Animator anim;

public static bool czyZakonczonoRozmowe;
public static bool czyZaatakowacOrka;

// Use this for initialization
void Start () {

    anim = GetComponent<Animator>();
    idWroga = wrogowie.GetComponentInChildren<idWroga>();

    
}

// Update is called once per frame
void Update ()
{
    //czyZaatakowacOrka = false;
 //   Debug.Log("Czy zaatakowano orka przez wodza " + " " + czyZaatakowacOrka.ToString());
   // Debug.Log(Vector3.Distance(barbarzynca.transform.position, this.transform.position).ToString());
    BiegnijPoTrasieDoCelu();
}
public void BiegnijPoTrasieDoCelu()
{
    
    Vector3 kierunek = barbarzynca.position - this.transform.position;
    kierunek.y = 0;
    if (index == 8)
    {
        //czyZaatakowacOrka = true;
        czyZaatakowacOrka = false;
        Debug.Log("Index == 5");
    }

    if (czyZakonczonoRozmowe == true && czyZaatakowacOrka == false)
    {
        float dystans = Vector3.Distance(barbarzynca.position, this.transform.position);

        // Debug.Log("Dystans postaci od goblina to = " + dystans);
        anim.SetBool("postoj", false);
        if (dystans < 10)
        {

            Vector3 zobaczPozycja = barbarzynca.transform.position - this.transform.position;
            zobaczPozycja.y = 0;

            this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(zobaczPozycja), 1.0f);

            anim.SetBool("atak1", false);
            anim.SetBool("atak2", false);


            if (zobaczPozycja.magnitude > 1.6f)
            {
                anim.SetBool("bieg", true);

                anim.SetBool("atak1", false);
                anim.SetBool("atak2", false);
                this.transform.Translate(0, 0, 3.0f * Time.deltaTime);
                // Debug.Log("Bieg powinien");
            }
            else
            {
                anim.SetBool("postoj", true);
                anim.SetBool("bieg", false);
                anim.SetBool("atak1", false);
                anim.SetBool("atak2", false);

            }
        }

        else
        {
            anim.SetBool("bieg", false);
            anim.SetBool("atak1", false);
            anim.SetBool("atak2", false);
            anim.SetBool("postoj", true);
        }
    }
    else if (czyZakonczonoRozmowe == true && czyZaatakowacOrka == true)
    {
        //idWroga.id_wroga = potwory[index].id;
        for (index = 0; index < potwory.Count; index++)
        {
            index = idWroga.id_wroga;
            if (idWroga.id_wroga == potwory[index].id)
            {
                Debug.Log("Postac ktora zaatakowano to: " + " " + potwory[index].id.ToString());
                float dystans = Vector3.Distance(potwory[index].potwor.transform.position, this.transform.position);
                //Debug.Log("ORK WALKA WODZ");
                anim.SetBool("postoj", false);
                //anim.SetBool("straszenieAtak",false);
                if (dystans < 10)
                {

                    Vector3 zobaczPozycja = potwory[index].potwor.transform.position - this.transform.position;
                    zobaczPozycja.y = 0;

                    this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(zobaczPozycja), 1.0f);

                    anim.SetBool("atak1", false);
                    anim.SetBool("atak2", false);
                    // Debug.Log("Dystans mniejszy niz 5");

                    if (zobaczPozycja.magnitude > 1.5f)
                    {

                        anim.SetBool("bieg", true);
                        anim.SetBool("atak1", false);
                        anim.SetBool("atak2", false);
                        this.transform.Translate(0, 0, 0.1f);
                        ///Debug.Log("Bieg powinien");
                    }
                    else
                    {
                        // Debug.Log("Powinien atakowac Wodz");
                        anim.SetBool("bieg", false);
                        anim.SetBool("atak1", true);
                        anim.SetBool("atak2", true);

                        // Debug.Log("powinien atakowac");
                    }
                }
                else
                {
                    anim.SetBool("bieg", false);
                    anim.SetBool("atak1", false);
                    anim.SetBool("atak2", false);
                    anim.SetBool("postoj", true);
                    //Debug.Log("stoi");

                }
            }
        }
    }
    else if (czyZakonczonoRozmowe == false)
    {
        this.transform.Translate(0, 0, 0);
        anim.SetBool("postoj", true);
    }
}

}

2

Patrząc na kod, ten typ gry i tak jest na razie ponad Twoje możliwości...
Ile Ty rzeczy wrzuciłeś w jedną funkcję....

Programujesz obiektowo. Po co odnosić się do wrogów po konkretnych indeksach?
Jak chcesz usunąć wroga z listy, to piszesz potwory.Remove(instancjaPotwora), a najlepiej niech potwór sam się usuwa z listy w swojej metodzie Die().

Klasa gracza nie powinna mieć w sobie listy wrogów. Dla wrogów powinieneś napisać oddzielny menadżer, do którego zarówno wróg , jak i gracz mieli by dostęp (singleton). Przez ten menadżer byś tworzył i usuwał wrogów, a także znajdywałbyś najbliższych wrogów dla danej pozycji. Zwracałbyś wtedy referencję do wroga, a nie indeks. Na indeksach byś operował jedynie w pętli for (bo to ponoć wydajniejsze niż foreach).

0

Dodałem kod i opis problemu z myślą że dostanę jakąś konkretną odpowiedź... A jak zawsze na polskim forum trzeba się czepiać szczegółów. Czegoś co w danym momencie nie jest potrzebne. Tak wiem co ta są klasy, tak wiem co to jest programowanie obiektowe... Ale nie zadałem pytania o wygląd kodu tylko o konkretny problem. ale jak zwykle ktoś się musiał przyczepić do czegoś CP nie ma znaczenia w danym momencie... Ta klasa jest a właściwie była tworzona na szybko. Spokojnie później sobie ją rozbije na inne klasy. A co do problemu już nie musicie odpowiadać. Sam sobie poradziłem patrząc na odpowiedzi.

0

Skoro prosisz o pomoc, to wypadałoby trochę grzeczniej?
Kolekcje mają metodę FindIndex() proponuję skorzystać.

2
podlas15 napisał(a):

Dodałem kod i opis problemu z myślą że dostanę jakąś konkretną odpowiedź... A jak zawsze na polskim forum trzeba się czepiać szczegółów. Czegoś co w danym momencie nie jest potrzebne. Ta klasa jest a właściwie była tworzona na szybko. Spokojnie później sobie ją rozbije na inne klasy.

To nie są szczegóły. Nawet kod wkleiłeś byle jak, "na szybko", bez formatowania. Temat nic nie mówi o problemie... Na "niepolskim forum" (StackOverflow?) miałbyś duuużego minusa do reputacji.

Gdybyś od początku miał kod, który robi konkretną rzecz, a nie odwala całą logikę aplikacji, to analiza byłaby konkretna.

Tak wiem co ta są klasy, tak wiem co to jest programowanie obiektowe... Ale nie zadałem pytania o wygląd kodu tylko o konkretny problem. ale jak zwykle ktoś się musiał przyczepić do czegoś CP nie ma znaczenia w danym momencie...

Wrzucanie kiepskiego kodu, w dodatku rozjechanego przez brak formatowania, to wyraz braku szacunku dla odpowiadających: "macie moje g...., patrzcie i analizujcie".

Poza tym Twój kod nadawał się tylko do refaktoryzacji, która wyeliminowałaby potrzebę znajdywania indeksów poszczególnych wrogów... Gdybyś od początku kod projektował jak należy, to byś się nie natknął na wiele powikłań wynikających ze złego kodu.

A co do problemu już nie musicie odpowiadać. Sam sobie poradziłem patrząc na odpowiedzi.

Hahah, bardzo śmieszne...
Sam - patrząc na odpowiedzi.
Arogancja to bardzo zła cecha dla początkującego.
Cieszę się, że pomogłem :) Należy się plus i akceptacja odpowiedzi.

0

Polecam się zaciekawić NavMeshAgent będzie ci łatwiej zaprogramować AI jest do bardzo dopracowane a do małych gierek jak znalazł

1 użytkowników online, w tym zalogowanych: 0, gości: 1