Як врятувати сітку від інтерактивної тканини під час виконання в Unity?


10

На початку сцени у мене є GameObject під назвою "аркуш", розміщений над "кулькою" GameObject. На аркуші є компонент інтерактивної тканини на ній і референт тканини. Компонент Mesh for Interactive Cloth - це площина з великою кількістю вершин. Під час виконання аркуш опускається над кулькою і створює потрібну форму. Якщо я відключу компонент «Інтерактивна тканина» в цей момент, сітка аркуша залишається точно такою, якою я її хочу, але я не можу витягнути її як збірну.

Хтось знає спосіб отримати копію такої форми?

Наприклад, прочитавши сітку з інтерактивної тканини під час виконання, а потім скориставшись нею, щоб змінити сітку назад, як я цього хочу без компонента Interactive Cloth.

Будь-яка допомога буде дуже вдячна.


Крім того, ви можете зробити моделювання тканини в чомусь на зразок блендера, зберегти сітку та імпортувати її в єдність. Існує безліч навчальних посібників про те, як це зробити в Інтернеті.
— Peethor

Відповіді:


0

Проста поведінка та інспектор на замовлення допоможуть. Додайте це до своїх сценаріїв:

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

Потім у сцені додайте SaveMeshBehaviour до своєї тканини. Власний інспіктор зробить новий компонент кнопкою "Зберегти". Коли ви граєте на сцені, натисніть кнопку збереження, і вона збереже сітку, яка є копією літака.

Сподіваюся, це допомагає!


2
Дякую, але він не працює для мого прикладу, оскільки MeshFilter не додається. Це тому, що компонент Interactive Cloth містить Меш. Я спробував змінити ваш сценарій, але я можу отримати доступ лише до "<InteractiveCloth> () .vertices" та "<InteractiveCloth> () .mesh". Я думаю, що сітка, яку вона тримає, не змінюється, як коли я використовую ваш скрипт для доступу до сітки, вона просто виводить оригінальну сітку. Я думаю, що вершини змінюються, але я не знаю, як це використовувати для створення нової сітки.
— RebDev

Якщо ви можете отримати масив вершин і сітки. Спробуйте скопіювати сітку, а потім copy.vertices = cloth.vertices виконайте це, створивши об’єкт із копії, як зазначено вище. Не впевнений, що це спрацює, але може.
— PatrickSharbaugh

На жаль, це дає помилку "Mesh.vertices занадто малий. Масив вершин, що надається, має менше вершин, ніж на них посилається трикутник."
— RebDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.