OnCollision с движущейся платформой, установленной как родительская, но все еще может перемещаться - PullRequest
0 голосов
/ 03 августа 2020

На моем 2D-платформере у меня есть платформы, которые перемещаются вверх и вниз:

 void FixedUpdate() {
    float speed = (UnityEngine.Random.Range(1f, _speedMax));
    float t = Mathf.PingPong(Time.time, speed) / speed;

    transform.position = Vector2.Lerp(_start, _end, t);
}

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

private void OnCollisionEnter2D(Collision2D collision) {
    if(collision.gameObject.tag == "Player")
        collision.collider.transform.SetParent(transform);
}

При прыжке я сбрасываю родительский элемент на null:

if (jumpState == JumpState.Grounded && Input.GetButtonDown("Jump")) {
     transform.SetParent(null);
     jumpState = JumpState.PrepareToJump;
}

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

Движение игрока выполняется с помощью Rigidbody2D (полный код находится в этом руководстве, я не менял что угодно: https://learn.unity.com/tutorial/live-session-2d-platformer-character-controller):

move.x = Input.GetAxis("Horizontal");
var distance = move.magnitude;
[...]
rigidbody.position = rigidbody.position + move.normalized * distance;

Можно ли по-прежнему перемещаться внутри родительского элемента или у меня есть другие возможности, кроме установки движущейся платформы в качестве родительского элемента?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Подумав об этом, я могу предложить вам использовать Rigidbody.MovePosition ():

Rigidbody.MovePosition(transform.position + (move.normalized * distance));

Как указано в документации: Rigidbody.MovePosition

Rigidbody.MovePosition перемещает Rigidbody в соответствии с настройками интерполяции. Когда интерполяция Rigidbody включена, Rigidbody.MovePosition создает плавный переход между кадрами. Unity перемещает Rigidbody при каждом вызове FixedUpdate. Позиция происходит в локальном пространстве. При телепортации Rigidbody из одной позиции в другую вместо MovePosition используется Rigidbody.position.

Я не могу попробовать сейчас, дайте мне знать, если это поможет!

0 голосов
/ 03 августа 2020

Вместо установки платформы в качестве родительской можно изменить transform.position игроков при перемещении платформы:

player.tramsform.position + = platformPreviosPosition - platform.transform.position;

platformPreviosPosition будет положением платформы в предварительном кадре.

Но разве нет где-нибудь в сценарии движения bool, который отключает движение, если вы находитесь на платформе, о котором вы забыли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...