Как изменять объект в реальном времени

Я хотел бы узнать как изменять объекты в реальном времени(их форму) в unity программно. Что то тип такова:


Ответы (1 шт):

Автор решения: nipercop

В интернете куча примеров и туториалов вы можете найти и научиться. Например вот

Но конечно же изменение формы объекта через с# трудоёмкая задача, обычно такие вещи реализуют с помощью шейдеров, например Fortnite, там когда строишь например стены, то анимация постройки реализовано через шейдер и много чего в общем.

Естественно, для более сложных вещей вам необходимо будет чтонить придмать, для вашего примера, скорее всего вам потребуется сохранить новые положения точек, и потом двигать точки, в течении времени.

А так в краце покажу чтонить

[SerializeField] MeshFilter m_MeshFilter;
Mesh m_Mesh;
Vector3[] m_DefaultVerticles;
Vector3[] m_Verticles;

Vector3[] m_TargetPositions;
float m_Timer = 0;

[SerializeField] float scale = 1;


void Start() {
    m_Mesh = m_MeshFilter.mesh;
    m_DefaultVerticles = m_Mesh.vertices;
    m_Verticles = new Vector3[m_DefaultVerticles.Length];
    m_TargetPositions = new Vector3[m_DefaultVerticles.Length];
    for(int i = 0; i < m_DefaultVerticles.Length; i++) {
        m_Verticles[i] = m_DefaultVerticles[i];
        m_TargetPositions[i] = m_DefaultVerticles[i] * UnityEngine.Random.Range(-.3f, .4f);
    }
}

void Update() {
    for(int i = 0; i < m_DefaultVerticles.Length; i++) {
        m_Verticles[i] = Vector3.Lerp(m_DefaultVerticles[i], m_TargetPositions[i], m_Timer);
    }
    m_Mesh.vertices = m_Verticles;
    m_Timer += Time.deltaTime*.2f;

    // пример изменения формы от времени, например простая водная рябь
    //Vector3 position = transform.position;
    //position.x += Time.time;
    //position.y += Time.time;
    //position.z += Time.time;

    //for(int i = 0; i < m_DefaultVerticles.Length; i++) {
    //    Vector3 point = m_DefaultVerticles[i];

    //    float xDisplace = Mathf.PerlinNoise(point.y + position.y, point.z + position.z);
    //    float yDisplace = Mathf.PerlinNoise(point.x + position.x, point.z + position.z);
    //    float zDisplace = Mathf.PerlinNoise(point.y + position.y, point.x + position.x);

    //    point.x += xDisplace * scale;
    //    point.y += yDisplace * scale;
    //    point.z += zDisplace * scale;

    //    m_Verticles[i] = point;
    //}
    //m_Mesh.vertices = m_Verticles;
}
→ Ссылка