Comment enregistrer le maillage d'un tissu interactif lors de l'exécution dans Unity?

10

Au début d'une scène, j'ai GameObject appelé «feuille» positionné au-dessus d'un GameObject «boule». La feuille contient un composant Tissu interactif et un rendu de tissu. Le maillage du composant Tissu interactif est un plan avec un nombre élevé de sommets. Au moment de l'exécution, la feuille tombe sur la balle et crée la forme que je veux. Si je désactive le composant Tissu interactif à ce stade, le maillage de la feuille reste exactement comme je le souhaite, mais je ne peux pas le retirer en tant que préfabriqué.

Quelqu'un connaît-il un moyen d'obtenir une copie de cette forme?

Par exemple, en lisant le maillage du tissu interactif au moment de l'exécution, puis en l'utilisant pour changer le maillage comme je le veux sans le composant tissu interactif.

Toute aide serait grandement appréciée.

RebDev
la source
Alternativement, vous pouvez faire une simulation de tissu dans quelque chose comme un mélangeur, enregistrer le maillage et l'importer dans l'unité. Il existe de nombreux didacticiels sur la façon de le faire en ligne.
Peethor

Réponses:

0

Un comportement simple et un inspecteur personnalisé vous aideront. Ajoutez ceci à vos 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();
    }
}

Ensuite, dans la scène, ajoutez le SaveMeshBehaviour à votre tissu. L'inspecteur personnalisé créera un bouton Enregistrer pour le nouveau composant. Lorsque vous jouez votre scène, cliquez sur le bouton Enregistrer et il enregistrera un maillage qui est une copie de l'avion.

J'espère que cela t'aides!

PatrickSharbaugh
la source
2
Merci mais cela ne fonctionnera pas pour mon exemple car il n'y a pas de MeshFilter attaché. En effet, le composant Tissu interactif contient le maillage. J'ai essayé de modifier votre script mais je ne peux accéder qu'à "<InteractiveCloth> () .vertices" et "<InteractiveCloth> () .mesh". Je pense que le maillage qu'il contient ne change pas car lorsque j'utilise votre script pour accéder au maillage, il sort simplement le maillage d'origine. Je pense que les sommets sont en cours de modification mais je ne sais pas comment utiliser cela pour créer un nouveau maillage.
RebDev
Si vous pouvez obtenir le tableau de sommets et le maillage. Essayez de copier le maillage, puis copy.vertices = cloth.vertices suivez cela en créant un élément à partir de la copie comme ci-dessus. Je ne sais pas si cela fonctionnera, mais cela pourrait.
PatrickSharbaugh
Malheureusement, cela donne l'erreur "Mesh.vertices est trop petit. Le tableau de sommets fourni a moins de sommets que ceux référencés par le tableau de triangles."
RebDev