Jak uratować siatkę przed materiałem interaktywnym podczas pracy w Unity?


10

Na początku sceny mam GameObject o nazwie „arkusz” umieszczony nad GameObject „piłką”. Arkusz ma na sobie komponent tkaniny interaktywnej i moduł renderujący tkaniny. Siatka komponentu tkaniny interaktywnej jest płaszczyzną z dużą liczbą wierzchołków. W czasie wykonywania arkusz spada na piłkę i tworzy pożądany kształt. Jeśli w tym momencie wyłączę składnik Interaktywna tkanina, siatka arkusza pozostanie dokładnie tak, jak chcę, ale nie mogę wyciągnąć go jako prefabrykatu.

Czy ktoś zna sposób na uzyskanie kopii tego kształtu?

Na przykład czytając siatkę z tkaniny interaktywnej w czasie wykonywania, a następnie używając jej do zmiany siatki tak, jak chcę, bez komponentu tkaniny interaktywnej.

Każda pomoc byłaby bardzo mile widziana.


Alternatywnie, możesz wykonać symulację tkaniny w czymś takim jak blender, zapisać siatkę i zaimportować ją do jedności. Istnieje wiele samouczków, jak to zrobić online.
Peethor,

Odpowiedzi:


0

Pomoże proste zachowanie i niestandardowy inspektor. Dodaj to do swoich skryptów:

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

Następnie w scenie dodaj SaveMeshBehaviour do swojej tkaniny. Niestandardowy inspektor sprawi, że nowy komponent będzie miał przycisk Zapisz. Podczas odtwarzania sceny kliknij przycisk Zapisz, aby zapisać siatkę będącą kopią samolotu.

Mam nadzieję że to pomoże!


2
Dzięki, ale to nie zadziała w moim przykładzie, ponieważ nie ma dołączonego MeshFilter. Wynika to z faktu, że składnik Tkaniny interaktywnej przechowuje siatkę. Próbowałem zmodyfikować skrypt, ale mogę uzyskać dostęp tylko do „<InteractiveCloth> () .vertices” i „<InteractiveCloth> () .mesh”. Myślę, że siatka, którą trzyma, nie zmienia się, ponieważ kiedy używam twojego skryptu, aby uzyskać dostęp do siatki, po prostu generuje oryginalną siatkę. Myślę, że wierzchołki są modyfikowane, ale nie wiem, jak tego użyć, aby utworzyć nową siatkę.
RebDev,

Jeśli możesz uzyskać tablicę wierzchołków i siatki. Spróbuj skopiować siatkę, a następnie copy.vertices = cloth.vertices postępuj zgodnie z nią, tworząc zasób z kopii jak wyżej. Nie jestem pewien, czy to zadziała, ale może.
PatrickSharbaugh,

Niestety pojawia się błąd: „Siatki.księgi są za małe. Dostarczona tablica wierzchołków ma mniej wierzchołków niż wskazuje tablica trójkątów”.
RebDev
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.