- Home /
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.
No-one can possibly answer this question with so little information. Does your zombie have a collider? What script is it running?
Answer by aldonaletto · Jan 17, 2012 at 01:11 AM
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.
hey i am srry but it didnt work my zombie keeps going through walls and the floor any other ideas
This script works fine. Create a capsule, add a CharacterController with menu Components/Physics/CharacterController and attach this script to it. Press Play and you will see the capsule walking around, pausing, turning to a random direction, walking again etc. until it sees the player: the capsule will go straight to the player, and stop at 2 units.
what do u mean put the script with the character controll and i dont want it to walk around until it sees the player i want it to be like black ops zombies were the zombies are chasing the player all of the time
in the script above I get some errors with it.. for example
if (tgtDist timeToNewDir) what should that be?
and no var for timeToNewDir is that script complete?
There is four lines in which I am most confused about. The first one is line 42. The words 'Function' and '$$anonymous$$ove Character' are right beside each other and the computer demands a ( between those two. Though, when you put that in, it shows up, 'Unexpected token: (. The same goes for the other ) that you put in there. Next on line 45 it says that var is an unexpected token. The final one is, again, line 45 it says to insert a semicolon at the end. Could you help? That would be great.
Your answer
![](https://koobas.hobune.stream/wayback/20220613063054im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Target distance would only update closer 1 Answer
Object Rotation/Character Speed 1 Answer
How to make a camera follow an object 0 Answers