Почему скрипт My Me sh Combiner делает дочерние объекты невидимыми и меняет их расположение? - PullRequest
0 голосов
/ 23 апреля 2020

Для дальнейшей оптимизации моей игры я хотел объединить сетки прихожих, чтобы частота кадров была выше. код предназначен для того, чтобы взять всех детей внутри пустого игрового объекта (под названием стены, этажи и т. д. c.) и объединить их сетки в один. Однако всякий раз, когда я запускал скрипт, все дочерние объекты появлялись в совершенно случайных позициях и были невидимы. Как сделать так, чтобы все объекты появились в исходном положении и были видны? enter image description here

Как я настроил код, я бы поместил любые повторяющиеся объекты в пустой объект gameObject, чтобы их можно было легко классифицировать (названные как Стены, Этажи). После этого я назначил бы сценарий пустому gameObject и ожидал объединения каждого повторяющегося объекта в пустом gameObject. Вот пример: 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;

    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Я думаю, что это общая проблема с объединением Unity me sh, попробуйте изменить эту строку (при условии, что это все на объекте Родительская игра):

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;

Зависит от того, как он настроен

...