Enemy Problem

hey i am making a zombie game and i want the zombie to both go around an object instead for going through it and i want the zombie to stay on the ground if i am on a cube it starts to fly and if i am on the ground the enemy is in the ground half above and half below anyone have a idea how to fix that thanks.

Usually the enemies are CharacterControllers or rigidbodies - other objects will not detect collisions. This is a simple example of a CharacterController based AI script (based on a question I answered some time ago):

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

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!");
            }
            else {  // if attackDistance < dist < detectRange: chase the player
                // Move towards target
                MoveCharacter(moveDir, moveSpeed);
            }
        }
    }
}

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);
    }
}

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
}

To use it, add a CharacterController and this script to your current enemy.

NOTE: Remember to tag the player as “Player”, since the enemy identifies the player by tag.