Как поставить шарик по кругу, всегда отскакивая от направления векторов поверхности в Unity? - PullRequest
0 голосов
/ 18 октября 2019

enter image description here

или

Альтернативная ссылка для картинки

Это моя проблема, у меня естьшар внутри круга, все они находятся во 2-м мире, и я хочу, чтобы мой шар отскакивал от каждого времени в соответствии с нормальной поверхностью. Как я могу это сделать?

Я разработал его так, что у меня есть 2 сценария, один из которых прикреплен к красному шару и имеет имя BallScript, а другой - для кнопки отказов, называемой сценарием отказов.

BallScript.cs подобен приведенному ниже ответу:

private ContactPoint contact;
public static Vector3 temp;

private void FixedUpdate()
{
  temp = Vector3.Reflect(circle.GetComponent<Rigidbody2D>().velocity, contact.normal);
}

private void OnCollisionEnter2D(Collision collision)
{
    contact = collision.contacts[0];
}

и Bounce.cs для кнопки отказов похожи на это:

ball.velocity = new Vector3(0, 5.5f, 0) + BallScript.temp;

С этими обновлениями в качестве ответов ниже, яподобрался близко, но иногда круг отскакивает к правому нормальному вектору вектора (например, если вы находитесь в правом нижнем углу большого круга, шар должен отскочить влево, если шар находится внутри нижней левой стороны круга, он должен отскочитьвправо) но иногда он подпрыгивает в неправильном направлении. Подумайте, что иногда он подпрыгивает, а иногда - в зеркальном отображении.

До сих пор я пробовал много вещей, но пока я не хотел найти путь к своему желанию, я имитировал действие, как показано ниже, с помощью скрипта отказов;

        if (circle.transform.position.x < 0)
        {
            ball.velocity = new Vector3(3f, 5f, 0);
        }
        if (circle.transform.position.x > 0)
        {
            ball.velocity = new Vector3(-3f, 5f, 0);
        }

1 Ответ

1 голос
/ 18 октября 2019
Rigidbody2D rb;<br>
private void Start(){
   this.rb = circle.GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
//Don't do it here.......
}

private void OnCollisionEnter2D(Collision collision)
{
   Vector3 directionToGo = Vector3.Reflect(this.rb.velocity, collision.contacts[0].normal);
}

ball.rigidbody.velocity => Скорость шара, находящегося внутри круга. collision.contacts [0] .normal => Коллайдер объекта, который возвращается при столкновении с мячом.

Возвращает вектор отражения после столкновения.

...