Javascript 统一:将爆炸力添加到2D
我想将脚本更改为2D c#脚本。我知道AddExplosionForce不是UnityEngine.Rigidbody2D的成员,所以如何将其更改为2D脚本,并且仍然在所有方向上应用相同的力。(基本上是一样的,但在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
# 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
。。。