Guida [Release] Waypoint IA

Stato
Discussione chiusa ad ulteriori risposte.

xDevily

Utente Emerald
9 Agosto 2012
925
101
183
528
Oggi vi spieghero come creare una semplicissima IA che segue una lista di waypoint per muoversi.
L'intero codice che utilizzero e' scritto in c#.

Bene una volta aperto il vostro caro Unity creiamo un nuovo script e lo chiamiamo Waypoint_IA.
XXbH1lnpseNXaOIdkbgYr_0Tz-m9duiMzXYIZrAFAOk=w550-h558-no

Una volta creato lo script lo apriamo in Mono Develop o qualunque altro programma che usate per scrivere gli script. Nel mio caso a me si aprira' Visual Studio.
Appenna apertlo lo script avremo una cosa simile:
Codice:
using UnityEngine;
using System.Collections;

public class Waypoint_IA : MonoBehaviour {
    // Use this for initialization
    void Start () {
  
    }
  
    // Update is called once per frame
    void Update () {
         }
}

La prima cosa da fare e' aggiungere:
Codice:
using System.Collections.Generic;
che ci permette di creare variabili di tipo List<>
Da cio appena detto si puo' gia immaginare quale sara' il passo successiovo;
dichiriamo la lista di waypoint:
Codice:
public List<Transform> waypoints; //Nota: la lista la dichiariamo come public cosi da poterla modificare dall'editor di Unity, inoltre dichiriamo una lista di transfom che e' il componente di ogni oggetto che ne indica la posizione
Aggiungiamo ora altre tre variabili:
Codice:
    public float speed = 5f; // velocita' con cui si muove  l'oggetto
    public float closeEnouth = 1f; // distanza minima dal waypoint per poter passare al prossimo
    int point = 0; // il numero del waypoint a cui il nostro oggetto punta

Ora il nostro codice sara' simile a questo:
Codice:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Waypoint_IA : MonoBehaviour {

  public List<Transform> waypoints;

  public float speed = 5f;
  public float closeEnouth = 1f;
  int point = 0;
//ho eliminato la funzione Start() perche' non ci serve
  
    // Update is called once per frame
    void Update () {
         }
}

Bene ora arriva la parte piu' "complicata"; per muovere il nostro oggetto useremo questa riga posta nella funzione Update():
Codice:
        this.transform.position = Vector3.MoveTowards(this.transform.position, waypoints[point].position, speed * Time.deltaTime);
this.transform.position indica la posizione corrente del nostro oggetto (NOTA: lo script va messo come Component dell'oggetto a che si vuole muovere!).
waypoints[point].position indica la posizione del waypoint selezionato dalla lista all'indice point.
speed * Time.deltaTime calcola la velocita con cui si vuole muovere l'oggetto.
Vector3.MoveTowards() e' una funzione di Unity che accettaa 3 parametri, il primo la posizione corrente, il secondo la posizione a cui si vuole andare, e il terzo e' la velocita;
Questa funzione restituisce una nuova posizione che assegnata al nostro oggetto lo fara muovere.
ora lo script si presentera cosi:
Codice:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Waypoint_IA : MonoBehaviour {

  public List<Transform> waypoints;

  public float speed = 5f;
  public float closeEnouth = 1f;
  int point = 0;
//ho eliminato la funzione Start() perche' non ci serve
  
    // Update is called once per frame
    void Update () {
      this.transform.position = Vector3.MoveTowards(this.transform.position, waypoints[point].position, speed * Time.deltaTime);
         }
}

Bene questo script e' gia funzionante ma fara andare il nostro oggetto solo al primo waypoint. Per poter passare ai successivi si deve aggiungere:
Codice:
        if (Vector3.Distance(this.transform.position, waypoints[point].position) < closeEnouth)
        {
            if (point + 1 < waypoints.Count)
                point++;
            else
                point = 0;
        }

Vector3.Distance(this.transform.position, waypoints[point].position calcola la distanza tra due posizioni gia note a noi, ovvero la posizione del waypoint e del nostro oggetto. Il risultato lo si compara a una variabile che indica la distanza minima dal waypoint per passare al successivo.
Se la condizione si verifica si puo' incrementare la variabile point, tuttavia bisogna fare attenzione a non prendere elementi all'esterno della nostra lista percio' vi e' la necessita di controllare che point non abbia valori maggiori del numero di waypoint.

Bene abbiamo gia terminato, lo scirpt finale e' una cosa del genere:
Codice:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Waypoint_IA : MonoBehaviour {

  public List<Transform> waypoints;

  public float speed = 5f;
  public float closeEnouth = 1f;
  int point = 0;
//ho eliminato la funzione Start() perche' non ci serve
  
    // Update is called once per frame
    void Update () {
  this.transform.position = Vector3.MoveTowards(this.transform.position, waypoints[point].position, speed * Time.deltaTime);

  if (Vector3.Distance(this.transform.position, waypoints[point].position) < closeEnouth)
  {
  if (point + 1 < waypoints.Count)
  point++;
  else
  point = 0;
  }
         }
}

Rimane l'ultimo passo creare i waypoint nella scena e aggiungerli alla lista dall'editor di Unity.
plZ4T0GesI6Nru-BlazmKerkT6aZVon6U_8vmKczwL4=w1916-h785-no
 
  • Mi piace
Reazioni: Hellew
Stato
Discussione chiusa ad ulteriori risposte.