public bool IsGameObjectIn(GameObject box1, GameObject box2) { Vector3 size = box2.transform.localScale; Vector3 position = box2.transform.position; return(OOBCollisionDetection.AreBoxexOverlapping(box1, size, position)); }
void Update() { if (!LoadingCorrupted && Generator.generatorDone && !FileLoaded && SaveFileExist() && !GenerationDone) { FileLoaded = LoadFile(); if (FileLoaded == false) { LoadingCorrupted = true; } else { GenerationDone = true; Debug.Log("Waypoints succesfully loaded from file"); SaveToFile(); } } else if (!GenerationDone && QuadTree.generationDone && Generator.generatorDone) { for (int i = 0; i < pathNodes.Count; i++) { if (pathNodes[i] != null) { pathNodes[i].nodeValid = false; pathNodes[i] = null; } } pathNodes.Clear(); Debug.Log("Waypoint generation"); QuadTree qt = GameObject.Find("QuadTreeGenerator").GetComponent <QuadTree>(); float startX = CenterX - Width / 2.0f; float startY = CenterY - Width / 2.0f; float endX = CenterX + Width / 2.0f; float endY = CenterY + Width / 2.0f; matrix = new PathNode[(int)Width][]; for (int x = 0; x < Width; x += 1) { matrix[x] = new PathNode[(int)Width]; for (int y = 0; y < Width; y += 1) { matrix[x][y] = null; } } int x1, y1; float xf; float yf; for (xf = startX, x1 = 0; xf < endX && x1 < Width; xf += Step, x1++) { for (yf = startY, y1 = 0; yf < endY && y1 < Width; yf += Step, y1++) { Vector3 position = new Vector3(xf, 0.5f, yf); //List<GameObject> result = qt.GetObjectsInside(position); QuadTreeItem qi = qt.GetQuadTreeItemFor(position, 4); if (qi == null || qi.GameObjects == null) { continue; } GameObject closest = GetClosestObject(qi, position); if (IsInside(qi.GameObjects, position)) { continue; } if (closest == null || (closest != null && Vector3.Distance(closest.transform.position, position) > 1.0f)) { PrepareNode(x1, y1, position, "regular generation"); } else { matrix[x1][y1] = null; } } } //SaveToFile(); GenerationDone = true; GameObject enemyGenerator = GameObject.Find("EnemyGenerator"); if (QuadTree.waypointsNeedRegeneration) { enemyGenerator.GetComponent <EnemyGenerator>().WaypointSystemChangedCallback(); } QuadTree.waypointsNeedRegeneration = false; } else if (QuadTree.waypointsNeedRegeneration && !QuadTree.rebuildingQuadTree) { QuadTree qt = GameObject.Find("QuadTreeGenerator").GetComponent <QuadTree>(); Debug.Log("Regenerating waypoints (selective)"); float startX = CenterX - Width / 2.0f; float startY = CenterY - Width / 2.0f; float endX = CenterX + Width / 2.0f; float endY = CenterY + Width / 2.0f; int x1, y1; float xf, yf; Debug.Log("Qti's to regenerate: " + qt.qtisToRegenerate.Count); foreach (QuadTreeItem qti in qt.qtisToRegenerate) { for (xf = startX, x1 = 0; xf < endX && x1 < Width; xf += Step, x1++) { for (yf = startY, y1 = 0; yf < endY && y1 < Width; yf += Step, y1++) { Vector3 position = new Vector3(xf, 0.5f, yf); if (OOBCollisionDetection.AreBoxexOverlapping(qti.Size, qti.Position, new Vector3(Step, Step, Step), position)) { if (IsInside(qti.GameObjects, position)) { PathNodeDelete(position); continue; } if (matrix[x1][y1] != null && matrix[x1][y1].nodeEnabled) { continue; } GameObject closest = GetClosestObject(qti, position); if (closest == null || (closest != null && Vector3.Distance(closest.transform.position, position) > 1.0f)) { PrepareNode(x1, y1, position, "regenerate" + qti.name); } } } } } qt.qtisToRegenerate.Clear(); GameObject enemyGenerator = GameObject.Find("EnemyGenerator"); enemyGenerator.GetComponent <EnemyGenerator>().WaypointSystemChangedCallback(); QuadTree.waypointsNeedRegeneration = false; } }
public bool IsGameObjectIn(GameObject bigger, Vector3 smallerPos) { Vector3 size = new Vector3(Width, 1, Width); return(OOBCollisionDetection.AreBoxexOverlapping(bigger, size, smallerPos)); }
public void DoRayCast() { /*if (enemyFound && raycastingCounter < 50) * { * DrawHelper.DrawCube(new Vector3(actX, 0.0f, actY), new Vector3(2.0f, 2.0f, 2.0f), Color.yellow); * raycastingCounter++; * * foreach (EnemyController ec in enemiesInSightList) * Debug.DrawLine (this.transform.position, ec.transform.position); * * return; * } * else * enemyFound = false;*/ QuadTree qt = GameObject.Find("QuadTreeGenerator").GetComponent <QuadTree>(); //List<QuadTreeItem> qtis = qt.GetQuadTreeItemFor(new Vector3(actX, 0.0f, actY), new Vector3(2.5f, 2.5f, 2.5f), 2); //QuadTreeItem qti1 = qt.GetQuadTreeItemFor(new Vector3(actX + this.transform.localScale.x/2.0f, 0.0f, actY + this.transform.localScale.z/2.0f), 3); //QuadTreeItem qti2 = qt.GetQuadTreeItemFor(new Vector3(actX + this.transform.localScale.x/2.0f, 0.0f, actY - this.transform.localScale.z/2.0f), 3); //QuadTreeItem qti3 = qt.GetQuadTreeItemFor(new Vector3(actX - this.transform.localScale.x/2.0f, 0.0f, actY - this.transform.localScale.z/2.0f), 3); //QuadTreeItem qti4 = qt.GetQuadTreeItemFor(new Vector3(actX - this.transform.localScale.x/2.0f, 0.0f, actY + this.transform.localScale.z/2.0f), 3); /*List<GameObject> gos = new List<GameObject>(); * * foreach (QuadTreeItem qti in qtis) * gos.AddRange(qti.GameObjects);*/ //gos.AddRange(qti1.GameObjects); //gos.AddRange(qti2.GameObjects); //gos.AddRange(qti3.GameObjects); //gos.AddRange(qti4.GameObjects); List <GameObject> gos = new List <GameObject>(GameObject.FindGameObjectsWithTag("wall")); //qt.GetQuadTreeItemFor(new Vector3(actX, 0.0f, actY), 1).GameObjects; List <GameObject> enemies = EnemyGenerator.enemies; enemiesInSight = 0; enemiesInSightIdList.Clear(); enemiesInSightList.Clear(); foreach (GameObject enemyGo1 in enemies) { bool obstacleFound = false; double distance = Vector3.Distance(enemyGo1.transform.position, this.transform.position); if (distance > 15.0f) { continue; } EnemyController ec1 = enemyGo1.GetComponent <EnemyController>(); /*List<QuadTreeItem> qtis2 = qt.GetQuadTreeItemFor(new Vector3(ec1.actX, 0.0f, ec1.actY), new Vector3(2.5f, 2.5f, 2.5f), 2); * List<GameObject> gos2 = new List<GameObject>();//qt.GetQuadTreeItemFor(new Vector3(ec1.actX, 0.0f, ec1.actY), 3).GameObjects;//GetGameObjectsOnTheWay(ec1.transform.position, this.transform.position); * * foreach (QuadTreeItem qti in qtis2) * gos2.AddRange(qti.GameObjects); * * List<GameObject> globalGos = new List<GameObject>(); * globalGos.AddRange(gos); * globalGos.AddRange(gos2);*/ if (this.id == ec1.id) { continue; } Vector3 lineDir = ec1.transform.position - this.transform.position; float halfLength = Vector3.Distance(ec1.transform.position, this.transform.position) / 2.0f; Vector3 midpoint = new Vector3((ec1.transform.position.x + this.transform.position.x) / 2.0f, /*(ec1.transform.position.y + this.transform.position.y)/2.0f*/ 0.3f, (ec1.transform.position.z + this.transform.position.z) / 2.0f); foreach (GameObject go in gos) { Vector3 goPosition = new Vector3(go.transform.position.x, 0.5f, go.transform.position.z); double distance2 = Vector3.Distance(go.transform.position, this.transform.position); if (distance2 > 15) { continue; } Vector3 goScale = go.transform.localScale; DrawHelper.DrawCube(goPosition, goScale, Color.red); if (OOBCollisionDetection.IsRayIntersectingBox(ec1.transform.position, this.transform.position, goPosition, goScale)) { obstacleFound = true; break; } } if (!obstacleFound) { Debug.DrawLine(ec1.transform.position, this.transform.position); enemiesInSight++; enemiesInSightIdList.Add(ec1.id); enemiesInSightList.Add(ec1); enemyFound = true; raycastingCounter = 0; } } }