Как добавить силу в случайном направлении к игровому объекту твердого тела

Как я могу добавить силу к игровому объекту жесткого тела2D и поддерживать его движение с фиксированной скоростью? К игровому объекту также прикреплен отскок.

private Rigidbody2D rb2D;
private float thrust = 10.0f;

void Start() {
}


void FixedUpdate() {
        rb2D.AddForce(new Vector2(0, 1) * thrust);
    }

Это то, что я получил с веб-сайта документации Unity, но, похоже, это ничего не дает.

Вот код, с которым я закончил, и он, похоже, работает правильно. Направление и скорость Vector2 можно регулировать в зависимости от массы / силы тяжести.

float topSpeed = 15;
private Rigidbody2D rb2D;
private float thrust = 0.1f;
void Start()
{
    rb2D = gameObject.GetComponent<Rigidbody2D>();
    rb2D.AddForce(new Vector2(0, 1) * thrust);
}


void Update()
{
    if (rb2D.velocity.magnitude > topSpeed || rb2D.velocity.magnitude < topSpeed)
        rb2D.velocity = rb2D.velocity.normalized * topSpeed;
}
1
0
563
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код в том виде, в котором он написан, как только он заработает, будет бесконечно ускорять твердое тело. Вы хотите ограничить скорость на максимальной скорости: http://answers.unity.com/answers/330805/view.html

 rigidbody.AddForce(new Vector2(0, 1) * thrust * Time.deltaTime);

 if (rigidbody.velocity.magnitude > topSpeed)
     rigidbody.velocity = rigidbody.velocity.normalized * topSpeed;

Если вы хотите, чтобы он немедленно установил фиксированное значение скорости, вы можете просто установить скорость для каждого кадра:

https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html

void FixedUpdate()
{
    if (Input.GetButtonDown("Jump"))
    {
        // the cube is going to move upwards in 10 units per second
        rb2D.velocity = new Vector3(0, 10, 0);
        moving = true;
        Debug.Log("jump");
    }

    if (moving)
    {
        // when the cube has moved over 1 second report it's position
        t = t + Time.deltaTime;
        if (t > 1.0f)
        {
            Debug.Log(gameObject.transform.position.y + " : " + t);
            t = 0.0f;
        }
    }
}

Ваш код не показывает этого, поэтому, если вы еще этого не делаете, вы захотите убедиться, что rb2D действительно установлен на Rigidbody2d на объекте, которым вы хотите манипулировать. Например. выполнив в стартовом методе:

void Start()
{
    rb2D = gameObject.GetComponent<Rigidbody2D>();
}

Другие вопросы по теме