Как сделать притяжение игрока к стене (Composite collider)?

Я делаю 2D игру, в которой персонаж выполнен в виде треугольника. Он "летает" по сцене с помощью выстрелов. Идея в том что когда он "подлетает" к стенке, можно нажать на кнопку, притянуться и зафиксироваться на стенке или любом другом препятствии. Сама карта сделана с помощью CompositeCollider2d, а персонаж имеет OverlapCircle для распознавания столкновений.

Принтскрин сцены

isTouchingObstacle = Physics2D.OverlapCircle(obstacleCheck.position, checkRadius, whatIsObstacle);

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

  1. Добавил к каждой стенке AreaEffector2D и при столкновении изменял значение с 0 до 10, но это крайне неудобно, так как уровне много, а код один. В каждом уровне разное количество стенок, следовательно и AreaEffetor2D
forceArea1.forceMagnitude = 10f;
forceArea2.forceMagnitude = 10f;
forceArea3.forceMagnitude = 10f;
  1. Я использовал функцию Lerp дабы плавно изменять положение игрока. Для этого я считывал угол поворота игрока и определял куда нужно его притянуть, но это создает баги. Ведь если игрок смотрит вправо, то он не обязательно должен притянуться влево
if (obstacleCheck.rotation.eulerAngles.z < 45f || obstacleCheck.rotation.eulerAngles.z > 325f){
   transform.position = Vector2.Lerp(this.transform.position, new Vector2(transform.position.x, transform.position.y - .2f), 1f);
   transform.rotation = Quaternion.Euler(0, 0, 0);
}
else if (obstacleCheck.rotation.eulerAngles.z > 45f && obstacleCheck.rotation.eulerAngles.z < 135f){
   transform.position = Vector2.Lerp(this.transform.position, new Vector2(transform.position.x + .2f, transform.position.y), 1f);
}
else if(obstacleCheck.rotation.eulerAngles.z > 135f && obstacleCheck.rotation.eulerAngles.z < 225f){
   transform.position = Vector2.Lerp(this.transform.position, new Vector2(transform.position.x, transform.position.y + .2f), 1f);
}
else if(obstacleCheck.rotation.eulerAngles.z > 225f && obstacleCheck.rotation.eulerAngles.z < 325f){
   transform.position = Vector2.Lerp(this.transform.position, new Vector2(transform.position.x - .2f, transform.position.y), 1f);
}

Ответы (1 шт):

Автор решения: Михаил

Попробуйте добавить по горизонтальной оси AddForce к Rigidbody2D вашего персонажа. Пример использования можно посмотреть тут.

Если в вашей игре есть гравитация, то можно добавить AddForce и к вертикально оси, чтобы скомпенсировать притяжение игрока...

→ Ссылка