деформатор не работает для моего mdoel в unity

#c# #unity3d

Вопрос:

Я добавил сетчатый коллайдер,жесткое тело, а также сценарий деформации в 3d-модель, которую я импортировал из 3dsmax, но при воспроизведении сцены моя модель не деформируется. Я попытался создать игровой объект, который будет родительским для моего 3d-актива, в этом случае модель просто отвалится и не будет иметь никакого контакта с какими-либо объектами, поэтому я понятия не имею, что делать, чтобы исправить это.

это сценарий деформации:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Deform : MonoBehaviour
{
    [Range(0, 10)]
    public float deformRadius = 0.2f;
    [Range(0, 10)]
    public float maxDeform = 0.1f;
    [Range(0, 1)]
    public float damageFalloff = 1;
    [Range(0, 10)]
    public float damageMultiplier = 1;
    [Range(0, 100000)]
    public float minDamage = 1;

    public AudioClip[] collisionSounds;

    private MeshFilter filter;
    private Rigidbody physics;
    private MeshCollider coll;
    private Vector3[] startingVerticies;
    private Vector3[] meshVerticies;

    void Start()
    {
        filter = GetComponent<MeshFilter>();
        physics = GetComponent<Rigidbody>();

        if (GetComponent<MeshCollider>())
            coll = GetComponent<MeshCollider>();

        startingVerticies = filter.mesh.vertices;
        meshVerticies = filter.mesh.vertices;
    }

    void OnCollisionEnter(Collision collision)
    {
        float collisionPower = collision.impulse.magnitude;

        if (collisionPower > minDamage)
        {
            if (collisionSounds.Length > 0)
                AudioSource.PlayClipAtPoint(collisionSounds[Random.Range(0, collisionSounds.Length)], transform.position, 0.5f);

            foreach (ContactPoint point in collision.contacts)
            {
                for (int i = 0; i < meshVerticies.Length; i  )
                {
                    Vector3 vertexPosition = meshVerticies[i];
                    Vector3 pointPosition = transform.InverseTransformPoint(point.point);
                    float distanceFromCollision = Vector3.Distance(vertexPosition, pointPosition);
                    float distanceFromOriginal = Vector3.Distance(startingVerticies[i], vertexPosition);

                    if (distanceFromCollision < deformRadius amp;amp; distanceFromOriginal < maxDeform) // If within collision radius and within max deform
                    {
                        float falloff = 1 - (distanceFromCollision / deformRadius) * damageFalloff;

                        float xDeform = pointPosition.x * falloff;
                        float yDeform = pointPosition.y * falloff;
                        float zDeform = pointPosition.z * falloff;

                        xDeform = Mathf.Clamp(xDeform, 0, maxDeform);
                        yDeform = Mathf.Clamp(yDeform, 0, maxDeform);
                        zDeform = Mathf.Clamp(zDeform, 0, maxDeform);

                        Vector3 deform = new Vector3(xDeform, yDeform, zDeform);
                        meshVerticies[i] -= deform * damageMultiplier;
                    }
                }
            }

            UpdateMeshVerticies();
        }
    }

    void UpdateMeshVerticies()
    {
        filter.mesh.vertices = meshVerticies;
        coll.sharedMesh = filter.mesh;
    }
} 
 

введите описание изображения здесь

Комментарии:

1. йоширо, пожалуйста, отредактируйте свой вопрос, добавив текстовое сообщение об ошибке

Ответ №1:

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

Способ, которым вы можете это сделать, заключается в том, чтобы вместо установки вершин использовать filter.mesh.vertices вместо использования filter.mesh.SetVertices(meshVerticies); и просто для уверенности, что вы можете сказать движку, что он должен проверить все остальные вещи о сетке, чтобы убедиться, что они имеют смысл.

Обновите вас UpdateMeshVerticies() до чего-то подобного, и это должно сработать.

 void UpdateMeshVerticies()
{
    filter.mesh.SetVertices(meshVerticies);

    filter.mesh.RecalculateNormals();
    filter.mesh.RecalculateTangents();
    filter.mesh.RecalculateBounds();

    if (coll != null)
    {
        coll.sharedMesh = filter.mesh;
    }
}