Пулевое отражение (рикошет) работает не так, как задумано - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю 2D Shooter сверху вниз. Я понял, что мои пули отскакивают от стен. Я использую OnCollisionEnter2D и Hardbody2D. Пули отскакивают от удара о стену, но они вращаются вокруг своей оси. Я пробовал много способов, но не могу заставить это работать.

Вот как это выглядит на практике:

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 физики Unity.

EDIT.

Решением проблемы было установить
Hardbody2D.angularVelocity к нулю, как сказал @trollingchar.

1 Ответ

0 голосов
/ 03 апреля 2019

MoveRotation добавляет дельту к углу поворота. Похоже, что вместо этого вы хотите установить результирующее направление равным angle, и в этом случае вы будете использовать hardbody.rotation.

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