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