コード例 #1
0
        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);
            }
        }