Beispiel #1
0
    private void BakeBoxColliders()
    {
        CleanUpOldNavMeshItems();
        BoxCollider[] allBoxColliders   = GameObject.FindObjectsOfType <BoxCollider>();
        GameObject    navMeshCubePrefab = GameObject.CreatePrimitive(PrimitiveType.Cube);

        DestroyImmediate(navMeshCubePrefab.GetComponent <Collider>());
        navMeshCubePrefab.name = TEMP_NAV_MESH_OBJECT_TAG;
        GameObjectUtility.SetStaticEditorFlags(navMeshCubePrefab, StaticEditorFlags.NavigationStatic);
        navMeshCubePrefab.tag = TEMP_NAV_MESH_OBJECT_TAG;

        GameObject tempNavMeshCube;

        foreach (BoxCollider c in allBoxColliders)
        {
            if (COLLIDER_LAYER < 0 || c.gameObject.layer == COLLIDER_LAYER)
            {
                tempNavMeshCube                         = Instantiate(navMeshCubePrefab) as GameObject;
                tempNavMeshCube.name                    = navMeshCubePrefab.name;
                tempNavMeshCube.transform.parent        = c.transform;
                tempNavMeshCube.transform.localPosition = c.center;
                tempNavMeshCube.transform.localRotation = Quaternion.identity;
                tempNavMeshCube.transform.localScale    = c.size;
                tempNavMeshCube.hideFlags               = HideFlags.DontSave;
            }
        }
        DestroyImmediate(navMeshCubePrefab);
        NavMeshBuilder.BuildNavMeshAsync();
        CleanUpOldNavMeshItems();
    }
Beispiel #2
0
    void BakeNavMesh2D()
    {
        // create a temporary parent GameObject
        var obj = new GameObject();

        // find all static box colliders, add them to projection
        AddBoxCollider2Ds(obj.transform);
        // find all static circle colliders, add them to projection
        AddCircleCollider2Ds(obj.transform);
        // find all static polygon colliders, add them to projection
        AddPolygonCollider2Ds(obj.transform);

        // min and max point needed for ground plane (from 3d colliders)
        var cols = GameObject.FindObjectsOfType <Collider>();

        if (cols.Length > 0)
        {
            var min = new Vector2(Mathf.Infinity, Mathf.Infinity);
            var max = -min;
            foreach (var c in cols)
            {
                var minmax = NavMeshUtils2D.AdjustMinMax(c, min, max);
                min = minmax[0];
                max = minmax[1];
            }

            // create ground (cube instead of plane because it has unit size)
            // (pos between min and max; scaled to fit min and max * scale)
            // note: scale.y=0 so that *groundScale doesn't make it too high
            var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
            go.isStatic         = true;
            go.transform.parent = obj.transform;
            float w = max.x - min.x;
            float h = max.y - min.y;
            go.transform.position   = new Vector3(min.x + w / 2, -0.5f, min.y + h / 2);
            go.transform.localScale = new Vector3(w, 0, h) * groundScale;
        }

        // bake navmesh asynchronously, clear mesh
        NavMeshBuilder.BuildNavMeshAsync(); // Async causes weird results
        if (gizmesh != null)
        {
            gizmesh.Clear();
        }
        needsRebuild = true; // rebuild as soon as async baking is finished

        // delete the gameobjects now that the path was created
        GameObject.DestroyImmediate(obj);
    }
    public override IEnumerator Execute(UTContext context)
    {
        if (UTPreferences.DebugMode)
        {
            Debug.Log("Setting up nav mesh settings.");
        }
        var settingsObject               = new SerializedObject(NavMeshBuilder.navMeshSettingsObject);
        var agentRadiusSetting           = settingsObject.FindProperty("m_BuildSettings.agentRadius");
        var agentHeightSetting           = settingsObject.FindProperty("m_BuildSettings.agentHeight");
        var agentSlopeSetting            = settingsObject.FindProperty("m_BuildSettings.agentSlope");
        var ledgeDropHeightSetting       = settingsObject.FindProperty("m_BuildSettings.ledgeDropHeight");
        var agentClimbSetting            = settingsObject.FindProperty("m_BuildSettings.agentClimb");
        var maxJumpAcrossDistanceSetting = settingsObject.FindProperty("m_BuildSettings.maxJumpAcrossDistance");
        var accuratePlacementSetting     = settingsObject.FindProperty("m_BuildSettings.accuratePlacement");
        var minRegionAreaSetting         = settingsObject.FindProperty("m_BuildSettings.minRegionArea");
        var widthInaccuracySetting       = settingsObject.FindProperty("m_BuildSettings.widthInaccuracy");
        var heightInaccuracySetting      = settingsObject.FindProperty("m_BuildSettings.heightInaccuracy");

        agentRadiusSetting.floatValue           = agentRadius.EvaluateIn(context);
        agentHeightSetting.floatValue           = agentHeight.EvaluateIn(context);
        agentSlopeSetting.floatValue            = maxSlope.EvaluateIn(context);
        ledgeDropHeightSetting.floatValue       = dropHeight.EvaluateIn(context);
        agentClimbSetting.floatValue            = stepHeight.EvaluateIn(context);
        maxJumpAcrossDistanceSetting.floatValue = jumpDistance.EvaluateIn(context);
        accuratePlacementSetting.boolValue      = heightMesh.EvaluateIn(context);
        minRegionAreaSetting.floatValue         = minRegionArea.EvaluateIn(context);
        widthInaccuracySetting.floatValue       = widthInaccuracy.EvaluateIn(context);
        heightInaccuracySetting.floatValue      = heightInaccuracy.EvaluateIn(context);

        settingsObject.ApplyModifiedProperties();

        Debug.Log("Starting baking of nav mesh.");
        NavMeshBuilder.BuildNavMeshAsync();
        do
        {
            yield return("");

            if (context.CancelRequested)
            {
                NavMeshBuilder.Cancel();
            }
        } while(NavMeshBuilder.isRunning);
        Debug.Log("Nav mesh bake process finished.");
    }
