Vector3.distance wrong distance calculating?
I have Player
object and Enemy
object. Enemy
is always stalking Player
and trying to kill him. In function that sends damage to Player
i use Vector3.distance
to calculate disance between two objects and here strange things begin to appear: If i move Enemy
prefab from editor to scene manually everything works fine, distance calculates correctly and Enemy
sends damage to Player
as it comes close enough. But if I Instatiate
the same Enemy
prefab via script Vector3.Distance
begins to calculate the distance from the Enemy
to some point located at the other end of the map, where there is literally nothing. There are no objects with the same tag (Im referencing Player GameObject to Enemy using FindGameObjectWithTag
). Because of that Enemy can't hit Player.
Interestingly, to calculate the movement of the enemy to the player, I use the function Vector3.MoveTowards
with the same referencing to Player GameObject and it works fine in both cases.
i.e. if Enemy was Instatiated via script, it can move to Player but cannot hit him because the distance is calculated incorrectly
I ask you not to say that the FindGameObjectWithTag
operation is heavy and "costs" some computing power, I know it
Reference for Vector3.Distance()
:
void Start()
{
Target = GameObject.FindGameObjectWithTag("Player");
}
Vector3.Distance(Target.transform.position, transform.position)
Reference for Vector3.MoveTowards()
:
void Start()
{
Target = GameObject.FindGameObjectWithTag("Player");
}
Vector3.MoveTowards(transform.position, new Vector3(Target.transform.position.x, transform.position.y, transform.position.z), speed * Time.deltaTime);
Game is in 2D space
Answer by byalexeykh · Dec 16, 2019 at 01:10 PM
Bunny83 said
Vector*3.Distance calculates just the euclidean distance in 3d*.
Since my game is in 2D space, I immediately went to check the Z coordinate, and the problem was there. Spawner that spawns Enemy prefabs was at -60 Z coordinate, and passed its coordinates to the instatiated objects.
Answer by Bunny83 · Dec 15, 2019 at 08:46 PM
Well you most likely do not have your objects placed on the same z depth. In your moveTowards method you do not move towards the player / target but towards the player / target position projected onto the depth plane where this object is located.
Vector3.Distance calculates just the euclidean distance in 3d. There certainly is nothing wrong with it. If something doesn't turn out as you expected it's your fault. Probably because your input positions are not what you think they are. Have you actually started debugging your issue? Have you printed the two positions? What distance do you get? Have you printed it?
Yes, I am debugging all if
statements. As you can see, debugging displays absolutely strange distance values. But your comment gave me one thought...