Как переместить RigidBody2D в позицию, все еще проверяя на столкновение - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я создаю игру в Unity, в которой вы перемещаете шар, используя OnMouseDrag(), CircleCollider2D и RigidBody2D. Вот как я устанавливаю положение мяча:

 private void OnMouseDrag()
 {
     Vector2 mouseInWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
     playerRb.position = new Vector3(mouseInWorld.x, mouseInWorld.y, 0);
 }

Я все еще хочу, чтобы шар скользил при столкновении, пока мышь двигается вокруг. Есть ли способ сделать это?

Я пробовал RigidBody2D.MovePosition(), но мяч перескочил из одной точки в другую, и Raycast с, но не смог заставить это работать.

РЕДАКТИРОВАТЬ: Это то, что я получил сейчас:

playerRb.velocity = new Vector3(mouseInWorld.x - playerRb.position.x, mouseInWorld.y - playerRb.position.y, 0);

Теперь проблема в том, что мяч отстает от мышки.

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Когда вы используете RigidBody.MovePosition, вы не вызываете физический движок, поэтому он игнорирует столкновения. Если вы хотите, чтобы коллизии происходили, вам нужно вместо этого использовать RigidBody.Velocity.

Для внесения этого изменения вам потребуется внести некоторые изменения в код, потому что то, что вы даете RigidBody.Velocity - это скорость, а не позиция поэтому вам нужно рассчитать скорость, необходимую в x, y (и z, если вы находитесь в 3d), чтобы добраться до пункта назначения.

Я предлагаю вам прочитать страницу Unity о скорости для получения дополнительной информации https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html

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

Примечание. Это приведет к столкновению игрока / мяча.

Изменение скорости может привести к неожиданному отскоку мяча при столкновении мяча со стеной. Я бы использовал CircleCast для этого, проверил, попал ли он в что-нибудь, а затем использовал MovePosition соответственно:

float cursorDepth;
Rigidbody2D playerRb;
CircleCollider cc;

void Awake()
{
   playerRb = GetComponent<Rigidbody2D>();
   cc = GetComponent<CircleCollider>();
}

private void OnMouseDrag()
{
    Vector2 mouseInWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);

    Vector2 posToMouse = mouseInWorld - playerRb.position;

    RaycastHit2D hit = Physics2D.CircleCast(playerRb.position, 
            cc.radius * transform.lossyScale.x, posToMouse, posToMouse.magnitude); 

    if (hit.collider != null)
    {
        mouseInWorld = hit.centroid;
    }

    playerRb.MovePosition(mouseInWorld);
}

Но обратите внимание, что если мяч не может двигаться полностью до мыши, он может привести к прекращению перетаскивания. Итак, планируйте соответственно.

...