Hi, all. I’m working on my AI, but I have a problem. I borrowed the CanSeeTarget() : boolean function from the tutorial, but It causes my enemy To rotate at a very fast rate. I was wondering if there was a way to fix this. All help is appreciated.
Here is my code:
enum s
{
Idle,
Pursuit,
Shooting
}
var Player : GameObject;
var walkSpeed : float;
var runSpeed : float;
var obstacleAvoidanceLevel : float;
var patrolChangesInterval : float;
var shootRange : float;
var noticeRange : float;
var showGizmosInEditor : boolean;
var gun : AIGun;
var Controller : CharacterController;
@HideInInspector
var state : s;
private var lastChange : float;
private var moveSpeed : float;
function Awake()
{
patrolChangesInterval += Random.Range(-1.5, 1.5);
moveSpeed = walkSpeed;
}
function Update()
{
Controller.Move(-Vector3.up * Time.deltaTime * 10);
Controller.Move(transform.forward * moveSpeed*Time.deltaTime);
if(Time.time > lastChange)
{
lastChange = Time.time + patrolChangesInterval;
ChangeDirection();
}
var hit : RaycastHit;
if(Physics.Raycast(transform.position, transform.forward, hit, obstacleAvoidanceLevel))
{
if(hit.collider.tag != "Player")
{
ChangeDirection();
}
}
var dist : float;
dist = Vector3.Distance(Player.transform.position, transform.position);
if(dist < noticeRange && dist > shootRange && CanSeeTarget())
{
state = s.Pursuit;
moveSpeed = runSpeed;
} else if(dist < shootRange && CanSeeTarget())
{
state = s.Shooting;
moveSpeed = 0;
} else {
state = s.Idle;
moveSpeed = walkSpeed;
}
if(state != s.Idle)
{
transform.LookAt(Player.transform);
if(state == s.Shooting)
{
gun.Shoot();
}
}
}
function ChangeDirection ()
{
transform.Rotate(Vector3(0, Random.Range(90, 270), 0));
}
function CanSeeTarget () : boolean
{
var hit : RaycastHit;
if (Physics.Linecast (transform.position, Player.transform.position, hit))
return hit.collider.gameObject == Player;
return false;
}
function OnDrawGizmosSelected ()
{
if(showGizmosInEditor)
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, noticeRange);
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, shootRange);
}
}