Obtuve proyectiles prefabricados de la tienda de activos de Unity y no pude encontrar una manera de hacerlos funcionar de la manera prevista.
Los proyectiles tienen colisionadores ( no disparadores ), cuerpo rígido y un script que los mueve a velocidad. Detecta una colisión usando OnCollisionEnter , haciéndolos empujar objetos que tienen cuerpos rígidos (comportamiento no deseado).
De hecho, podría usar OnTriggerEnter , pero el proyectil genera partículas usando el ContactPoint del método OnCollisionEnter al que OnTriggerEnter no tiene acceso. Traté de simular este ContactPoint usando raycasts, pero no tuve suerte. Podría reescribir el código desde cero, pero solo si no hay otra forma...
Hay este video donde el tipo tiene la misma configuración que mi proyectil, cuerpo rígido y colisionador, pero el proyectil no empuja al otro objeto, pero no profundiza en su comportamiento.
¿Algunas ideas?
Deberá mantener la velocidad, la velocidad angular y la posición de cada cuadro, luego agregar un código a OnCollisionEnter en el que le dice a los dos colisionadores que se ignoren entre sí de ahora en adelante, y también restaurar la velocidad original del proyectil, la velocidad angular y la posición .
private Collider col; private Rigidbody rigidBody; private Vector3 vel; private Vector3 angularVel; private Vector3 position; private void Start() { col = gameObject.GetComponent<Collider>(); rigidBody = gameObject.GetComponent<Rigidbody>(); } private void FixedUpdate() { vel = rigidBody.velocity; angularVel = rigidBody.angularVelocity; position = transform.position; } private void OnCollisionEnter(Collision collision) { Physics.IgnoreCollision(col, collision.collider); rigidBody.velocity = vel; rigidBody.angularVelocity = angularVel; transform.position = position; }En Editar -> Configuración del proyecto -> Física, encontrará la Matriz de colisión de capas en la parte inferior. Aquí puede elegir qué capas chocan con qué capas. La capa predeterminada para gameobjects es "Predeterminada". Asigne una nueva capa a sus proyectiles y los objetos de juego con los que no desea colisiones. Luego puede desmarcar la casilla que representa estas dos capas en la Matriz de colisión de capas. Ahora estos objetos de juego no se afectarán entre sí cuando colisionen y no se llamará a métodos como OnCollisionEnter para ellos. Espero que esto responda completamente a su pregunta.