Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 统一:将爆炸力添加到2D_Javascript_C#_Unity3d - Fatal编程技术网

Javascript 统一:将爆炸力添加到2D

Javascript 统一:将爆炸力添加到2D,javascript,c#,unity3d,Javascript,C#,Unity3d,我想将脚本更改为2D c#脚本。我知道AddExplosionForce不是UnityEngine.Rigidbody2D的成员,所以如何将其更改为2D脚本,并且仍然在所有方向上应用相同的力。(基本上是一样的,但在2D中)谢谢!这是我的剧本: # pragma strict var explosionStrength : float = 100; function OnCollisionEnter(_other: Collision) { if (_other.collider.gam

我想将脚本更改为2D c#脚本。我知道AddExplosionForce不是UnityEngine.Rigidbody2D的成员,所以如何将其更改为2D脚本,并且仍然在所有方向上应用相同的力。(基本上是一样的,但在2D中)谢谢!这是我的剧本:

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

据我所知,没有内置的功能,但实际上很容易实现。以下是使用扩展方法的示例:

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);
    }
}
现在,您可以像使用3D rigidbody AddExplosionForce一样简单地使用它,例如在代码中:

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);
    }
}
请参见演示:

资料来源:

关于这一点的答案很好,但是,它对我不起作用。那是在他使用的
Forcemode2D
中<代码>力模式2D。据我所知,力仅适用于长时间执行的力。但是,爆炸效果更像,例如。一跳。因此,我刚刚将
Forcemode2D.Force
更改为
Forcemode2D.pulse
,现在它可以工作了^^

这是新密码

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

无论如何,谢谢你o/

嗨,谢谢你回复我的答案。当我尝试将脚本附加到一个对象时,我不断收到一条消息,弹出消息说“无法添加脚本行为Rigidbody 2Text。脚本类不能是抽象的!”再次感谢您。因此,当我尝试通过添加组件和添加脚本来创建新脚本时,我得到了这个错误:名称空间
global::'已经包含了
Rigidbody2DExt'的定义。谢谢你,你不能也不需要将脚本附加到任何东西上,它不是单一行为。只要把它放在你的资产文件夹里,就足够了。您可以将其视为向名为
AddExplosionForce
的类添加新函数的库。下面是一些关于扩展方法的更多信息:谢谢,我在我的资产窗口中创建了一个名为Rigidbody2DExt的文件夹,并将脚本放在其中。但是,当我与一个物体碰撞时,它不会击退我的播放器???抱歉,我是个新手,抱歉问了一些愚蠢的问题。谢谢你这并不愚蠢,但很难回答,因为事实上任何原因都可能发生。我建议您对此进行调试,使用MonoDevelop调试器或只是添加一些debug.Log打印。查看是否调用了
OnCollisionInter2d
。然后查看代码是否在此函数中输入
if
子句。如果没有,请确保您的对象附加了处理碰撞的脚本,确保您的语法正确(您意外地使用了
OnCollisionCenter
Collider
而不是
OnCollisionInter2d
Collider2D
,您将对象准确地命名为“Bouncy object”,碰撞器没有标记为
isTrigger
。。。