Объедините несколько плоскостей, каждый со своей уникальной текстурой, в одну «модель» и сохраните все текстуры в Unity - PullRequest
0 голосов
/ 26 мая 2019

В Unity я создал «стопку» плоскостей (программно), на каждой из которых есть изображение.Я хочу иметь возможность взять камеру и увеличить масштаб в стеке, и, когда он масштабирует стопку плоскостей, увидеть каждое из изображений.

Представьте себе, что вы берете камеру через русскую матрешку и видите каждого изкуклы меньшего размера по мере прохождения.

Также важно отметить, что в моем случае стек плоскостей не идеально выровнен в стеке, и поэтому некоторые из них слегка пересекаются - мне нужно сделатьконечно, они не мерцают.

Я хотел бы объединить эти плоскости, каждая со своим изображением, в единственную «модель» (Mesh, вероятно, правильная терминология, но с использованием этого видео: https://www.youtube.com/watch?v=6APzUgckV7U не работал - он взял все мои планы и просто преобразовал их в одну плоскость; при этом я смог объединить эти планы, но он создал один объект с одним материалом).При этом используются объединители сеток, но я не уверен, что это правильный подход.

Вот некоторый код, который я написал, который берет все плоскости из slicesHolder и объединяет их в одну "модель«.Затем он помещает эту «модель» внутрь finalObject, но, к сожалению, «модель» не сохраняет никаких материалов (изображений) из срезов.И slicesHolder уничтожено.

Quaternion oldRot = slicesHolder.transform.rotation;
Vector3 oldPos = slicesHolder.transform.position;

finalObject.transform.rotation = Quaternion.identity;
finalObject.transform.position = Vector3.zero;

MeshFilter[] meshFilters = slicesHolder.GetComponentsInChildren<MeshFilter>();

Debug.Log("Combining " + meshFilters.Length + " meshes");

Mesh finalMesh = new Mesh();
CombineInstance[] combiners = new CombineInstance[meshFilters.Length];

            for(int a = 0; a < meshFilters.Length; a++){
                //if(meshFilters[a].transform == transform)
                //continue;

                combiners[a].subMeshIndex = 0;
                combiners[a].mesh = meshFilters[a].sharedMesh;
                combiners[a].transform = meshFilters[a].transform.localToWorldMatrix;
            }

finalMesh.CombineMeshes(combiners);

finalObject.GetComponent<MeshFilter>().sharedMesh = finalMesh;
finalObject.transform.rotation = oldRot;
finalObject.transform.position = oldPos;

Destroy(slicesHolder);
finalObject.SetActive(true);

Является ли это правильным способом создания единственной «модели», которая имеет «стопку» отдельных изображений, чтобы я мог увеличить этот стек и увидеть глубжев модель?

1 Ответ

0 голосов
/ 26 мая 2019

Нет эффективного способа сделать это

И причина тому - текстуры.Или, более конкретно, материалы. Поскольку у каждого плана есть уникальный экземпляр материала, невозможно объединить его с другим планом.Вы либо получите то, с чего начали, либо получите комбинированную модель, используя только одну текстур на каждом лице.

Вам понадобится способ сопоставлениякаждая из требуемых текстур на листе спрайта, создайте новый материал с этим листом спрайта, а затем выясните, как смещения УФ должны преобразовываться из одного материала в материал листа спрайта, назначьте материал листа спрайта всем плоскостям затем объединить их в сетку.

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