Unity: невозможно объединить меш, который не разрешает доступ: Cube - PullRequest
1 голос
/ 01 мая 2019

Когда я звоню 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 файл:

blender simple cube

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

wall blender object

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

wall generated

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

wireframe view

Так что я хотел бы объединить их.В 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[])

Что я делаюнеправильно?

1 Ответ

2 голосов
/ 01 мая 2019

Я подозреваю, что модель куба, которую вы импортировали из blender, не имеет флага Read/Write Enabled, установленного в true.

Перейдите на вкладку Model для импортированной модели и убедитесь, что для Read/Write Enabled установлено значение true, и внесите изменения.

Если этот флаг уже установлен, то единственное, о чем я могу думать, это то, что где-то в вашем коде может быть вызов UploadMeshData() (или, возможно, в пакете, который вы импортировали?). UploadMeshData() принимает в качестве параметра логическое значение и, если оно имеет значение true, устанавливает меш, который больше не читается скриптами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...