Wie speichere ich das Netz zur Laufzeit in Unity vor einem interaktiven Tuch?

10

Zu Beginn einer Szene habe ich GameObject namens "Blatt" über einem "Ball" GameObject positioniert. Das Blatt enthält eine interaktive Stoffkomponente und einen Stoffrenderer. Das Netz für die interaktive Stoffkomponente ist eine Ebene mit einer hohen Anzahl von Scheitelpunkten. Zur Laufzeit fällt das Blatt über den Ball und erzeugt die gewünschte Form. Wenn ich die Interactive Cloth-Komponente zu diesem Zeitpunkt deaktiviere, bleibt das Blattnetz genau so, wie ich es möchte, aber ich kann es nicht als Fertighaus herausziehen.

Kennt jemand einen Weg, um eine Kopie dieser Form zu bekommen?

Zum Beispiel, indem Sie das Netz zur Laufzeit vom interaktiven Stoff lesen und dann verwenden, um das Netz ohne die interaktive Stoffkomponente wieder so zu ändern, wie ich es möchte.

Jede Hilfe wäre sehr dankbar.

RebDev
quelle
Alternativ können Sie eine Stoffsimulation in einem Mixer durchführen, das Netz speichern und in Unity importieren. Es gibt viele Tutorials, wie man das online macht.
Peethor

Antworten:

0

Ein einfaches Verhalten und ein benutzerdefinierter Inspektor helfen dabei. Fügen Sie dies Ihren Skripten hinzu:

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

Fügen Sie dann in der Szene das SaveMeshBehaviour zu Ihrem Stoff hinzu. Der benutzerdefinierte Inspektor sorgt dafür, dass die neue Komponente über eine Schaltfläche Speichern verfügt. Wenn Sie Ihre Szene abspielen, klicken Sie auf die Schaltfläche Speichern. Dadurch wird ein Netz gespeichert, das eine Kopie der Ebene ist.

Hoffe das hilft!

PatrickSharbaugh
quelle
2
Vielen Dank, aber für mein Beispiel funktioniert es nicht, da kein MeshFilter angehängt ist. Das liegt daran, dass die interaktive Stoffkomponente das Netz enthält. Ich habe versucht, Ihr Skript zu ändern, kann jedoch nur auf "<InteractiveCloth> () .vertices" und "<InteractiveCloth> () .mesh" zugreifen. Ich denke, dass sich das darin enthaltene Netz nicht ändert, da wenn ich Ihr Skript verwende, um auf das Netz zuzugreifen, nur das ursprüngliche Netz ausgegeben wird. Ich denke, dass die Eckpunkte geändert werden, aber ich weiß nicht, wie ich damit ein neues Netz erstellen soll.
RebDev
Wenn Sie das Array von Eckpunkten und das Netz erhalten können. Versuchen Sie, das Netz zu kopieren, und copy.vertices = cloth.vertices erstellen Sie anschließend wie oben beschrieben ein Asset aus der Kopie. Ich bin mir nicht sicher, ob es funktionieren wird, aber es könnte sein.
Patrick
Leider wird der Fehler "Mesh.vertices ist zu klein. Das angegebene Scheitelpunktarray hat weniger Scheitelpunkte als vom Dreiecksarray referenziert." Angezeigt.
RebDev