Ejemplo n.º 1
0
        private Bounds CalculateWorldBounds(List <NavMeshBuildSource> sources)
        {
            Matrix4x4 inverse = Matrix4x4.TRS(base.transform.position, base.transform.rotation, Vector3.one).inverse;
            Bounds    result  = default(Bounds);

            foreach (NavMeshBuildSource navMeshBuildSource in sources)
            {
                switch (navMeshBuildSource.shape)
                {
                case NavMeshBuildSourceShape.Mesh:
                {
                    Mesh mesh = navMeshBuildSource.sourceObject as Mesh;
                    result.Encapsulate(NavMeshSurface.GetWorldBounds(inverse * navMeshBuildSource.transform, mesh.bounds));
                    break;
                }

                case NavMeshBuildSourceShape.Terrain:
                {
                    TerrainData terrainData = navMeshBuildSource.sourceObject as TerrainData;
                    result.Encapsulate(NavMeshSurface.GetWorldBounds(inverse * navMeshBuildSource.transform, new Bounds(0.5f * terrainData.size, terrainData.size)));
                    break;
                }

                case NavMeshBuildSourceShape.Box:
                case NavMeshBuildSourceShape.Sphere:
                case NavMeshBuildSourceShape.Capsule:
                case NavMeshBuildSourceShape.ModifierBox:
                    result.Encapsulate(NavMeshSurface.GetWorldBounds(inverse * navMeshBuildSource.transform, new Bounds(Vector3.zero, navMeshBuildSource.size)));
                    break;
                }
            }
            result.Expand(0.1f);
            return(result);
        }
Ejemplo n.º 2
0
        private List <NavMeshBuildSource> CollectSources()
        {
            List <NavMeshBuildSource> list  = new List <NavMeshBuildSource>();
            List <NavMeshBuildMarkup> list2 = new List <NavMeshBuildMarkup>();
            List <NavMeshModifier>    list3;

            if (this.m_CollectObjects == CollectObjects.Children)
            {
                list3 = new List <NavMeshModifier>(base.GetComponentsInChildren <NavMeshModifier>());
                list3.RemoveAll((NavMeshModifier x) => !x.isActiveAndEnabled);
            }
            else
            {
                list3 = NavMeshModifier.activeModifiers;
            }
            foreach (NavMeshModifier navMeshModifier in list3)
            {
                if ((this.m_LayerMask & 1 << navMeshModifier.gameObject.layer) != 0)
                {
                    if (navMeshModifier.AffectsAgentType(this.m_AgentTypeID))
                    {
                        list2.Add(new NavMeshBuildMarkup
                        {
                            root            = navMeshModifier.transform,
                            overrideArea    = navMeshModifier.overrideArea,
                            area            = navMeshModifier.area,
                            ignoreFromBuild = navMeshModifier.ignoreFromBuild
                        });
                    }
                }
            }
            if (this.m_CollectObjects == CollectObjects.All)
            {
                NavMeshBuilder.CollectSources(null, this.m_LayerMask, this.m_UseGeometry, this.m_DefaultArea, list2, list);
            }
            else if (this.m_CollectObjects == CollectObjects.Children)
            {
                NavMeshBuilder.CollectSources(base.transform, this.m_LayerMask, this.m_UseGeometry, this.m_DefaultArea, list2, list);
            }
            else if (this.m_CollectObjects == CollectObjects.Volume)
            {
                Matrix4x4 mat         = Matrix4x4.TRS(base.transform.position, base.transform.rotation, Vector3.one);
                Bounds    worldBounds = NavMeshSurface.GetWorldBounds(mat, new Bounds(this.m_Center, this.m_Size));
                NavMeshBuilder.CollectSources(worldBounds, this.m_LayerMask, this.m_UseGeometry, this.m_DefaultArea, list2, list);
            }
            if (this.m_IgnoreNavMeshAgent)
            {
                list.RemoveAll((NavMeshBuildSource x) => x.component != null && x.component.gameObject.GetComponent <NavMeshAgent>() != null);
            }
            if (this.m_IgnoreNavMeshObstacle)
            {
                list.RemoveAll((NavMeshBuildSource x) => x.component != null && x.component.gameObject.GetComponent <NavMeshObstacle>() != null);
            }
            this.AppendModifierVolumes(ref list);
            return(list);
        }