На моем 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;
Можно ли по-прежнему перемещаться внутри родительского элемента или у меня есть другие возможности, кроме установки движущейся платформы в качестве родительского элемента?