Как работает взаимодействие между твердым телом2d.movePosition и жестким телом2d.AddForce?

Я пытаюсь использовать код .AddForce вместе с кодом .movePosition, но .movePosition, заставляющий .AddForce, ничего не делать. Я думаю, это потому, что строка: «Vector2 motion = new Vector2 (moveHorizontal, 0);» но я действительно не знаю, как это исправить. Код .AddForce работает так, как задумано самим собой.

Изменить: опубликовал полный код.

using UnityEngine; using System.Collections;

открытый класс CompletePlayerController: MonoBehaviour {

public float speed;                //Floating point variable to store the player's movement speed.
public float jumpforce;
private Rigidbody2D rb2d;        //Store a reference to the Rigidbody2D component required to use 2D Physics.

// Use this for initialization
void Start()
{
    //Get and store a reference to the Rigidbody2D component so that we can access it.
    rb2d = GetComponent<Rigidbody2D> ();
}


//FixedUpdate is called at a fixed interval and is independent of frame rate. Put physics code here.
void FixedUpdate()
{
    Jump();

    //Store the current horizontal input in the float moveHorizontal.
    float moveHorizontal = Input.GetAxis ("Horizontal");

    //Store the current vertical input in the float moveVertical.

    //Use the two store floats to create a new Vector2 variable movement.
    Vector2 movement = new Vector2 (moveHorizontal, 0);

    //Call the AddForce function of our Rigidbody2D rb2d supplying movement multiplied by speed to move our player.
    rb2d.MovePosition ((Vector2)transform.position + (movement * speed * Time.deltaTime));

}
void Jump(){
    if (Input.GetButtonDown("Vertical")){
    rb2d.AddForce(new Vector2(0, jumpforce), ForceMode2D.Impulse);
    }
}

}


person Juan Franco Lagar    schedule 26.01.2020    source источник
comment
Вы даже не показываете здесь AddForce код. AddForce применит силу к объекту, а MovePosition будет перемещать объект с помощью интерполяции. Похоже, что MovePosition просто перезапишет приложенную силу   -  person Derek C.    schedule 27.01.2020
comment
Ах да, прости. Сейчас буду редактировать. Спасибо за ответ! Ответ полезен, спасибо!   -  person Juan Franco Lagar    schedule 27.01.2020


Ответы (1)


Как говорят названия:

MovePosition

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

AddForce

Добавляет силу Rigidbody

Сила задается как два отдельных компонента в направлениях X и Y (в 2D-физике нет направления Z). Объект будет ускоряться силой в соответствии с законом сила = масса x ускорение - чем больше масса, тем больше сила, необходимая для ускорения до заданной скорости.

Таким образом, в соответствии с массой и трением объекта он заставляет его двигаться с определенной скоростью согласно физике.


Смешение обоих не имеет особого смысла, поскольку MovePosition обычно используется для isKinematic твердых тел, поэтому те, которые полностью управляются через скрипт, в то время как AddForce влияет только на не isKinatic, таким образом полностью контролируемые только физикой; смешивая оба, вы не даете AddForce возможности работать, поскольку вы перезаписываете линейную скорость твердого тела с помощью MovePosition, который регулирует абсолютную скорость для Rigidbody, таким образом полностью отменяя AddForce.

rb2d.MovePosition (transform.position + (movement * speed * Time.deltaTime));

эта целевая позиция, к которой вы хотите, чтобы он переместился, всегда имеет то же Y, что и transform.position.y, поэтому вы в основном прибиваете свой объект к этой высоте.


Однако, если задуматься, все физические действия имеют одну общую черту: в конце концов, все они представляют собой разные способы скрытого применения определенной скорости к твердому телу.

Поэтому вместо того, чтобы позволить этим методам вычислять эту скорость, вы могли бы вместо этого напрямую изменить _14 _ себя, и тем самым позволить AddForce полностью контролировать Y скорость, в то время как вы управляете только X компонентом:

rb2d.velocity = new Vector2(movement * speed, rb2d.velocity.y);
person derHugo    schedule 27.01.2020