1) Создаю массив Корпусов GameObject[] hulls; -> Заполняю массив выполняя поиск по определенному тэгу
GameObject.FindGameObjectsWithTag("/*Название Тэга*/");
2) Далее ищу MeshFilters через этот массив: Для этого создаю массив Фильтров MeshFilter[] filters;-> Заполняю его длинной массива Корпусов filters = new MeshFilter[hulls.Length];-> Далее через цикл for ищу MeshFilters...
for (int i = 0; i < hulls.Length; ++i)
filters[i] = hulls[i].GetComponent<MeshFilter>();
3) Далее просто комбинирую... (Я думаю описывать данный процесс не стоит ведь дело не в комбинировании)
В итоге я иногда сталкиваюсь с тем что нахожу "Невидимые" объекты с подписью "Preview Scene" которых не существует!!!
Скриншот Инспектора:
Помогает только перезапуск Редактора, но иногда оно возвращается...
Версия Unity: 2017.2.03f (Свежая, но и в прошлой такое присутствует)
Сталкивались ли вы с этим? И кто смог решить данную проблему?
Заранее Спасибо!
Дополнительные материалы к теме:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshCombiner : MonoBehaviour
{
public GameObject[] hulls;
private List<MeshFilter> filters;
public void CombineMeshes()
{
Quaternion oldRot = transform.rotation;
Vector3 oldPos = transform.position;
transform.rotation = Quaternion.identity;
transform.position = Vector3.zero;
hulls = GameObject.FindGameObjectsWithTag("Hull");
filters = new List<MeshFilter>(hulls.Length);
for (int i = 0; i < hulls.Length; ++i)
{
if (hulls[i].hideFlags != HideFlags.HideInHierarchy)
filters.Add(hulls[i].GetComponent<MeshFilter>());
}
Debug.Log(name + "Комбинируем...");
Mesh finalMesh = new Mesh();
CombineInstance[] combiners = new CombineInstance[filters.Count];
for(int i = 0; i < filters.Count; i++)
{
if (filters[i].transform == transform)
continue;
combiners[i].subMeshIndex = 0;
combiners[i].mesh = filters[i].sharedMesh;
combiners[i].transform = filters[i].transform.localToWorldMatrix;
}
finalMesh.CombineMeshes(combiners);
finalMesh.name = "PlayerShipMesh";
GetComponent<MeshFilter>().sharedMesh = finalMesh;
GetComponent<FloatingGameEntityFlat>().buoyancyMesh = finalMesh;
GetComponent<MeshCollider>().sharedMesh = finalMesh;
transform.rotation = oldRot;
transform.position = oldPos;
}
}
using System.Collections.Generic;
using UnityEngine;
public class MeshCombiner : MonoBehaviour
{
public GameObject[] hulls;
private List<MeshFilter> filters;
public void CombineMeshes()
{
Quaternion oldRot = transform.rotation;
Vector3 oldPos = transform.position;
transform.rotation = Quaternion.identity;
transform.position = Vector3.zero;
hulls = GameObject.FindGameObjectsWithTag("Hull");
filters = new List<MeshFilter>(hulls.Length);
for (int i = 0; i < hulls.Length; ++i)
{
if (hulls[i].hideFlags != HideFlags.HideInHierarchy)
filters.Add(hulls[i].GetComponent<MeshFilter>());
}
Debug.Log(name + "Комбинируем...");
Mesh finalMesh = new Mesh();
CombineInstance[] combiners = new CombineInstance[filters.Count];
for(int i = 0; i < filters.Count; i++)
{
if (filters[i].transform == transform)
continue;
combiners[i].subMeshIndex = 0;
combiners[i].mesh = filters[i].sharedMesh;
combiners[i].transform = filters[i].transform.localToWorldMatrix;
}
finalMesh.CombineMeshes(combiners);
finalMesh.name = "PlayerShipMesh";
GetComponent<MeshFilter>().sharedMesh = finalMesh;
GetComponent<FloatingGameEntityFlat>().buoyancyMesh = finalMesh;
GetComponent<MeshCollider>().sharedMesh = finalMesh;
transform.rotation = oldRot;
transform.position = oldPos;
}
}