In the game I’m developing, a turret has a range shaped like a sector of a circle. The turret has an initial forward vector, and what I need is to have the turret only target enemies within 54 degrees (On the XZ plane) of that forward vector. The y axis is irrelevant here. How can I do this?
If you know the enemy positions, you can compare the direction vector turret->enemy to the initial forward vector. Supposing that forwardDir has the initial forward direction, you can use a function like this (turret script):
function EnemyInRange(enemy: Transform): boolean {
// get direction vector:
var dir: Vector3 = enemy.position - transform.position;
dir.y = 0; // make it strictly horizontal
forwardDir.y = 0; // make forwardDir stricly horizontal too
// return false if outside angle...
if (Vector3.Angle(dir, forwardDir) > 54) return false; // check angle...
// or out of range
if (Vector3.Distance(enemy.position, transform.position) > range) return false;
// otherwise return true
return true;
}
HINT: A simple way to keep all enemies in a fast and always updated array is to child them to an empty object: create the empty object, call it Enemies and reset its position/rotation, then child every enemy to it right after it’s created. You can iterate through them with a code like this (turret script):
var enemies: Transform; // drag the Enemies object to this field
...
for (var enemy: Transform in enemies){
if (EnemyInRange(enemy)){
// enemy inside range: shoot the bastard!
}
}
...