¿Cómo salvar la malla de una tela interactiva en tiempo de ejecución en Unity?

10

Al comienzo de una escena, tengo GameObject llamado 'hoja' colocado encima de una 'bola' GameObject. La hoja tiene un componente de tela interactiva y un renderizador de tela. La malla para el componente de tela interactiva es un plano con un alto número de vértices. En el tiempo de ejecución, la hoja cae sobre la pelota y crea la forma que quiero. Si desactivo el componente de tela interactiva en este punto, la malla de la hoja permanece exactamente como la quiero, pero no puedo extraerla como prefabricada.

¿Alguien sabe una forma de obtener una copia de esa forma?

Por ejemplo, leyendo la malla de la tela interactiva en tiempo de ejecución y luego usándola para cambiar la malla como quiero sin el componente de tela interactiva.

Cualquier ayuda sería muy apreciada.

RebDev
fuente
Alternativamente, puede hacer una simulación de tela en algo como una licuadora, guardar la malla e importarla a la unidad. Hay muchos tutoriales sobre cómo hacerlo en línea.
Peethor

Respuestas:

0

Un comportamiento simple y un inspector personalizado ayudarán. Agregue esto a sus 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();
    }
}

Luego, en la escena, agregue SaveMeshBehaviour a su tela. El inspirador personalizado hará que el nuevo componente tenga un botón Guardar. Cuando esté reproduciendo su escena, haga clic en el botón Guardar y se guardará una malla que es una copia del avión.

¡Espero que esto ayude!

PatrickSharbaugh
fuente
2
Gracias, pero no funcionará para mi ejemplo, ya que no hay un MeshFilter conectado. Esto se debe a que el componente de tela interactiva contiene la malla. Intenté modificar su script pero solo puedo acceder a "<InteractiveCloth> () .vertices" y "<InteractiveCloth> () .mesh". Creo que la malla que contiene no cambia, ya que cuando uso su script para acceder a la malla, solo genera la malla original. Creo que los vértices se están modificando, pero no sé cómo usar eso para crear una nueva malla.
RebDev
Si puede obtener la matriz de vértices y la malla. Intente copiar la malla y luego copy.vertices = cloth.vertices siga con la creación de un activo a partir de la copia como se indicó anteriormente. No estoy seguro de que funcione, pero podría funcionar.
PatrickSharbaugh
Desafortunadamente, da el error "Mesh.vertices es demasiado pequeño. La matriz de vértices suministrada tiene menos vértices de los que hace referencia la matriz triangular".
RebDev