Когда я звоню CombineMeshes()
, я получаю 431 раз ошибку:
Cannot combine mesh that does not allow access: Cube
UnityEngine.Mesh:CombineMeshes(CombineInstance[])
Я уже прочитал это и это.Я использую Unity 2019.1.0f2
- следовательно, если я хочу использовать Blender, я вынужден использовать Blender 2.80beta
.
Я сделал очень простой куб (на самом деле он не может быть проще) и я экспортировал это в Unity как fbx
файл:

Я назвал это 'Wall
' так:

Из этого я сделал сборный дом.Затем я сделал пустой объект, создал скрипт для генерации стен.Он создает префабы для создания стен, и это дает:

Но эти сборные представляют собой простые кубы, подобные этому:

Так что я хотел бы объединить их.В Unity есть что-то готовое для этого: CombineMeshes()
.
Я попытался адаптировать код по ссылке CombineMeshes()
, поэтому вот мой полный сценарий, которыйочень просто: он запускает + пытается объединить все в конце:
using System;
using System.Linq;
using UnityEngine;
public class CoinGenerator : MonoBehaviour
{
public GameObject wallPrefab;
public float gridSize = 40f;
public float topPrefab = 60f;
private void Start()
{
string[] ok = {
"+------------+ +------------+",
"|............| |............|",
"|.+--+.+---+.| |.+---+.+--+.|",
"|.| |.| |.| |.| |.| |.|",
"|.+--+.+---+.+-+.+---+.+--+.|",
"|............. .............|",
"|.+--+.++.+-------+.++.+--+.|",
"|.+--+.||.+--+ +--+.||.+--+.|",
"|......||....| |....||......|",
"+----+.|+--+.| |.+--+|.+----+",
" |.|+--+.+-+.+--+|.| ",
" |.||..... .....||.| ",
" |.||.+--- ---+.||.| ",
"-----+.++.| |.++.+-----",
"..........| |..........",
"-----+.++.| |.++.+-----",
" |.||.+-------+.||.| ",
" |.||...........||.| ",
" |.||.+-------+.||.| ",
"+----+.++.+--+ +--+.++.+----+",
"|............| |............|",
"|.+--+.+---+.| |.+---+.+--+.|",
"|.+-++.+---+.+-+.+---+.++-+.|",
"|...||........ ........||...|",
"+-+.||.++.+-------+.++.||.+-+",
"+-+.++.||.+--+ +--+.||.++.+-+",
"+......||....| |....||......+",
"+.+----++--+.| |.+--++----+.+",
"+.+--------+.+-+.+--------+.+",
"+...........................+",
"+---------------------------+"
};
MeshFilter[] meshFilters = {};
for (int z = -14; z <= 16; z++) {
for (int x = -14; x <= 14; x++) {
char c = ok[30 - (z + 14)][x + 14];
GameObject cp = null;
if (c == '+' || c == '-' || c == '|') {
cp = Instantiate(wallPrefab, null, true);
MeshFilter[] m = cp.GetComponentsInChildren<MeshFilter>();
meshFilters = meshFilters.Concat(m).ToArray();
}
if (cp == null) {
continue;
}
cp.transform.position = new Vector3(
x * gridSize, topPrefab, z * gridSize
);
}
}
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;
// hide the objects, they will be merges into one:
//meshFilters[i].gameObject.SetActive(false);
i++;
}
transform.GetComponent<MeshFilter>().mesh = new Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
}
}
Когда я звоню CombineMeshes()
, я получаю 431 раз ошибку:
Cannot combine mesh that does not allow access: Cube
UnityEngine.Mesh:CombineMeshes(CombineInstance[])
Что я делаюнеправильно?