Як врятувати сітку від інтерактивної тканини під час виконання в 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.