JJ_FX
January 4, 2019, 12:05pm
1
Hi,
So I have an issue with this particular function
GameObject GetFutureCube(GameObject[] Cube, Vector3 futurePosition, GameObject NULL) {
GameObject obj = NULL;
foreach (GameObject element in Cube) {
Debug.Log(element.name + " " + element.transform.position + " " + futurePosition);
if (element.transform.position == futurePosition) {
obj = element;
break;
}
}
return obj;
}
So what it does is just take variale futurePosition and compare it to the positions of objects Cube in the scene.
And it does not work all the time, thats why I put
Debug.Log(element.name + " " + element.transform.position + " " + futurePosition);
to debug to see whats going on there. And on one of the iterations it prints out:
Cube (7) (1.0, -1.0, 0.0) (1.0, -1.0, 0.0)
Which means that the function should return Cube(7), but instead it returns NULL
fafase
January 4, 2019, 1:13pm
2
Comparing floats is already a bit of a gamble due to floating point inaccuracy. A vector3 contains three of them so you’d make the odds even worse.
You should use the magnitude:
Vector3 vec = element.transform.position - futurePosition;
float mag = vec.magnitude;
if(mag < 0.1f){ // Close enough }
Which is the same as:
Vector3 pos =element.transform.position;
float xDiff = Mathf.Abs(pos.x, futurePos.x);
float yDiff = Mathf.Abs(pos.y, futurePos.y);
float zDiff = Mathf.Abs(pos.z, futurePos.z);
if(xDiff < 0.1f && yDiff < 0.1f && zDiff < 0.1f){ // Close enough }
if the game is 2D, you know that z is irrelevant and you can skip it. You can also use Mathf.Approximately
JJ_FX
January 5, 2019, 6:46pm
4
Actually I managed to fix it some other way. But It might have been the floating point inaccuracy issue anyway.
The issue was in
Vector3 futurePosition
which was derived from a class that looked for an objects Player position, moved by coroutine. Once I rounded the Player position inside coroutine
float x = Mathf.Round(Player.transform.position.x);
float y = Mathf.Round(Player.transform.position.y);
float z = Mathf.Round(Player.transform.position.z);
Player.transform.position = new Vector3(x, y, z);
everything started working fine.
Try this
element.transform.position.Equals(futurePosition)