Beispiel #4
0
    public static void GeneratePathfindingPlatforms()
    {
        GameObject platformsGO = GameObject.Find("Pathfinding Platform");

        if (platformsGO != null)
        {
            DestroyImmediate(platformsGO);
        }

        platformsGO = new GameObject("Pathfinding Platform");

        MeshFilter   platformMF = platformsGO.AddComponent <MeshFilter>();
        MeshRenderer meshRend   = platformsGO.AddComponent <MeshRenderer>();

        platformsGO.AddComponent <MeshCollider>();
        platformsGO.isStatic = true;

        Mesh newMesh = new Mesh();

        EdgeCollider2D[] allEdges = FindObjectsOfType <EdgeCollider2D>();
        BoxCollider2D[]  allBoxes = FindObjectsOfType <BoxCollider2D>();

        List <Quad> quads = new List <Quad>();

        float   navMeshDepth   = 4f;
        Vector3 depthOffset    = new Vector3(0f, 0f, PathfindingCharacterController.navMeshZ + navMeshDepth * 0.5f);
        Vector3 negDepthOffset = new Vector3(0f, 0f, PathfindingCharacterController.navMeshZ - navMeshDepth * 0.5f);

        foreach (EdgeCollider2D edge in allEdges)
        {
            Vector3 lastWorldPoint = Vector3.zero;
            for (int p = 0; p < edge.points.Length; p++)
            {
                Vector3 worldPoint = edge.transform.TransformPoint(edge.points[p]);
                if (lastWorldPoint != Vector3.zero)
                {
                    quads.Add(new Quad(lastWorldPoint + negDepthOffset, worldPoint + negDepthOffset, worldPoint + depthOffset, lastWorldPoint + depthOffset));
                }
                lastWorldPoint = worldPoint;
            }
        }

        foreach (BoxCollider2D box in allBoxes)
        {
            if (box.isTrigger)
            {
                continue;
            }
            float xMin = box.offset.x - box.size.x;
            float xMax = box.offset.x + box.size.x;
            float yTop = box.offset.y + box.size.y;

            Vector3 left  = box.transform.TransformPoint(xMin, yTop, 0f);
            Vector3 right = box.transform.TransformPoint(xMax, yTop, 0f);
            quads.Add(new Quad(left + negDepthOffset, right + negDepthOffset, right + depthOffset, left + depthOffset));
        }

        Vector3[] vertices = new Vector3[quads.Count * 4];
        int[]     tris     = new int[quads.Count * 6];

        for (int q = 0; q < quads.Count; q++)
        {
//			Debug.Log("Adding Quad " + q);
            quads[q].Insert(vertices, q * 4, tris, q * 6);
        }

        newMesh.vertices  = vertices;
        newMesh.triangles = tris;

        platformMF.mesh = newMesh;

        NavMeshBuilder.ClearAllNavMeshes();
        NavMeshBuilder.BuildNavMeshAsync();
        meshRend.enabled = false;
    }