Como salvar a malha de um pano interativo em tempo de execução no Unity?

10

No início de uma cena, tenho o GameObject chamado 'sheet' posicionado acima de um 'ball' GameObject. A folha possui um componente de pano interativo e um renderizador de pano. A malha para o componente Interactive Cloth é um plano com um número alto de vértices. Em tempo de execução, a folha cai sobre a bola e cria a forma que eu quero. Se eu desabilitar o componente Interactive Cloth nesse ponto, a malha da folha permanecerá exatamente como eu quero, mas não posso retirá-lo como um Prefab.

Alguém sabe uma maneira de obter uma cópia dessa forma?

Por exemplo, lendo a malha do Interactive Cloth em tempo de execução e, em seguida, usando-a para alterar a malha novamente como eu quero sem o componente Interactive Cloth.

Qualquer ajuda seria muito apreciada.

RebDev
fonte
Como alternativa, você pode fazer uma simulação de tecido em algo como liquidificador, salvar a malha e importá-la para a unidade. Há muitos tutoriais sobre como fazer isso online.
Peethor 8/03/16

Respostas:

0

Um comportamento simples e um inspetor personalizado ajudarão. Adicione isso aos seus scripts:

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();
    }
}

Em seguida, na cena, adicione o SaveMeshBehaviour ao seu pano. O inspetor personalizado fará com que o novo componente tenha um botão Salvar. Quando estiver reproduzindo sua cena, clique no botão Salvar e ela salvará uma malha que é uma cópia do avião.

Espero que isto ajude!

PatrickSharbaugh
fonte
2
Obrigado, mas não vai funcionar para o meu exemplo, pois não há nenhum MeshFilter anexado. Isso ocorre porque o componente Interactive Cloth mantém a malha. Tentei modificar seu script, mas só posso acessar "<InteractiveCloth> () .vertices" e "<InteractiveCloth> () .mesh". Eu acho que a malha que ela contém não muda, pois quando eu uso seu script para acessar a malha, ela apenas gera a malha original. Acho que os vértices estão sendo modificados, mas não sei como usá-lo para criar uma nova malha.
RebDev
Se você pode obter a matriz de vértices e a malha. Tente copiar a malha e copy.vertices = cloth.vertices siga-a com a criação de um ativo a partir da cópia, como acima. Não tenho certeza se vai funcionar, mas pode.
22815 Patrick'sharbaugh
Infelizmente, ocorre o erro "Mesh.vertices é muito pequeno. A matriz de vértices fornecida possui menos vértices do que os referenciados pela matriz em triângulo".
RebDev