- Home /
why my wander script makes my enemies move badly?
Hi everyone! I'm using this script to make my enemies move randomly around the map; everything works fine, except that sometimes the enemies are rotated in one direction, but the body moves in the opposite direction (they walk like shrimp). The problem becomes more frequent when reducing the screen resolution or when opening the application in windowed mode, but exists in any situation.
PS: this code is part of a system composed by 3 codes, that manage the movements and the artificial intelligence of the monsters: if you think it can be useful I can show you also the others
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(CharacterController))]
public class EnemyAI : MonoBehaviour
{
public float speed = 5;
public float directionChangeInterval = 1;
public float maxHeadingChange = 30;
CharacterController controller;
float heading;
Vector3 targetRotation;
void Awake()
{
controller = GetComponent<CharacterController>();
heading = Random.Range(0, 360);
transform.eulerAngles = new Vector3(0, heading, 0);
StartCoroutine(NewHeading());
}
void Update()
{
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, targetRotation, Time.deltaTime * directionChangeInterval);
var forward = transform.TransformDirection(Vector3.forward);
controller.SimpleMove(forward * speed);
}
IEnumerator NewHeading()
{
while (true)
{
NewHeadingRoutine();
yield return new WaitForSeconds(directionChangeInterval);
}
}
void NewHeadingRoutine()
{
var floor = Mathf.Clamp(heading - maxHeadingChange, 0, 360);
var ceil = Mathf.Clamp(heading + maxHeadingChange, 0, 360);
targetRotation = new Vector3(0, heading, 0);
}
}
Answer by MUG806 · Feb 20, 2021 at 11:34 PM
Try increasing the value of "directionChangeInterval".
Also not sure if its a problem or not, but you can tidy up your code in update to avoid having to use TransformDiraction at all, by using transform.forward:
void Update()
{
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, targetRotation, Time.deltaTime * directionChangeInterval);
controller.SimpleMove(transform.forward * speed);
}