Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- public class SoftBody : MonoBehaviour {
- [Range(0, 1f)]
- public float forceMultiplier = 0.025f;
- public float range = 0.2f;
- private int i;
- private int k;
- private Vector3 force;
- private Vector3[] vertices;
- private Mesh mesh;
- private Vector3 localPosition;
- private float distance;
- private void Start() {
- var filter = GetComponent<MeshFilter>();
- mesh = Instantiate<Mesh>(filter.sharedMesh);
- filter.mesh = mesh;
- mesh.Optimize();
- }
- private void OnCollisionEnter(Collision collision) {
- if(collision.contacts.Length > 0)
- for(i = 0; i < collision.contacts.Length; i++) {
- force = collision.relativeVelocity;
- force *= forceMultiplier;
- DeformMeshes(collision.contacts[i].point, force);
- }
- }
- private void DeformMeshes(Vector3 position, Vector3 force) {
- localPosition = transform.InverseTransformPoint(position);
- vertices = mesh.vertices;
- for(k = 0; k < vertices.Length; k++) {
- distance = Mathf.Clamp01(range - (localPosition - vertices[k]).sqrMagnitude);
- vertices[k] = Vector3.Slerp(vertices[k], vertices[k] - force, distance);
- }
- mesh.vertices = vertices;
- mesh.RecalculateBounds();
- mesh.RecalculateNormals();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement