项目符号反射(跳弹)未按预期工作

时间:2019-04-03 13:27:40

标签: c# unity3d collision-detection game-physics

我正在创建2D自上而下的Shooter。我已经知道要让子弹从墙上弹开了,我正在使用OnCollisionEnter2D和苯乙烯2D。子弹在撞墙后确实会反弹,但它们围绕自己的轴旋转。我尝试了很多方法,但无法使这一方法正常工作。

那是实际的样子:

enter image description here

这是我的子弹代码和子弹代码。

public class GunBullet : MonoBehaviour
{
    [HideInInspector] public PlayerAvatar ownerPlayerAvatar;
    SpriteRenderer spriteRenderer;
    public int damage = 15;
    [SerializeField] float bulletSpeed;
    Rigidbody2D rigidbody;

    public void Start()
    {
        rigidbody = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigidbody.velocity = transform.right * BulletSpeed;
    }
}

public class RicochetMode : MonoBehaviour
{

    Rigidbody2D rigidbody2D;
    GunBullet gunBullet;

    private void Start()
    {
        rigidbody2D = transform.root.GetComponent<Rigidbody2D>();
        gunBullet = transform.root.GetComponent<GunBullet>();
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.layer == LayerMask.NameToLayer("Obstacle"))
        {
            Debug.Log("RICOCHET");
            Vector2 reflectedPosition = Vector3.Reflect(transform.right, collision.contacts[0].normal);
            rigidbody2D.velocity = (reflectedPosition).normalized * gunBullet.BulletSpeed;

            Vector2 dir = rigidbody2D.velocity;
            float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
            rigidbody2D.MoveRotation(angle);
        }
    }
}

我希望子弹面朝正确的方向。而且我不想使用统一的2D物理材料。

编辑。

问题解决方案是设置
正如@trollingchar所说,刚性body2D.angularVelocity为零。

2 个答案:

答案 0 :(得分:0)

MoveRotation将增量添加到旋转角度。看起来您似乎想要将合成方向设置为angle,在这种情况下,您将使用僵硬的物体。旋转。

GetComponent<Rigidbody>().rotation = Quaternion.Euler(0, 0, Mathf.Atan2(dir.y, dir.x)*Mathf.Rad2Deg);

或者,您可以尝试根据碰撞后X或Y速度的变化来反转X或Y变换。

transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);

答案 1 :(得分:0)

请检查下面的代码,将其应用于应该具有重力为0的刚体和圆形对撞机2d的子弹

 public float speed;

    private void Update()
    {
        transform.Translate(Vector2.up * Time.deltaTime * speed);
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.tag == "wall")
        {
            ContactPoint2D point = collision.contacts[0];
            Vector2 newDir = Vector2.zero;
            Vector2 curDire = this.transform.TransformDirection(Vector2.up);

            newDir = Vector2.Reflect(curDire, point.normal);
            transform.rotation = Quaternion.FromToRotation(Vector2.up, newDir);
        }
    }