private void AddCharHoles(PolygonCollider2D navPoly, AC.Char charToExclude, CharacterEvasion characterEvasion) { ResetHoles (KickStarter.sceneSettings.navMesh, false); Vector2 navPosition = navPoly.transform.position; AC.Char[] characters = GameObject.FindObjectsOfType (typeof (AC.Char)) as AC.Char[]; foreach (AC.Char character in characters) { CircleCollider2D circleCollider2D = character.GetComponent <CircleCollider2D>(); if (circleCollider2D != null && (character.charState == CharState.Idle || characterEvasion == CharacterEvasion.AllCharacters) && (charToExclude == null || character != charToExclude) && Physics2D.OverlapPointNonAlloc (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 Vector2 centrePoint = character.transform.TransformPoint (circleCollider2D.offset); #else Vector2 centrePoint = character.transform.TransformPoint (circleCollider2D.center); #endif float radius = circleCollider2D.radius * character.transform.localScale.x; newPoints3D.Add (centrePoint + Vector2.up * radius); newPoints3D.Add (centrePoint + Vector2.right * radius); newPoints3D.Add (centrePoint - Vector2.up * radius); newPoints3D.Add (centrePoint - Vector2.right * radius); navPoly.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 (Physics2D.OverlapPointNonAlloc (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) { navPoly.SetPath (navPoly.pathCount-1, newPoints.ToArray ()); } } } RebuildVertexArray (navPoly.transform, navPoly); }
private void AddCharHoles(PolygonCollider2D navPoly, AC.Char charToExclude, CharacterEvasion characterEvasion) { ResetHoles(KickStarter.sceneSettings.navMesh, false); Vector2 navPosition = navPoly.transform.position; AC.Char[] characters = GameObject.FindObjectsOfType(typeof(AC.Char)) as AC.Char[]; foreach (AC.Char character in characters) { CircleCollider2D circleCollider2D = character.GetComponent <CircleCollider2D>(); if (circleCollider2D != null && (character.charState == CharState.Idle || characterEvasion == CharacterEvasion.AllCharacters) && (charToExclude == null || character != charToExclude) && Physics2D.OverlapPointNonAlloc(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 Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.offset); #else Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.center); #endif float radius = circleCollider2D.radius * character.transform.localScale.x; newPoints3D.Add(centrePoint + Vector2.up * radius); newPoints3D.Add(centrePoint + Vector2.right * radius); newPoints3D.Add(centrePoint - Vector2.up * radius); newPoints3D.Add(centrePoint - Vector2.right * radius); navPoly.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 (Physics2D.OverlapPointNonAlloc(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) { navPoly.SetPath(navPoly.pathCount - 1, newPoints.ToArray()); } } } RebuildVertexArray(navPoly.transform, navPoly); }