c# - Make an AI move to a collectable, call a method and fly back in Unity -


i want create follower ai sparx spyro. can see mechanics in video

https://youtu.be/2dicrivj2xc?t=5

sparx looks gems on ground, flies them , flies spyro. when flying them, gems start fly player too. sparx collecting gems.

i created functionality making gem fly player. let's call method

startmovingtoplayer(); 

sparx call method gem in script.

public class playerfollower : ai {     private void ontriggerenter(collider col) // entered trigger     {         collectable collectable = col.getcomponent<collectable>(); // try collectable script          if (collectable != null) // collectable?             collectable.startmovingtoplayer(); // make move player     } } 

so question is, how can make ai fly gem, call method, fly and have gems in trigger stored in queue because when there more 1 gem in trigger, ai has queue it.


so here's update, tried make follower collecting gems when having them stored in list

public class playerfollower : ai { private list collectablestocollect = new list(); // have gems in range stored here private bool iscollecting = false; // follower collecting gems? private float movementspeed = 10; // collecting speed

private void update() {     if (collectablesinrange()) // gems in range?     {         if (!iscollecting) // collecting queued?             movetocollectable(); // collect     }     else     {         // follow player     } }  private void ontriggerenter(collider col) {     collectable collectable = col.getcomponent<collectable>(); // gem      if (collectable != null) // object gem?     {         if (!collectable.getmovementstate()) // got gem collected?             collectablestocollect.add(collectable); // add queue     } }  private void ontriggerexit(collider col) {     collectable collectable = col.getcomponent<collectable>();      if (collectable != null)         collectablestocollect.remove(collectable); // remove queue }  private void movetocollectable() // start collecting {     iscollecting = true;       if (collectablesinrange())     {         collectable collectable = collectablestocollect.first(); 1 gem         vector3 defaultposition = transform.position;          transform.position = vector3.movetowards(transform.position, collectable.getcollectableposition(), movementspeed * time.deltatime); // move gem          collectable.startmovingtoplayer(); // call gems movement          transform.position = vector3.movetowards(transform.position, defaultposition, movementspeed * time.deltatime); // move player          collectablestocollect.remove(collectable); // remove queue          iscollecting = false;          if (collectablesinrange()) // collect again, when list not empty             movetocollectable();     } }  private bool collectablesinrange() {     return collectablestocollect.count > 0; // there gems in range? } 

}

here's do:

you have code on gem (collectable) , code on collecting-ai (playerfollower).

playerfollower needs trigger represents search-radius , needs collider represents physical position. put ai on own physical layer. collectables require same setup, advise set trigger on same layer ai, while collision should on same world (so can touch it, ai passes through).

whenever object enters trigger of playerfollower has component of type collectable, store in list<collectable>. whenever object exits trigger of playerfollower has component of type collectable, remove list. that's how track can collected , not.

now when object enters trigger , gets added, check if have current target move , if not, set added object target.

when ai enters trigger of object, object gets ontriggerenter fired , recognizes ai. calls method on ai states collected , sets boolean can read other objects true, stating collected , not part of world anymore.

this method removes object list , searches next target (in list). when nothing can found, goes player , waits next object collect.


possible (not tested) implementation ai:

public class playerfollower : ai  {     list<collectable> possibletargets = new list<collectable>();     collectable target;          void ontriggerenter(collider other)     {         collectable collectable = other.getcomponent<collectable>();           if (collectable != null && !collectable.collected)         {             possibletargets.add(collectable);             setnexttarget();         }     }      public void collect(collectable collectable)     {         possibletargets.remove(collectable);         setnexttarget();     }      void setnexttarget()      {         target = null;         for(int = 0; < possibletargets.count; i++)             if(!possibletargets[i].collected)             {                 target = possibletargets[i];                 return;             }     } } 

possible (not tested) implementation gem:

public class collectable : monobehaviour {     private bool collected;     public bool collected { { return collected; } }      void ontriggerenter(collider other)     {         playerfollower ai = other.getcomponent<playerfollower>();           if (ai != null)         {             collected = true;             ai.collect(this);         }     } } 

Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -