#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;
}
}