为什么我的网格合并器脚本使子对象不可见并更改其位置?

问题描述 投票:0回答:1

为了进一步优化我的游戏,我想结合走廊的网格以使帧速率更高。该代码旨在将所有子代都放在一个空的游戏对象(标题为墙壁,地板等)中,并将其网格合并为一个。但是,每当我运行脚本时,所有子对象都将出现在完全随机的位置,并且是不可见的。如何使所有物体都出现在其原始位置并可见?enter image description here

这里是代码:

using UnityEngine;
using System.Collections;

// Copy meshes from children into the parent's Mesh.
// CombineInstance stores the list of meshes.  These are combined
// and assigned to the attached Mesh.

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CombineMesh : MonoBehaviour
{
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.J))
        {
            CombineMeshes();
        }
    }
    void CombineMeshes()
    {
        Quaternion oldRot = transform.rotation;
        Vector3 oldPos = transform.position;

        transform.rotation = Quaternion.identity;
        transform.position = Vector3.zero;

        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];

        int i = 0;
        while (i < meshFilters.Length)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);

            i++;
        }
        var MeshFilter = transform.GetComponentInChildren<MeshFilter>();
        MeshFilter.mesh = new Mesh();
        MeshFilter.mesh.CombineMeshes(combine);
        GetComponentInChildren<MeshCollider>().sharedMesh = MeshFilter.mesh;
        transform.gameObject.SetActive(true);

        transform.rotation = oldRot;
        transform.position = oldPos;

    }
}
unity3d mesh
1个回答
0
投票

我认为这是Unity网格合并的常见问题,请尝试更改此行(假设这一切都在Parent游戏对象上:]

combine[i].transform = meshFilters[i].transform.localToWorldMatrix;

至此:

combine[i].transform = meshFilters[i].transform.localToWorldMatrix * transform.worldToLocalMatrix

其中transform.worldToLocalMatrix是父对象。您也可以尝试类似的方法:

combine[i].transform = meshFilters[i].transform.localToWorldMatrix * meshFilters[i].transform.parent.transform.worldToLocalMatrix;

取决于您的设置方式

© www.soinside.com 2019 - 2024. All rights reserved.