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?
 

neo34rd

New Member
Reaction score
3
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.
 

BANANAMAN

Resident Star Battle Expert.
Reaction score
150
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?
 

neo34rd

New Member
Reaction score
3
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.
 

BANANAMAN

Resident Star Battle Expert.
Reaction score
150
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?
 

neo34rd

New Member
Reaction score
3
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.

      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