En este momento estás viendo Unidad: AddExplosionForce para 2D

 – Unity

Unidad: AddExplosionForce para 2D – Unity

Unidad: AddExplosionForce para 2D

– UnityAssets3Free

bienvenido , soy kein y en esta ocasion os traigo
esta nueva pregunta

Quiero cambiar mi secuencia de comandos a una secuencia de comandos 2D C#. Sé que AddExplosionForce no es miembro de UnityEngine.Rigidbody2D, entonces, ¿cómo puedo cambiar esto a un script 2D y seguir aplicando la misma fuerza en todas las direcciones? (básicamente hacer lo mismo, pero en 2D) ¡Gracias! Aquí está mi guión:

#  pragma strict

var explosionStrength : float = 100;

 function OnCollisionEnter(_other: Collision) 

if (_other.collider.gameObject.name == "Bouncy object")
   _other.rigidbody.AddExplosionForce(explosionStrength, this.transform.position,5);

3 respuestas 3

No hay nada incorporado que yo sepa, pero en realidad es bastante fácil de implementar. Aquí hay un ejemplo usando el método de extensión:

using UnityEngine;

public static class Rigidbody2DExt 

    public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force) 
        var explosionDir = rb.position - explosionPosition;
        var explosionDistance = explosionDir.magnitude;

        // Normalize without computing magnitude again
        if (upwardsModifier == 0)
            explosionDir /= explosionDistance;
        else 
            // From Rigidbody.AddExplosionForce doc:
            // If you pass a non-zero value for the upwardsModifier parameter, the direction
            // will be modified by subtracting that value from the Y component of the centre point.
            explosionDir.y += upwardsModifier;
            explosionDir.Normalize();
        

        rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
    

Ahora puedes usarlo como lo harías con 3D rigidbody AddExplosionForce, por ejemplo con su código:

public class Test : MonoBehaviour 
    public float explosionStrength  = 100;

    void OnCollisionEnter2D( Collision2D _other) 
    
        if (_other.collider.gameObject.name == "Bouncy object")
            _other.rigidbody.AddExplosionForce(explosionStrength, this.transform.position,5);
    

Ver demostración:
https://dl.dropboxusercontent.com/u/16950335/Explosion/index.html

Fuente:
https://dl.dropboxusercontent.com/u/16950335/Explosion/AddExplosionForce2D.zip

La respuesta sobre esto es muy buena, sin embargo, no funcionó para mí. eso fue en Forcemode2D El usó. Forcemode2D.Force es, hasta donde yo sé, solo por la fuerza que se ha mantenido durante un largo período de tiempo. Sin embargo, el efecto de explosión es más similar, por ejemplo. un salto. Así que acabo de cambiar el Forcemode2D.Force por Forcemode2D.Impulse y ahora funciona ^^

Aquí está el nuevo código

using UnityEngine;

public static class Rigidbody2DExt 

    public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force) 
        var explosionDir = rb.position - explosionPosition;
        var explosionDistance = explosionDir.magnitude;

        // Normalize without computing magnitude again
        if (upwardsModifier == 0)
            explosionDir /= explosionDistance;
        else 
            // From Rigidbody.AddExplosionForce doc:
            // If you pass a non-zero value for the upwardsModifier parameter, the direction
            // will be modified by subtracting that value from the Y component of the centre point.
            explosionDir.y += upwardsModifier;
            explosionDir.Normalize();
        

        rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
    

De todos modos gracias o/

La persona que originalmente hizo este código hizo un buen trabajo, pero el único problema es que el código no usa el radio de explosión. Así que hice algunas modificaciones al código y la explosión funciona perfectamente. Así que ahora, dependiendo de la distancia desde el punto de explosión hasta el cuerpo rígido, se aplicarán diferentes fuerzas en función de la distancia.

Aquí está mi versión del código:

public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force)

    var explosionDir = rb.position - explosionPosition;
    var explosionDistance = (explosionDir.magnitude / explosionRadius);

    // Normalize without computing magnitude again
    if (upwardsModifier == 0)
    
        explosionDir /= explosionDistance;
    
    else
    
        // If you pass a non-zero value for the upwardsModifier parameter, the direction
        // will be modified by subtracting that value from the Y component of the centre point.
        explosionDir.y += upwardsModifier;
        explosionDir.Normalize();
    

    rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

eso es todo,hasta la proxima

Deja una respuesta