Come salvare la mesh da un panno interattivo in fase di esecuzione in Unity?


10

All'inizio di una scena ho GameObject chiamato 'foglio' posizionato sopra una 'palla' GameObject. Il foglio ha un componente Interactive Cloth su di esso e un Cloth Renderer. La mesh per il componente Interactive Cloth è un piano con un numero elevato di vertici. In fase di esecuzione il foglio cade sulla palla e crea la forma che desidero. Se disabilito il componente Interactive Cloth a questo punto, la mesh del foglio rimane esattamente come la voglio, ma non riesco a estrarla come Prefabbricato.

Qualcuno sa un modo per ottenere una copia di quella forma?

Ad esempio, leggendo la mesh da Interactive Cloth in fase di esecuzione e quindi utilizzandola per cambiare la mesh nel modo desiderato senza il componente Interactive Cloth.

Qualsiasi aiuto sarebbe molto apprezzato.


In alternativa, potresti fare una simulazione del tessuto in qualcosa come il frullatore, salvare la mesh e importarla in unità. Ci sono molti tutorial su come farlo online.
Peethor,

Risposte:


0

Un comportamento semplice e un ispettore personalizzato aiuteranno. Aggiungi questo ai tuoi script:

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

Quindi nella scena aggiungi SaveMeshBehaviour al tuo panno. L'ispettore personalizzato farà in modo che il nuovo componente abbia un pulsante Salva. Quando stai riproducendo la tua scena, fai clic sul pulsante Salva per salvare una mesh che è una copia dell'aereo.

Spero che sia di aiuto!


2
Grazie, ma non funzionerà per il mio esempio in quanto non è collegato MeshFilter. Questo perché il componente Interactive Cloth contiene la Mesh. Ho provato a modificare il tuo script ma posso solo accedere a "<InteractiveCloth> () .vertices" e "<InteractiveCloth> () .mesh". Penso che la mesh che contiene non cambi come quando uso il tuo script per accedere alla mesh, genera solo la mesh originale. Penso che i vertici vengano modificati ma non so come usarlo per creare una nuova mesh.
RebDev,

Se riesci a ottenere l'array di vertici e la mesh. Prova a copiare la mesh e poi copy.vertices = cloth.vertices segui ciò creando una risorsa dalla copia come sopra. Non sono sicuro che funzionerà, ma potrebbe.
PatrickSharbaugh,

Sfortunatamente dà l'errore "Mesh.vertices è troppo piccolo. L'array di vertici fornito ha meno vertici di quelli a cui fa riferimento l'array di triangoli."
RebDev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.