Как сделать притяжение игрока к стене (Composite collider)?
Я делаю 2D игру, в которой персонаж выполнен в виде треугольника. Он "летает" по сцене с помощью выстрелов. Идея в том что когда он "подлетает" к стенке, можно нажать на кнопку, притянуться и зафиксироваться на стенке или любом другом препятствии. Сама карта сделана с помощью CompositeCollider2d, а персонаж имеет OverlapCircle для распознавания столкновений.
isTouchingObstacle = Physics2D.OverlapCircle(obstacleCheck.position, checkRadius, whatIsObstacle);
Проблема в том, что я не могу понять какой алгоритм надо использовать. Я пытался решить этот вопрос так:
- Добавил к каждой стенке
AreaEffector2Dи при столкновении изменял значение с 0 до 10, но это крайне неудобно, так как уровне много, а код один. В каждом уровне разное количество стенок, следовательно иAreaEffetor2D
forceArea1.forceMagnitude = 10f;
forceArea2.forceMagnitude = 10f;
forceArea3.forceMagnitude = 10f;
- Я использовал функцию
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 и к вертикально оси, чтобы скомпенсировать притяжение игрока...
