Hey,
I’ve got a sort of zombie game, with the enemy AI using navmesh as seen here:
var Target : Transform;
var distance : int;
var Health : int = 3;
var tarmoney : int;
var moneySpawn : GameObject;
var player : GameObject;
var playerDistance : int;
var CPU : GameObject;
var isTargetPlayer : boolean;
var attacking : boolean;
var moveSpeed : int;
var rotationSpeed : int;
var myTransform : Transform;
public var following = boolean;
var exploder : boolean;
var explosion : GameObject;
var splitter : boolean;
var split : GameObject;
private var NavComponent: NavMeshAgent;
function Start()
{
NavComponent = this.transform.GetComponent(NavMeshAgent);
player = GameObject.Find("Player");
CPU = GameObject.Find("CPU");
Target = CPU.transform;
attacking = false;
myTransform = transform;
following == true;
}
function Update()
{
if(following)
{
NavComponent.SetDestination(Target.position);
}
transform.LookAt(Vector3(Target.position.x, transform.position.y, Target.position.z));
if(playerDistance <=4)
{
following == false;
}
else
{
following == true;
}
// determine target
if(playerDistance < 10)
{
Target = player.transform;
isTargetPlayer = true;
}
else
{
Target = CPU.transform;
isTargetPlayer = false;
}
// determine target
//determine distance from player
playerDistance = Vector3.Distance(player.transform.position, transform.position);
distance = Vector3.Distance(Target.transform.position, transform.position);
//determine distance from player
//determine when to attack
if(distance <= 2)
{
if(exploder)
{
Explode();
}
else
if(!attacking)
{
Invoke("SubtractHealth",1);
attacking = true;
}
}
//determine when to attack
//determine when to die
if(Health > 3)
{
Health = 3;
}
if(Health < 0)
{
Health = 0;
}
if(Health == 0)
{
Instantiate(moneySpawn, transform.position, transform.rotation);
Destroy(gameObject);
}
//determine when to die
if(isTargetPlayer)
{
tarmoney = Target.GetComponent(PlayerAttributes).Money;
}
//look at target
if(following)
{
}
else
{
transform.LookAt(Vector3(Target.position.x, transform.position.y, Target.position.z));
}
//look at target
}
function SubtractHealth()
{
if(isTargetPlayer == false)
{
CPU.GetComponent(CPUAttributes).ApplyDamage(2);
}
else
{
player.GetComponent(PlayerAttributes).ApplyDamage(3);
}
attacking = false;
}
function OnTriggerEnter(other: Collider)
{
if(other.tag == "Shot")
{
if(splitter == false)
{
Health --;
}
else
{
Split();
}
}
}
function Explode()
{
yield WaitForSeconds(1);
player.GetComponent(PlayerAttributes).ApplyDamage(10);
Destroy(gameObject);
Instantiate (explosion, transform.position, transform.rotation);
}
function Split()
{
Destroy(gameObject);
var size = 1;
for (var i = 0; i < 4; i++)
{
var angle = 36 * i;
var rad = angle * Mathf.PI / 180.0F;
var x = Mathf.Cos(rad);
var z = Mathf.Sin(rad);
Instantiate(split, transform.position + Vector3(x * size, 0, z * size), Quaternion.identity);
}
}
The part that isnt working is here:
function Update()
{
if(following)
{
NavComponent.SetDestination(Target.position);
}
transform.LookAt(Vector3(Target.position.x, transform.position.y, Target.position.z));
if(playerDistance <=4)
{
following == false;
}
else
{
following == true;
}
Basically I need the enemies to stop walking towards the player when they get close to him, because if they dont they clip and end up spinning the character model around. Not to mention it looks wrong.
Thing is, that doesnt work. When they get that close the navmesh agent continues to function and they continue to move forward.
How can I accomplish this?