C# 跳弹dо;n';t wо;rk pr和#x43E;佩里
嗨,我想为我的子弹做弹跳。但当我的子弹与墙壁相撞时,子弹开始沿着墙壁飞行: 我做错了什么?以下是我的代码部分:C# 跳弹dо;n';t wо;rk pr和#x43E;佩里,c#,unity3d,C#,Unity3d,嗨,我想为我的子弹做弹跳。但当我的子弹与墙壁相撞时,子弹开始沿着墙壁飞行: 我做错了什么?以下是我的代码部分: public Rigidbody2D rb; Vector2 m_dir; private void Start() { m_dir = rb.GetRelativeVector(Vector2.right); rb.velocity = m_dir * speed; } void OnCollisionEnter2D(
public Rigidbody2D rb;
Vector2 m_dir;
private void Start()
{
m_dir = rb.GetRelativeVector(Vector2.right);
rb.velocity = m_dir * speed;
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Wall")
{
Vector2 _wallNormal = col.contacts[0].normal;
m_dir = Vector2.Reflect(rb.velocity, _wallNormal).normalized;
Debug.Log("Collide!"); // debug works
rb.velocity = m_dir * speed;
}
}
项目符号检查器-
CircleCollider2D
+Rigidbody2D
。墙壁检查器-boxCollizedR2D
+刚体2D(运动学)
首先:Unity physics中的默认行为应该已经在没有您帮助的情况下从墙上弹回子弹了。
由于子弹对撞机是圆形的,它不应该以随机方向飞行 问题的原因:
您遇到的问题似乎来自调用方法的顺序。
基本上,统一物理首先解决这个物理框架的碰撞,然后调用所有OnCollisionCenter方法。()
这会导致你的rb.velocity已经是弹跳速度。
现在,当计算速度指向远离墙壁的反射角时,将得到向内的速度。
本质上,你的子弹不断地从墙上弹回,但你在每一帧中都会改变方向回到墙上 如何解决:
使用速度代替rb.velocity。
这是撞击时记录的速度,而不是改变的速度。
注意:因为它是相对于一个静止的物体,所以你得到了绝对速度
m_dir = Vector2.Reflect(rb.velocity, _wallNormal).normalized;
变成
m_dir = Vector2.Reflect(-col.relativeVelocity, _wallNormal).normalized;
没有解决。现在是向下,而不是向上(看截图)你指的是哪个截图?我没有看到任何显示子弹落下的截图。在问题中。但子弹是落下的,而不是上升的。文件不清楚谁是相对速度的始作俑者。好像是墙。只要否定相对性,它就会起作用。请让我知道它是否有用,然后我可以更正我的答案。是的,它有效!我很高兴。回答正确,然后我会接受这个答案