Wandering,Chase and Idle AI in Unity 3D.

BANANAMAN

Resident Star Battle Expert.
Reaction score
150
I want an AI wherein the object with the AI will initially idle when the game starts,Suddenly wander/move around at random and when the player control object reaches a certain range it begins to chase it.

I was thinking of having the AI have 3 states,Wandering,Chase and Idle where Idle is the default AI. From time to time it will mostly wander around the scene (while switching to idle state depending on a random integer) but then when the player controlled object is within a certain distance from it the AI will switch to chase state.

pesudo-code

Case:idle
//do nothing/play idle animation
status = rand()
if (status <= 0.5)
{
state = wander;
}
break;
Case:wander
//wander around/play wander animation
if ((plyrdist <= AIx) || (plyerdist <= AIy) || (plyrdist <= AIz))
{
state = chase;
}
else
{
status = rand()
if (status <= 0.5)
{
state = wander;
}
if ((status >= 0.5)&&(status <= 0.9))
{
state = idle;
}
}
break;

is there another way that's much more efficient to accomplish this?
 
I noticed that you have 3 states but only 2 cases. It might be easier to write your switch cases with the help of a FSM chart. I always do that before I start coding to help me see flaws of my AI systems and simple ways to optimize my code. In some cases I combine certain states together even.

Case:wander
//wander around/play wander animation
if ((plyrdist <= AIx) || (plyerdist <= AIy) || (plyrdist <= AIz))
{
state = chase;
}
else
{
status = rand()
if (status <= 0.5)
{
state = wander;
}
if ((status >= 0.5)&&(status <= 0.9))
{
state = idle;
}
}
break;

Btw there is a chance that when you chase you would suddenly switch back to idle suddenly.
 
Would this be slightly better?

chasethreashold = 3000;

CHARACTER_STATE:
Idle
Chase
Wander

void Start()
{
animation.Play("up_sword");
animation.Blend("idle");
currentState = CHARACTER_STATE.IDLE;
}

void Update()
{
case Idle:
//Do idling stuff
status = rand();
if((status >= 1000)||(status <= 3000));
{
currentState = CHARACTER_STATE.Wander;
}
break;
Case Wander:
//wandering stuff
if ((plyrdist <= AIx) || (plyerdist <= AIy) || (plyrdist <= AIz))
{
state = chase;
}
if(((plyrdistx+chasethreashold)<= AIx) || ((plyrdisty+chasethreashold) <= AIy) || ((plyrdistz+chasethreashold) <= AIz))
{
status = rand()
if (status <= 0.5)
{
state = wander;
}
}

The AI would now continue chasing until a certain distance is achieved between them. Would this prevent it from wandering in the middle of a chase?
 
Did you know that you can do this (playerpos.Position - aiPos.Position).magnitude in Unity3D?
Use the prefab function availble in Unity3D to help you along. They all inherit a few useful math functions like above.

For your AI bit I suggest you remove this bit:
if(((plyrdistx+chasethreashold)<= AIx) || ((plyrdisty+chasethreashold) <= AIy) || ((plyrdistz+chasethreashold) <= AIz))
{
status = rand()
if (status <= 0.5)
{
state = wander;
}
}

Into a chase case.
This will prevent confusion for you and it will prevent an AI state lock in the chase state.

Btw I am assuming state == currentState?

Also note that there is only a:
status = rand()
if (status <= 0.5)

Chance when the AI is out of the chasethreashold for it to return to the wander state. Also note that once your AI goes into the wander/chase state it can NEVER return to the idle state because there is no handle for that.
 
Did you know that you can do this (playerpos.Position - aiPos.Position).magnitude in Unity3D?
Use the prefab function availble in Unity3D to help you along. They all inherit a few useful math functions like above.

Can you explain further or link me to a tutorial?
 
Here are a few references for you:

Asset Workflow: http://unity3d.com/support/documentation/Manual/Asset Workflow.html
Prefabs: http://unity3d.com/support/documentation/Manual/Prefabs.

Here is a script reference for Transform: http://unity3d.com/support/documentation/ScriptReference/Transform.html

If your units/ai are game objects they should have the transform component. You can access this component by doing this:
Code:
myUnit.Transform.Position

This would return the units Vector3 position in the game world. With that you can do this:
Code:
const var alertDist : float = 500;
currentDistance = (myUnit.transform.position - aiUnit.transform.position).magnitude;

if ( currentDistance <= alertDist )
{
currentState = E_AI_STATE.CHASE;
}

You can also do this:
Code:
currentDistance = Vector.Distance( myUnit.transform.position, aiUnit.transform.position );
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    News portal has been retired. Main page of site goes to Headline News forum now
  • The Helper The Helper:
    I am working on getting access to the old news portal under a different URL for those that would rather use that for news before we get a different news view.
  • Ghan Ghan:
    Easily done
    +1
  • The Helper The Helper:
    https://www.thehelper.net/pages/news/ is a link to the old news portal - i will integrate it into the interface somewhere when i figure it out
  • Ghan Ghan:
    Need to try something
  • Ghan Ghan:
    Hopefully this won't cause problems.
  • Ghan Ghan:
    Hmm
  • Ghan Ghan:
    I have converted the Headline News forum to an Article type forum. It will now show the top 20 threads with more detail of each thread.
  • Ghan Ghan:
    See how we like that.
  • The Helper The Helper:
    I do not see a way to go past the 1st page of posts on the forum though
  • The Helper The Helper:
    It is OK though for the main page to open up on the forum in the view it was before. As long as the portal has its own URL so it can be viewed that way I do want to try it as a regular forum view for a while
  • Ghan Ghan:
    Yeah I'm not sure what the deal is with the pagination.
  • Ghan Ghan:
    It SHOULD be there so I think it might just be an artifact of having an older style.
  • Ghan Ghan:
    I switched it to a "Standard" article forum. This will show the thread list like normal, but the threads themselves will have the first post set up above the rest of the "comments"
  • The Helper The Helper:
    I don't really get that article forum but I think it is because I have never really seen it used on a multi post thread
  • Ghan Ghan:
    RpNation makes more use of it right now as an example: https://www.rpnation.com/news/
  • The Helper The Helper:
  • The Helper The Helper:
    What do you think Tom?
  • tom_mai78101 tom_mai78101:
    I will have to get used to this.
  • tom_mai78101 tom_mai78101:
    The latest news feed looks good

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top