- Home /
AI Avoiding Obstacles!
I need help making an AI. It's working really great, but the AI is not avoiding walls, obstacles etc. If the enemy is on the right side of the wall, and im on the left, the enemy will keep trying to go throughout the wall (Will be still facing me instead of avoiding the wall).
Can somebody edit the script to make it avoid things?
var target : Transform;
var gravity : float = 20;
var moveSpeed : float = 6; // chase speed
var rotSpeed : float = 90; // speed to turn to the player (degrees/second)
var attackDistance : float = 2; // attack distance
var detectRange : float = 20; // detection distance
var otherObj : GameObject;
var otherObj2 : GameObject;
var dangermusic : GameObject;
var BipedMesh : GameObject;
var Bipedv : GameObject;
var AllFourv : GameObject;
private var transf : Transform;
private var character: CharacterController;
function Start () {
if (!target) target = GameObject.FindWithTag ("Player").transform;
transf = transform;
character = GetComponent(CharacterController);
}
function Update(){
if (target){
var tgtDir = target.position - transf.position;
var tgtDist = tgtDir.magnitude; // get distance to the target
if (!Physics.Raycast(transf.position, tgtDir, detectRange)){
// stays in idle mode if can't see target
Idle();
}
else {
var moveDir = target.position - transf.position;
moveDir.y = 0; // prevents enemy tilting
rot = Quaternion.FromToRotation(Vector3.forward, moveDir);
transf.rotation = Quaternion.RotateTowards(transf.rotation, rot, rotSpeed * Time.deltaTime);
if (tgtDist <= attackDistance){ // if dist <= attackDistance: stop and attack
// do your attack here
print("Attack!");
otherObj2.animation.Play();
BipedMesh.animation.Play("devmesh2");
otherObj.animation.Play("phoenixfreeroamjp");
}
else { // if attackDistance < dist < detectRange: chase the player
// Move towards target
MoveCharacter(moveDir, moveSpeed);
audio.volume = 1.0;
dangermusic.audio.volume = 0.0;
}
}
}
}
var walkSpeed = 3.0;
var travelTime = 2.0;
var idleTime = 1.5;
var rndAngle = 45; // enemy will turn +/- rndAngle
private var timeToNewDir = 0.0;
private var turningTime = 0.0;
private var turn: float;
function Idle () {
// Walk around and pause in random directions
if (Time.time > timeToNewDir) { // time to change direction?
turn = (Random.value > 0.5)? rndAngle : -rndAngle; // choose new direction
turningTime = Time.time + idleTime; // will stop and turn during idleTime...
timeToNewDir = turningTime + travelTime; // and travel during travelTime
}
if (Time.time < turningTime){ // rotate during idleTime...
transform.Rotate(0, turn*Time.deltaTime/idleTime, 0);
} else { // and travel until timeToNewDir
MoveCharacter(transform.forward, walkSpeed);
audio.volume = 0.0;
dangermusic.audio.volume = 1.0;
Bipedv.renderer.enabled = true;
AllFourv.renderer.enabled = false;
}
}
function MoveCharacter(dir: Vector3, speed: float){
var vel = dir.normalized * speed; // vel = velocity to move
// clamp the current vertical velocity for gravity purpose
vel.y = Mathf.Clamp(character.velocity.y, -30, 2);
vel.y -= gravity * Time.deltaTime; // apply gravity
character.Move(vel * Time.deltaTime); // move
Bipedv.renderer.enabled = false;
AllFourv.renderer.enabled = true;
}
Just use a Nav$$anonymous$$esh ins$$anonymous$$d. Link to tutorial.
If the enemy is on the right side of the wall, and im on the left, the enemy will keep trying to go throughout the wall
Have you checked whether this "wall" has a correct physics collider? Your line 27 should prevent "seeing" through the wall so actually, your enemy should idleing around ins$$anonymous$$d of trying to bump into the wall.
Try simplefying your scene (backup first!) or placing Logging statements all over the place to find out why the Physics-raycast does not kick in correctly.
To do this you need some sort of pathfinding. This is a sortof advanced concept, but Unity comes with a great and easy bultin system for this! Follow the link posted by @Baste and make his comment the awnser!
I agree with Baste. Learn to use Nav$$anonymous$$esh. This is becomes automated, so no further scripting for the AI about avoiding obstacles.