So the problem is that I have an car damage script, which deforms mesh on collision. It works but it keeps giving me this error and I don't understand what's wrong it. So if someone could point me on right direction.
ERROR:
------
IndexOutOfRangeException: Array index is out of range.
CarDamage2.OnCollisionEnter (UnityEngine.Collision collision) (at Assets/Scripts/CarDamage2.cs:44)
SCRIPT:
-------
using UnityEngine;
using System.Collections;
public class CarDamage2 : MonoBehaviour
{
public float maxMoveDelta = 1.0f; // maximum distance one vertice moves per explosion (in meters)
public float maxCollisionStrength = 50.0f;
public float YforceDamp = 0.1f; // 0.0 - 1.0
public float demolutionRange = 0.5f;
public float impactDirManipulator = 0.0f;
public MeshFilter[] optionalMeshList;
private MeshFilter[] meshfilters;
private float sqrDemRange;
public void Start()
{
//maxMoveDelta = Mathf.Clamp01(maxMoveDelta);
if(optionalMeshList.Length>0)
meshfilters = optionalMeshList;
else
meshfilters = GetComponentsInChildren();
sqrDemRange = demolutionRange*demolutionRange;
/* doesnt work, strange physic behaviour
for(int j=0; j();
meshfilters[j].transform.collider.isTrigger = true;
}
}*/
}
public void OnCollisionEnter( Collision collision )
{
Vector3 colRelVel = collision.relativeVelocity;
colRelVel.y *= YforceDamp;
Vector3 colPointToMe = transform.position - collision.contacts[0].point;
// Dot = angle to collision point, frontal = highest damage, strip = lowest damage
float colStrength = colRelVel.magnitude * Vector3.Dot(collision.contacts[0].normal, colPointToMe.normalized);
OnMeshForce( collision.contacts[0].point, Mathf.Clamp01(colStrength/maxCollisionStrength) );
Debug.DrawLine(collision.contacts[0].point, transform.position, Color.red);
//Debug.Break();
}
// if called by SendMessage(), we only have 1 param
public void OnMeshForce( Vector4 originPosAndForce )
{
OnMeshForce( (Vector3)originPosAndForce, originPosAndForce.w );
}
public void OnMeshForce( Vector3 originPos, float force )
{
// force should be between 0.0 and 1.0
force = Mathf.Clamp01(force);
for(int j=0; j 45° to 0° / current vertice is nearer to exploPos than center of bounds
if( originToMeDir.sqrMagnitude < sqrDemRange ) //dot > 0.8f )
{
float dist = Mathf.Clamp01(originToMeDir.sqrMagnitude/sqrDemRange);
float moveDelta = force * (1.0f-dist) * maxMoveDelta;
Vector3 moveDir = Vector3.Slerp(originToMeDir, flatVertToCenterDir, impactDirManipulator).normalized * moveDelta;
verts[i] += Quaternion.Inverse(transform.rotation)*moveDir;
//Debug.DrawRay(vertWorldPos, moveDir, Color.red);
//Debug.DrawLine(vertWorldPos, transform.position, Color.green);
///Debug.Break();
}
}
meshfilters[j].mesh.vertices = verts;
meshfilters[j].mesh.RecalculateBounds();
}
}
}
ERROR LINE FROM CODE:
---------------------
Vector3 colPointToMe = transform.position - collision.contacts[0].point;
↧