예제 #1
0
    public static void CreateBuildingHLOD()
    {
        if (PrefabStageUtility.GetCurrentPrefabStage() == null ||
            PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot == null)
        {
            Debug.LogWarning("Setup HLOD can only be used while prefab editing.");
            return;
        }

        var parent = PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot.transform;

        if (parent.GetComponent <LODGroup>() != null || parent.GetComponent <HLOD>() != null)
        {
            Debug.LogWarning("HLOD is already setup on this hierarchy");
            return;
        }

        EditorSceneManager.MarkSceneDirty(parent.gameObject.scene);

        var lowLOD = CreateLowLod();


        var highLOD = new GameObject("High LOD").transform;

        while (parent.childCount != 0)
        {
            parent.GetChild(0).SetParent(highLOD, false);
        }

        lowLOD.SetParent(parent, false);
        highLOD.SetParent(parent, false);

        parent.gameObject.AddComponent(typeof(HLOD));
        var hlod = parent.GetComponent <HLOD>();

        Transform[] transforms = { highLOD, lowLOD };
        hlod.LODParentTransforms = transforms;


        var lodgroup = parent.GetComponent <LODGroup>();

        var lods = lodgroup.GetLODs();

        lods[0].screenRelativeTransitionHeight = 0.3F;
        lods[1].screenRelativeTransitionHeight = 0.02F;
        ArrayUtility.RemoveAt(ref lods, 2);
        lodgroup.SetLODs(lods);

        UpdateBounds(hlod);
        var generatedMeshes = new List <Mesh>();

        GenerateCombinedMesh(hlod, highLOD, lowLOD, 1, generatedMeshes);
        WriteMeshAsset(generatedMeshes);

        HLOD.InvalidateHLODCache();
    }
예제 #2
0
    public static void GenerateCombinedMesh()
    {
        if (PrefabStageUtility.GetCurrentPrefabStage() == null ||
            PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot == null)
        {
            Debug.LogWarning("UpdateCombinedMesh can only be used while prefab editing.");
            return;
        }

        var root = PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot;
        var hlod = root.GetComponent <HLOD>();

        if (hlod == null)
        {
            Debug.LogWarning("UpdateCombinedMesh requires a correctly configured HLOD setup");
            return;
        }

        EditorSceneManager.MarkSceneDirty(root.gameObject.scene);

        var hlodTransforms = hlod.LODParentTransforms;

        var lodCount = hlod.GetComponent <LODGroup>().lodCount;

        while (lodCount < hlodTransforms.Length)
        {
            if (hlodTransforms[hlodTransforms.Length - 1])
            {
                Object.DestroyImmediate(hlodTransforms[hlodTransforms.Length - 1].gameObject);
            }
            ArrayUtility.RemoveAt(ref hlodTransforms, hlodTransforms.Length - 1);
        }

        System.Array.Resize(ref hlodTransforms, lodCount);
        var generatedMeshes = new List <Mesh>();

        for (int i = 1; i < lodCount; i++)
        {
            if (hlodTransforms[i] == null)
            {
                hlodTransforms[i] = CreateLowLod();
                hlodTransforms[i].SetParent(root.transform, false);
            }

            GenerateCombinedMesh(hlod, hlod.LODParentTransforms[0], hlodTransforms[i], i, generatedMeshes);
        }

        hlod.LODParentTransforms = hlodTransforms;

        WriteMeshAsset(generatedMeshes);

        HLOD.InvalidateHLODCache();
    }