Как добавить силу в случайном направлении к игровому объекту Hardbody2D - PullRequest
0 голосов
/ 13 сентября 2018

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

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 голосов
/ 13 сентября 2018

Ваш код, как написано, как только он заработает, будет бесконечно ускорять жесткое тело. Вы хотите ограничить скорость на максимальной скорости: 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>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...