I’m working on simple enemy AI, and now I’m forced to use Character Controller Component because terrain is not flat so It will prevent enemy from doing stutter movement.
Now problem is even when I limit it, so when enemy movement is on desired distance from player, it should stop, but character controller forces its way through player. Only way to really stop it is to limit calling that function, which is not what I want.
Code:
using UnityEngine;
public class Enemy : Entity {
[SerializeField]
private Transform target;
public float moveSpeed;
public float rotationSpeed;
public float combatRadius = 10.0f;
public float minDistance = 5.0f;
private float distance;
public bool isOnMinDistance;
public bool seePlayer;
private Transform myTransform;
private CharacterController controller;
private void Start () {
GameObject target = GameObject.FindGameObjectWithTag ("Player");
this.target = target.transform;
myTransform = transform;
controller = GetComponent<CharacterController> ();
}
private void Update () {
if (reaction == Reaction.Hostile) {
ChasePlayer ();
}
}
private void ChasePlayer () {
distance = Vector3.Distance (target.position, myTransform.position);
if (distance <= minDistance) { //attack
isOnMinDistance = true;
seePlayer = true;
}
else if (distance >= minDistance && distance <= combatRadius) {
Debug.DrawLine (new Vector3 (target.position.x, target.position.y + 1f, target.position.z), myTransform.position, Color.red);
LookAtTargetYAxis ();
FollowTarget ();
isOnMinDistance = false;
seePlayer = true;
}
else {
isOnMinDistance = false;
seePlayer = false;
}
}
private void FollowTarget () {
Vector3 forward = transform.TransformDirection(Vector3.forward * moveSpeed * Time.deltaTime);
controller.SimpleMove (forward);
}
private void LookAtTargetYAxis () {
transform.LookAt (target);
Vector3 angles = myTransform.rotation.eulerAngles;
angles.x = 0;
angles.z = 0;
transform.rotation = Quaternion.Euler(angles);
}
private void OnDrawGizmosSelected () {
Gizmos.DrawWireSphere (transform.position, combatRadius);
Gizmos.color = Color.red;
}
}
I would appreciate if someone could help me.