- Home /
Flying AI Shooting Help
I have a basic AI script for following the player when he's in a certain range. I know how to make them shoot but not at a moving target. I can do the math to calculate a vector but how do I do it so they aren't hitting a bulls-eye every time when they shoot. Here's My script.
var target : Transform; //the enemy's target var moveSpeed = 3; //move speed var rotationSpeed = 3; //speed of turning var attackThreshold = 1.5; // distance within which to attack var chaseThreshold = 10; // distance within which to start chasing var giveUpThreshold = 20; // distance beyond which AI gives up var attackRepeatTime = 1; // delay between attacks when within range
private var chasing = false; private var attackTime = Time.time;
var myTransform : Transform; //current transform data of this enemy
function Awake() { myTransform = transform; //cache transform data for easy access/preformance }
function Start() { target = GameObject.FindWithTag("Player").transform; //target the player }
function Update () {
// check distance to target every frame:
var distance = (target.position - myTransform.position).magnitude;
if (distance < chaseThreshold) { chasing = true; }
if (chasing) {
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
} // give up, if too far away from target: if (distance > giveUpThreshold) { chasing = false; }
// attack, if close enough, and if time is OK:
// if (distance < attackThreshold && Time.time > attackRepeatTime) {
// target.SendMessage("ApplyDamage",10); // Attack! (call whatever attack function you like here) //} if (distance < attackThreshold) { //moveSpeed=; //stop when close enough }
// attackTime = Time.time+ attackRepeatTime;
//}
// start chasing if target comes close enough
}
function OnTriggerEnter (other: Collider) { if (other.gameObject.CompareTag("Bullet")){ chaseThreshold=100000000; } }
anyone have any ideas?
for those who want to know I inserted the correct response in this commented out section: // if (distance < attackThreshold && Time.time > attackRepeatTime) {
Answer by TowerOfBricks · Apr 17, 2011 at 07:39 AM
The easiest thing is probably to add randomness
This will damage the player roughly every second time it fires
if (Random.value < 0.5) {
//Apply damage
}
You could also fire raycasts, as from an imaginary gun to see if it hits the player. The chance of not hitting the player will increase over distance I hope it will compile
var randomness : float = 0.1F;
var hit : RaycastHit; var distance : float = Vector3.Distance (transform.positon,player.transform.position); var rnd : Vector3 = Random.insideUnitSphere*distance*randomness;
Debug.DrawLine (transform.positon,player.transform.position+rnd,Color.cyan);
if (Physics.Linecast ( transform.positon, player.transform.position+rnd,out hit)) { if (hit.transform.gameObject == player) { //Apply Damage } }
there were a few typos in there and i took out the out before hit in if (Physics.Linecast... and i changed all the players to target since i plan to make it a more general script not just attacking one player but whoever they are targeting. how can I make it to where it doesn't shoot as fast though? Right now its constantly drawing rays to the fighter and I'd like for that to slow down.
Add an IF which check something like "if (Time.time-lastFire > 0.5) {" then fire and set the "lastFire" variable to Time.time. That would make it only fire every 0.5 seconds. You should place it in Update or similar. PS: "lastFire" would be a variable in the script, not in the Update function.
Your answer
Follow this Question
Related Questions
Shooting AI problem 2 Answers
Enemy Attack Animation 1 Answer
My AI is flying when I jump 2 Answers
Rapid fire Help 1 Answer