I am in the early stages of creating my own AI and so far, everything works as I had hoped EXCEPT changing a specific state: there is delay between “charge” and “attack” that I have no idea why. For a bout a second after it should switch, it just runs in place. Anyway, here is my code which will explain the states:
edit: not a delay. It goes back to the “Charge” state for some reason. It goes to “Attack” then back to “Charge”. Anyone have an idea why?
Thanks!
public var NMA : NavMeshAgent;
public var dest : Vector3;
public var distanceToPlayer : float=100;
public var player : Transform;
public var PH : Health;
public var damageAmount : float = 5;
public var forceAmount : float = 5;
private var tr : Transform;
private var isDead : boolean = false;
var intimidateDistace = 10.0;
var attackDistance = 3.0;
var noticeDistance = 15.0;
var curState : enemyState;
var Damping = 6.0;
var waiting = false;
var IntimidateTime=1.5;
var AttackTime=0.0;
var attackRepeatTime = 1;
var TurnTime=1.5;
var angle = 1.1;
private var CA : int;
var IdleA : AnimationClip[];
var TurnA : AnimationClip[];
var WalkA : AnimationClip;
var RunA : AnimationClip;
var IntimidateA : AnimationClip[];
var AttackA : AnimationClip[];
var anim : Animation;
public enum enemyState { start, idle, alert, patrol, find, intimidate, charge, attack, hit, dead, stop}
function Start () {
curState = enemyState.start;
tr = transform;
NMA=GetComponent.<NavMeshAgent>();
anim=GetComponent.<Animation>();
}
function Update () {
if(player==null)
{
player=GameObject.FindGameObjectWithTag("Player").transform;
PH=player.GetComponent.<Health>();
curState=enemyState.idle;
if(player!=null)
{
var iI = Random.Range(0,IdleA.Length);
anim.CrossFade(IdleA[iI].name);
}
return;
}
distanceToPlayer=Vector3.Distance(player.position,tr.position);
switch (curState) {
case enemyState.start:
break;
case enemyState.idle:
Idle();
break;
case enemyState.patrol:
break;
case enemyState.alert:
Alert();
break;
case enemyState.find:
Find();
break;
case enemyState.intimidate:
Intimidate();
break;
case enemyState.charge:
Charge();
break;
case enemyState.attack:
Attack();
break;
case enemyState.hit:
Hit();
break;
case enemyState.dead:
Dead();
break;
case enemyState.stop:
Stop();
break;
}
}
function Idle()
{
NMA.Stop();
if(distanceToPlayer<noticeDistance)
{
curState=enemyState.alert;
}
}
function Alert()
{
var rot = Quaternion.LookRotation(player.position - tr.position);
//Debug.Log(rotation);
tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * Damping);
//Debug.Log("The Enemy Has Noticed You");
yield WaitForSeconds(TurnTime);
anim.CrossFade(RunA.name);
curState=enemyState.find;
//waiting=true;
}
function Patrol()
{
}
function Find()
{
NMA.stoppingDistance=intimidateDistace;
NMA.SetDestination(player.position);
if(distanceToPlayer<=intimidateDistace)
{
NMA.Stop(true);
var iI = Random.Range(0,IntimidateA.Length);
anim.CrossFade(IntimidateA[iI].name);
IntimidateTime=IntimidateA[iI].length;
curState=enemyState.intimidate;
}
if(distanceToPlayer>=noticeDistance)
{
NMA.Stop();
var xX = Random.Range(0,IdleA.Length);
anim.CrossFade(IdleA[xX].name);
curState=enemyState.idle;
}
}
function Intimidate()
{
var rot = Quaternion.LookRotation(player.position - tr.position);
//Debug.Log(rotation);
tr.rotation = Quaternion.Slerp(tr.rotation, rot, Time.deltaTime * Damping);//Debug.Log("The Enemy Has Intimidated");
yield WaitForSeconds(IntimidateTime);
NMA.stoppingDistance=attackDistance;
NMA.SetDestination(player.position);
anim.CrossFade(RunA.name);
curState=enemyState.charge;
}
function Charge()
{
if(distanceToPlayer<attackDistance)
{
NMA.Stop(true);
CA = Random.Range(0,AttackA.Length);
//CA=iI;
anim.CrossFade(AttackA[CA].name);
//attackRepeatTime=AttackA[iI].averageDuration;
curState=enemyState.attack;
}
else if(distanceToPlayer>=noticeDistance)
{
NMA.Stop();
var xX = Random.Range(0,IdleA.Length);
anim.CrossFade(IdleA[xX].name);
curState=enemyState.idle;
}
}
function Attack()
{
var iI : int;
var xX: int;
/*if (Time.time > AttackTime)
{
iI = Random.Range(0,AttackA.Length);
attackRepeatTime=AttackA[iI].averageDuration;
anim.CrossFade(AttackA[iI].name);//Target.SendMessage("ApplyDammage", TheDammage);
AttackTime = Time.time + attackRepeatTime;
}
else*/
if(!anim.IsPlaying(AttackA[CA].name))
{
iI = Random.Range(0,AttackA.Length);
CA=iI;
anim.CrossFade(AttackA[CA].name);//Target.SendMessage("ApplyDammage", TheDammage);
}
if(distanceToPlayer>attackDistance)
{
xX = Random.Range(0,IdleA.Length);
anim.CrossFade(IdleA[xX].name);
curState=enemyState.idle;
}
}
function Hit()
{
}
function Dead()
{
}
function Stop()
{
NMA.Stop();
}