I am trying to add gameObjects to an array and then sending raycasts to all of their positions. However, my code does not work. Can anyone lend me a hand?
function CheckLoS()
{
var enemies : GameObject[];
enemies = GameObject.FindGameObjectsWithTag("Enemy");
for (var i =0; i < enemies.length; i++)
{
if (Physics.Raycast(transform.position, enemies[i].transform.position, 100))
{
Debug.DrawLine(transform.position, enemies[i].transform.position, Color.green);
}
else
{
Debug.DrawLine(transform.position, enemies[i].transform.position, Color.red);
}
}
}
The second parameter of Physics.Raycast is a direction, not a position. Try:
if (Physics.Raycast(transform.position, (enemies[i].transform.position - transform.position).normalized, 100))
Thanks, it seems to work better now. However, the raycast seems to always be returning true, even though there are objects in the way of it. This is my currect code.
Edit: It seems raycast might not be ideal for this. If anything hits the ray it returns true, but what I want is that if the ray reaches it’s target, it returns true. Linecast seems better suited, but that does not have a max range. Any suggestions?
function CheckLoS()
{
var enemies : GameObject[];
enemies = GameObject.FindGameObjectsWithTag("Enemy");
for (var i =0; i < enemies.length; i++)
{
if (Physics.Raycast(transform.position, (enemies[i].transform.position - transform.position).normalized, 100))
{
enemies[i].renderer.enabled = true;
}
else
{
enemies[i].renderer.enabled = false;
}
}
}
Yep, Linecast is probably better for this case. You should also consider using the version with the RaycastHit output. From that you can tell which collider you hit. That in turn can tell you if you hit the game object you were looking for or not.
Solved. Correct code:
function CheckLoS()
{
var enemies : GameObject[];
var sightRange : int = 10;
enemies = GameObject.FindGameObjectsWithTag("Enemy");
for (var i =0; i < enemies.length; i++)
{
var hitInfo : RaycastHit;
var rayLos = Physics.Raycast(transform.position, (enemies[i].transform.position - transform.position).normalized, hitInfo, sightRange);
if(rayLos hitInfo.transform.gameObject == enemies[i])
{
enemies[i].renderer.enabled = true;
}
else
{
enemies[i].renderer.enabled = false;
}
}
}
Way ahead of you
Thanks for all the help!