Как работает взаимодействие hardbody2d.movePosition и hardbody2d.AddForce? - PullRequest
1 голос
/ 27 января 2020

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

Редактировать: отправлять полный код.

using UnityEngine; using System.Collections;

publi c класс 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);
    }
}

}

1 Ответ

1 голос
/ 27 января 2020

Как следует из названия:

MovePosition

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

AddForce

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

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

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


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

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

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


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

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

rb2d.velocity = new Vector2(movement * speed, rb2d.velocity.y);
...