- Home /
Distance Between 2 Objects Without Y
I'll try to explain this as best I can. I have an enemy which will start running towards the Player if he's a certain distance away from it. This works fine, but the problem is that when the Player jumps, the Enemy thinks that the Player is far away because the Distance goes up because transform.position factors in the Y value. I basically need the enemy to calculate the distance between it and the Player without factoring in the Player's Y value in order to keep the enemy grounded. The way it works now, the enemy stops at the stop range, but if the player jumps he starts running underneath the player and into the sky.
Here's the distance calculation script:
var distanceToTarget = Vector3.Distance(transform.position, GameObject.FindWithTag("Player").transform.position);
Here's the following script:
function Patrol(){
while(true){
if( AttackRangeCheck() ){ // target object is within range
if( !StopRangeCheck()){
var newPos = Vector3(GameObject.FindWithTag("Player").transform.position.x, 0, GameObject.FindWithTag("Player").transform.position.z);
transform.LookAt(newPos);
transform.Translate(Vector3.forward*Time.deltaTime*moveSpeed);
animation.CrossFade("run",0.2);
isRunning = true;
}
}
yield;
}
}
Answer by Bunny83 · Mar 11, 2011 at 05:46 PM
Vector3.Distance just subtracts position two from position one and returns the vector length (magnitude).
var dist = Vector3.Distance(P1,P2);
would be the same as
var dist = (P2-P1).magnitude;
So you can calculate the vector yourself and before you get the magnitude just set y to 0:
var vectorToTarget = GameObject.FindWithTag("Player").transform.position - transform.position;
vectorToTarget.y = 0;
var distanceToTarget = vectorToTarget.magnitude;
ps. It doesn't matter whether you subtract P1 from P2 or P2 from P1, the resulting vector would just point in the opposite direction but the length (magnitude) will be the same.
Upping this because I've found that your distanceToTarget works much more reliably than the traditional version. Thanks a ton! You put an end to 2 days of work :P Great, now I've jinxed it.
Answer by kromenak · Mar 11, 2011 at 05:37 PM
It would probably be easy to just nullify the data on the y-axis and then do a distance test, like so:
Vector3 my2dPos = transform.position;
my2dPos.y = 0;
Vector3 target2dPos = GameObject.FindWithTag("Player").transform.position;
target2dPos.y = 0;
var distanceToTarget = Vector3.Distance(my2dPos, target2dPos);
You could also use Vector2, but you'd have to be careful because that would get rid of the z-value as opposed to the y-value.
Then the only concern is when you have a situation where the two are very close to each other on the x-z plane, but are separated by a large height, like on the edge of a cliff. You'd probably want to have some y distance at which you no longer allow the enemy to follow the player, like a little less than the distance it would take to kill the enemy.
You mixed C# with JS ;) He's using JS so you could change your answer to show at least one correct solution.
Just before someone put me down, var
would also be possible in C# but the question was obviously in JS. ;)
Answer by NathanJSmith · Mar 22, 2019 at 07:23 AM
I'll keep it simple.
public static float FlatDistance(Vector3 pos1, Vector3 pos2)
{
pos1.y = pos1.z;
pos2.y = pos2.z;
return Vector2.Distance(pos1, pos2);
}