public void Initialize(List <Entity> entities, List <float3> positions, List <Entity> newParents) { // should find closest in certain directions // if nothing in that direction dont add that direction // create navigation based no positions // top left is start of navigation List <NavigateUIElement> newNavigationElements = new List <NavigateUIElement>(); if (positions.Count == 1) { NavigateUIElement element = new NavigateUIElement(); //element.previousPosition = positions[0]; element.targetPosition = positions[0]; element.direction = 0; element.ui = newParents[0]; //element.arrayIndex = 0; element.entity = entities[0]; newNavigationElements.Add(element); } else { for (int i = 0; i < positions.Count; i++) { // up newNavigationElements = AddNavigationUI(entities, newParents, newNavigationElements, positions, positions[i], i, 2, 10000); // down newNavigationElements = AddNavigationUI(entities, newParents, newNavigationElements, positions, positions[i], i, 3, -10000); // left newNavigationElements = AddNavigationUI(entities, newParents, newNavigationElements, positions, positions[i], i, 1, -10000); // right newNavigationElements = AddNavigationUI(entities, newParents, newNavigationElements, positions, positions[i], i, 0, 10000); } } NavigateUIElement[] originalNavigationElements = navigationElements.ToArray(); navigationElements = new BlitableArray <NavigateUIElement>(originalNavigationElements.Length + newNavigationElements.Count, Unity.Collections.Allocator.Persistent); for (int i = 0; i < originalNavigationElements.Length; i++) { navigationElements[i] = originalNavigationElements[i]; } for (int i = 0; i < newNavigationElements.Count; i++) { navigationElements[i + originalNavigationElements.Length] = newNavigationElements[i]; } //UnityEngine.Debug.LogError("Initialized " + navigationElements.Length + " with navigateUIElement."); }
// Fix: if x is different then it doesnt work List <NavigateUIElement> AddNavigationUI(List <Entity> entities, List <Entity> parents, List <NavigateUIElement> newNavigationElements, List <float3> positions, float3 position, int i, byte newDirection, float closest) { int closestIndex = -1; float closestOther = 0.1f;// 10000; for (int j = 0; j < positions.Count; j++) { if (i != j) { // if (newDirection == 3 && positions[j].y < position.y && positions[j].y >= closest) { if (positions[j].y != closest || ( positions[j].y == closest && closestOther > math.abs(positions[j].x - position.x))) { closestOther = math.abs(positions[j].x - position.x); closest = positions[j].y; closestIndex = j; } } else if (newDirection == 2 && positions[j].y > position.y && positions[j].y <= closest) { if (positions[j].y != closest || ( positions[j].y == closest && closestOther > math.abs(positions[j].x - position.x))) { closestOther = math.abs(positions[j].x - position.x); closest = positions[j].y; closestIndex = j; } } // left else if (newDirection == 1 && positions[j].x < position.x && positions[j].x >= closest) { float differentY = math.abs(positions[j].y - position.y); if ((positions[j].x != closest && differentY < 0.05f) || (positions[j].x == closest && closestOther > differentY)) { closestOther = differentY; closest = positions[j].x; closestIndex = j; } } // right else if (newDirection == 0 && positions[j].x > position.x && positions[j].x <= closest) { float differentY = math.abs(positions[j].y - position.y); if ((positions[j].x != closest && differentY < 0.05f) || (positions[j].x == closest && closestOther > differentY)) { closestOther = differentY; closest = positions[j].x; closestIndex = j; } } } } if (closestIndex != -1) { //Debug.LogError("Adding Closest Index NavigationUIElement: " + closestIndex + " : " + positions[i]); NavigateUIElement element = new NavigateUIElement(); element.previousIndex = i; element.previousPosition = positions[i]; element.entity = entities[closestIndex]; element.targetIndex = closestIndex; element.targetPosition = positions[closestIndex]; element.direction = newDirection; element.ui = parents[closestIndex]; newNavigationElements.Add(element); } return(newNavigationElements); }