- Home /
Turret script bug
I am attempting to make a turret that will only track and shoot at the player if it is with in a certain radius. I found a good script on this site, but when I use it, unity will freeze up when my character enters the trigger area.
The code I am using is this:
private var target : Transform;
var damping = 6.0;
var smooth = true;
var bulletPrefab : Rigidbody;
var bulletSpeed : float = 100;
function OnTriggerEnter(otherCollider : Collider) {
if (otherCollider.CompareTag("player"))
{
target = otherCollider.transform;
Fire();
}
}
function OnTriggerExit(otherCollider : Collider) {
if (otherCollider.CompareTag("player"))
{
target = null;
StopCoroutine("Fire"); // aborts the currently running Fire() coroutine
}
}
function Fire()
{
while (target != null)
{
var nextFire = Time.time + 1;
while (Time.time < nextFire)
{
if (smooth)
{
// Look at and dampen the rotation
var rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping);
}
else
{
// Just lookat
transform.LookAt(target);
}
}
// fire!
var bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
bullet.velocity = transform.forward * bulletSpeed;
}
}
I have my fireball prefab linked to the bulletPrefab, my character is tagged "player", and I am using a spherical collider for the trigger. Any ideas why my game would crash?
Hmm... For some reason, it didn't like my while (target != null) loop. Reworking it to have an if statement, like in this reference http://unity3d.com/support/documentation/ScriptReference/Time-time.html fixed it. I still don't know why it crashed, but... it works!
Answer by Gtaray 1 · Oct 20, 2011 at 05:35 PM
The while (target != null) loop has no way of exiting. It runs through the loop infinitely and crashes the program. I think what you're looking for is an IF statement rather than a WHILE statement. IF only iterates once and won't crash your program.,Your
Answer by alkor · Oct 20, 2011 at 05:34 PM
Thommas - your functions "OnTriggerEnter" & "OnTriggerExit" will checked every frame and thus If player inside your Trigger then EVERY FRAME WILL EXECUTED "Fire"-but this function will executed when "while (target != null)"-it will forever in current frame. That's why you look mistake - when you insert two "if" without "while" your code will work right.
Your answer
Follow this Question
Related Questions
multipe targets 1 Answer
Enemy not detecting player 1 Answer
target tracking with lead time 1 Answer
Least heavy processing detection method 1 Answer
Glitchy Turret Script 2 Answers