Мяч замедляется в игре unity2D

У меня есть игра типа блокировщика, написанная с использованием C #, которая в основном работает нормально, но после игрового тестирования я обнаружил, что мяч будет замедляться в определенных ситуациях! то есть, если он вклинивается между кирпичами игрового объекта, сила мяча быстро замедляется! В 8 случаях из десяти этого не произойдет, но в других случаях это произойдет, и я не знаю, почему! я опубликую сценарий мяча, я думаю, вам нужно будет помочь решить эту проблему, но если вам нужна дополнительная информация, пожалуйста, спросите.

public class Ball : MonoBehaviour {

private Paddle paddle;

private bool hasStarted = false;

private Vector3 paddleToBallVector;

void Start () {
    paddle = GameObject.FindObjectOfType<Paddle> ();
    paddleToBallVector = this.transform.position - paddle.transform.position;
}

// Update is called once per frame
void Update () {
    if (!hasStarted) {
        //lock ball relative to the paddle
        this.transform.position = paddle.transform.position + paddleToBallVector;
        //wait for mouse press to start

        if (Input.GetMouseButtonDown (0)) {
        //if (Input.GetTouch(0).phase == TouchPhase.Ended){
        hasStarted = true;
            this.GetComponent<Rigidbody2D> ().velocity = new Vector2 (2f, 10f);
        }
    }
}

void OnCollisionEnter2D(Collision2D collision){

    Vector2 tweak = new Vector2 (Random.Range(0f,0.2f),Random.Range(0f,0.2f));

    if (hasStarted) {
        GetComponent<AudioSource> ().Play ();
        GetComponent<Rigidbody2D>().velocity += tweak;
    }
}

}


person David Marsh    schedule 17.08.2017    source источник


Ответы (1)


Вы добавляете непосредственно к скорости мяча. Переменная скорости определяет направление и скорость, а не только скорость, как вы здесь думаете.

Итак, когда мяч сталкивается с блоком, его скорость равна (+x, +y). После столкновения и отскока он имеет скорость (+x, -y). Таким образом, добавление случайного положительного значения к скорости, когда она имеет скорость -y, означает, что мяч будет замедляться.

Это не происходит каждый раз, потому что вы перемещаете мяч в своем методе Update(). Измените это на «FixedUpdated()». Fixed Update обрабатывает все физические расчеты.

Кроме того, я бы рекомендовал иметь RigidBody2D для вашего объекта Ball. Движущиеся физические объекты всегда должны иметь RigidBodies. При этом вы можете использовать AddForce в прямом направлении вашего мяча и это должно решить вашу проблему.

РЕДАКТИРОВАТЬ: я вижу, у вас уже есть RigidBody2D. Я пропустил это в первый раз. Вместо GetComponent<RigidBody2D>().velocity попробуйте GetComponent<RigidBody2D>().AddForce( transform.forward * impulseAmount, ForceMode.Impluse );

person CMilby    schedule 17.08.2017
comment
Спасибо за ваш ответ, строка 28 о жестком теле при использовании adforce компилирует ошибку. Левая часть присваивания должна быть переменной, свойством или индексатором, а строка 40 для GetCompont.rigidbody также дает ошибку при использовании Addforce Невозможно назначить AddForce' because it is a группа методов - person David Marsh; 17.08.2017
comment
Ах да, AddForce — это метод. Смотрите мое редактирование, и я добавил немного больше кода. Надеюсь, это поможет. Кроме того, вам нужно убедиться, что ваш объект всегда движется вперед в том же направлении, в котором он движется. - person CMilby; 17.08.2017
comment
похоже, он не хочет работать для меня, вызывая ошибку не существует в текущем контексте - person David Marsh; 18.08.2017