Should point out the game object casting the rays is not the same object being hit
void CreateGrid()
{
for (int x = -(GridSize / 2); x < (GridSize / 2); x++)
{
for (int z = -(GridSize / 2); z < (GridSize / 2); z++)
{
Vector3 Pos = new Vector3(x, 0, z);
RaycastHit[] Hits = Physics.RaycastAll(Pos + new Vector3(0, 500, 0), -Vector3.up, 1000);
//Hits = Hits.OrderBy(item => item.point.y).ToArray();
for (int i = 0; i < Hits.Length; i++)
{
float hx = Hits[i].point.x;
float hy = Mathf.Round(Hits[i].point.y * 10) / 10;
float hz = Hits[i].point.z;
Vector3 HitPos = new Vector3(hx,hy,hz);
//if (Physics.SphereCastAll(HitPos, EdgeDetection, Vector3.up, EdgeDetection).Length != 1)
//{
// continue;
//}
if (Hits.Length == 1)
{
Nodes.Add(HitPos, new PF_Node(HitPos));
}
else
{
try
{
if ((Mathf.Round(Hits[i + 1].point.y * 10) / 10) - HitPos.y >= ImpassThreshold)
{
Nodes.Add(HitPos, new PF_Node(HitPos));
}
}
catch (System.Exception)
{
//Assume Nothing above it.
Nodes.Add(HitPos, new PF_Node(HitPos));
}
}
}
}
}
foreach (var Node in Nodes.Values)
{
Vector3 NP = new Vector3(Node.Position.x, Node.Position.y, Node.Position.z);
Vector3 Additional = new Vector3(1, 0, 0);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, 0, 0);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(0, 0, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(0, 0, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, 0, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, 0, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(1, 0, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(1, 0, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
float MaxHeightDist = GetMaxAngleHeight();
for (float i = -MaxHeightDist; i < MaxHeightDist; i+=0.1f)
{
i = Mathf.Round(i * 10) / 10;
Additional = new Vector3(1, i, 0);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, i, 0);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(0, i, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(0, i, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, i, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(-1, i, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(1, i, 1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
Additional = new Vector3(1, i, -1);
if (Nodes.ContainsKey(NP + Additional))
{
Node.Neighbours.Add(Nodes[NP + Additional]);
}
}
}
}
Also doing some breakpoint checks seems to show an inexpected result…
NP + Additional (While object is rotated -10 on Y)
“(0.00, 0.50, -2.00)”
magnitude: 2.061553
normalized: “(0.00, 0.24, -0.97)”
sqrMagnitude: 4.250002
x: -2.384186E-07
y: 0.5
z: -2
NP + Additional (While object is not rotated)
“(0.00, 0.50, -2.00)”
magnitude: 2.061553
normalized: “(0.00, 0.24, -0.97)”
sqrMagnitude: 4.25
x: 0
y: 0.5
z: -2
The sqrMagnitude and x pos are different - even though the positions are exactly the same