Как сохранить сетку из интерактивной ткани во время выполнения в Unity?

10

В начале сцены у меня есть GameObject, называемый «лист», расположенный над «шариковым» GameObject. На листе есть компонент "Интерактивная ткань" и средство визуализации ткани. Сетка для компонента Interactive Cloth - это плоскость с большим количеством вершин. Во время выполнения лист падает на шар и создает желаемую форму. Если в этот момент я отключу компонент Interactive Cloth, сетка листа останется именно такой, как я хочу, но я не смогу вытащить ее как Prefab.

Кто-нибудь знает способ получить копию этой формы?

Например, читая сетку из интерактивной ткани во время выполнения, а затем используя ее, чтобы изменить сетку обратно, как я хочу, без компонента интерактивной ткани.

Любая помощь будет принята с благодарностью.

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

Ответы:

0

Простое поведение и пользовательский инспектор помогут. Добавьте это к своим сценариям:

using UnityEngine;
using UnityEditor;
using System.Collections;

public class SaveMeshBehaviour : MonoBehaviour
{
    public Mesh GetMesh()
    {
        return gameObject.GetComponent<MeshFilter>().sharedMesh;
    }
}

[CustomEditor(typeof(SaveMeshBehaviour))]
public class SaveMeshInspector : Editor
{
    public override void OnInspectorGUI()
    {
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("Save"))
        {
            var saveB = target as SaveMeshBehaviour;
            if (saveB != null)
            {
                var mesh = saveB.GetMesh();

                var copy = Mesh.Instantiate(mesh);
                AssetDatabase.CreateAsset(copy, "Assets/NewMesh.asset");
                AssetDatabase.SaveAssets();
            }
        }
        GUILayout.EndHorizontal();
    }
}

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

Надеюсь это поможет!

PatrickSharbaugh
источник
2
Спасибо, но это не сработает для моего примера, так как нет прикрепленного MeshFilter. Это потому, что компонент Interactive Cloth содержит Mesh. Я попытался изменить ваш скрипт, но я могу получить доступ только к "<InteractiveCloth> (). Vertices" и "<InteractiveCloth> (). Mesh". Я думаю, что меш, который он содержит, не меняется, так как когда я использую ваш скрипт для доступа к мешу, он просто выводит исходный меш. Я думаю, что вершины изменяются, но я не знаю, как использовать это для создания нового меша.
RebDev
Если вы можете получить массив вершин и меш. Попробуйте скопировать сетку, а затем copy.vertices = cloth.vertices выполните это, создав ресурс из копии, как указано выше. Не уверен, что это сработает, но может.
PatrickSharbaugh
К сожалению, это выдает ошибку: «Mesh.vertices слишком мал. У предоставленного массива вершин меньше вершин, чем указано в массиве треугольников».
RebDev