private void AddCharHoles(PolygonCollider2D[] navPolys, AC.Char charToExclude, NavigationMesh navigationMesh) { if (navigationMesh.characterEvasion == CharacterEvasion.None) { return; } ResetHoles(KickStarter.sceneSettings.navMesh, false); for (int p = 0; p < navPolys.Length; p++) { if (p > 0) { return; } if (navPolys[p].transform.lossyScale != Vector3.one) { ACDebug.LogWarning("Cannot create evasion Polygons inside NavMesh '" + navPolys[p].gameObject.name + "' because it has a non-unit scale."); continue; } Vector2 navPosition = navPolys[p].transform.position; for (int c = 0; c < KickStarter.stateHandler.Characters.Count; c++) { AC.Char character = KickStarter.stateHandler.Characters[c]; CircleCollider2D circleCollider2D = character.GetComponent <CircleCollider2D>(); if (circleCollider2D != null && (character.charState == CharState.Idle || navigationMesh.characterEvasion == CharacterEvasion.AllCharacters) && (charToExclude == null || character != charToExclude) && UnityVersionHandler.Perform2DOverlapPoint(character.transform.position, NavigationEngine_PolygonCollider.results, 1 << KickStarter.sceneSettings.navMesh.gameObject.layer) != 0) { circleCollider2D.isTrigger = true; List <Vector2> newPoints3D = new List <Vector2>(); #if UNITY_5 || UNITY_2017_1_OR_NEWER Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.offset); #else Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.center); #endif float radius = circleCollider2D.radius * character.transform.localScale.x; float yScaler = navigationMesh.characterEvasionYScale; if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Four) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); } else if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Eight) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ne.x * radius, dir_ne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_se.x * radius, dir_se.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sw.x * radius, dir_sw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nw.x * radius, dir_nw.y * radius * yScaler)); } else if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Sixteen) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nne.x * radius, dir_nne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ne.x * radius, dir_ne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nee.x * radius, dir_nee.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_see.x * radius, dir_see.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_se.x * radius, dir_se.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sse.x * radius, dir_sse.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ssw.x * radius, dir_ssw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sw.x * radius, dir_sw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sww.x * radius, dir_sww.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nww.x * radius, dir_nww.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nw.x * radius, dir_nw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nnw.x * radius, dir_nnw.y * radius * yScaler)); } navPolys[p].pathCount++; List <Vector2> newPoints = new List <Vector2>(); for (int i = 0; i < newPoints3D.Count; i++) { // Only add a point if it is on the NavMesh if (UnityVersionHandler.Perform2DOverlapPoint(newPoints3D[i], NavigationEngine_PolygonCollider.results, 1 << KickStarter.sceneSettings.navMesh.gameObject.layer) != 0) { newPoints.Add(newPoints3D[i] - navPosition); } else { Vector2 altPoint = GetLineIntersect(newPoints3D[i], centrePoint); if (altPoint != Vector2.zero) { newPoints.Add(altPoint - navPosition); } } } if (newPoints.Count > 1) { navPolys[p].SetPath(navPolys[p].pathCount - 1, newPoints.ToArray()); } } } RebuildVertexArray(navPolys[p].transform, navPolys[p], p); } }