- Home /
AI walk through solid walls
The AI in my FPS walk right through solid walls, I've box colliders, mesh colliders, rigid bodies but I can't get them to not walk through solid walls. Please help me out.
This is my AI script.
var distance;
var target : Transform;
var lookAtDistance = 15.0;
var stopDistance = 3;
var moveSpeed = 5.0;
var damping = 6.0;
var damage:float = 17;
var range = 100.0;
var force = 10.0;
var muzzleFlash : Renderer;
var muzzleLight : Light;
var Health = 100;
var deadReplacement : Transform;
var dieSound : AudioClip;
static var isDead = false;
static var allowfire : boolean = true;
function Start (){
muzzleFlash.enabled = false;
muzzleLight.enabled = false;
allowfire = true;
}
function Update () {
target = GameObject.FindWithTag("Player").transform;
distance = Vector3.Distance(target.position, transform.position);
if((distance < lookAtDistance)){
lookAt ();
}
if(allowfire == true){
fire();
}
}
function lookAt (){
var rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping);
transform.Translate(Vector3.forward * moveSpeed *Time.deltaTime);
animation.Play("walk");
}
function ApplyDammage (TheDammage : int)
{
Health -= TheDammage;
if(Health <= 0)
{
Dead();
}
}
function Dead () {
// Destroy ourselves
Destroy(gameObject);
Destroy(transform.parent.gameObject);
// Play a dying audio clip
if (dieSound)
AudioSource.PlayClipAtPoint(dieSound, transform.position);
}
static function CopyTransformsRecurse (src : Transform, dst : Transform) {
dst.position = src.position;
dst.rotation = src.rotation;
for (var child : Transform in dst) {
// Match the transform with the same name
var curSrc = src.Find(child.name);
if (curSrc)
CopyTransformsRecurse(curSrc, child);
}
}
function fire(){
allowfire = false;
audio.Play();
var direction = transform.TransformDirection(Vector3.forward);
var hit : RaycastHit;
// Did we hit anything?
if (Physics.Raycast (transform.position, direction, hit, range)) {
Debug.DrawRay(transform.position, direction * range, Color.green);
// Apply a force to the rigidbody we hit
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
muzzleFlash.renderer.enabled = true;
muzzleLight.enabled = true;
yield WaitForSeconds (0.04);
muzzleFlash.renderer.enabled = false;
muzzleLight.enabled = false;
yield WaitForSeconds(0.3);
allowfire = true;
}
function OnTriggerEnter(hit:Collider){
if(hit.tag == "Player"){
hit.transform.SendMessage("Damage",damage);
}
}
$$anonymous$$aybe make the rigidbody's collision mode "continuous dynamic"
Answer by fafase · Feb 02, 2014 at 07:23 PM
You are moving with Translate which does not consider collision unless you make the code for it. You should go for the Character Controller.
http://unitygems.com/basic-ai-character/ this has a tutorial with what is about t become the old Character Controller since Unity is developing a new version. But that should get you going.
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Can someone help me fix my Javascript for Flickering Light? 6 Answers
Unity3D Ai wont shoot 1 Answer
Setting Scroll View Width GUILayout 1 Answer
Enemy AI With changing Player 0 Answers