Проблема с рикошетом от стенки

Программирование на Юнити.

Проблема с рикошетом от стенки

Сообщение StrongWheels 15 окт 2019, 18:31

Есть 2д игра, управление треугольником, при соударении со стенкой необходимо чтобы он отлетал от неё согласно закону отражения. Сама по себе стена может иметь любую ротацию по оси z, как и летящий к нему треугольник. Вот скрипт который весит на треугольнике, основные дейтсвия происходят в OnCollisionEnter2D:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    float speedRotation = 2f;
    float speed = 5f;
    int direction = 0;

    void Start()
    {

    }

    void Update()
    {
        gameObject.transform.Rotate(Vector3.forward * speedRotation * direction);

        if (speed > 0)
        {
            gameObject.transform.Translate(0f, speed * Time.deltaTime, 0f);
            speed -= 0.05f;
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        Vector2 inDirection = gameObject.transform.position;
        Vector2 inNormal = collision.contacts[0].normal;
        Vector2 newVelocity = Vector2.Reflect(inDirection, inNormal);
        gameObject.GetComponent<PolygonCollider2D>().enabled = false;
        float rot = 90 - Mathf.Atan2(newVelocity.x, newVelocity.y) * Mathf.Rad2Deg;
        gameObject.transform.eulerAngles = new Vector3(0, 0, rot);
        print("inDirection: " + inDirection + ", inNormal: " + inNormal + ", newVelocity: " + newVelocity);
    }

    public void Rotate(int direction)
    {
        this.direction = direction;
    }
}

К примеру если треугольник летит к плоскости под углом 30 градусов, то отраженный, в коде rot, = -84, при следующих значения векторов inDirection: (0.9, 9.1), inNormal: (0.0, -1.0), newVelocity: (0.9, -9.1)
StrongWheels
UNец
 
Сообщения: 2
Зарегистрирован: 03 фев 2019, 22:29

Re: Проблема с рикошетом от стенки

Сообщение 1max1 15 окт 2019, 23:52

А обязательно быть извращенцем и не использовать встроенную физику с настроенным физическим материалом?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Проблема с рикошетом от стенки

Сообщение getAlex 22 окт 2019, 01:12

1max1 писал(а):А обязательно быть извращенцем и не использовать встроенную физику с настроенным физическим материалом?

Для мультиплеера затратно использовать физику.

Синтаксис:
Используется csharp
Vector2D inDirection = GetComponent<RigidBody2D>().velocity;
Vector2D inNormal = collision.contacts[0].normal;
Vector2D newVelocity = Vector2D.Reflect(inDirection, inNormal);

//либо, если форвард у всех пуль в направлении полёта, то
Vector2D inDirection = gameObject.transform.forward;
 
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19