Проблема, с которой вы столкнулись, скорее всего связана с тем, как вы обрабатываете коэффициенты трения в методе `OnCollisionStay`. Как только ваш объект касается поверхности, у вас происходит проверка угла относительно нормали коллизии. При этом, если угол меньше 45 градусов, вы устанавливаете трение в 1 (для настройки пола), даже если объект фактически касается стены.
Когда ваш объект находится в углу, нормали из коллизий могут быть не только вертикальными (как в случае с полом), но и наклонными, что может привести к неправильной оценке и установке коэффициента трения.
Для решения этой проблемы, вам нужно дополнительно учитывать, действительно ли контактируется с полом или со стеной. Вы можете сделать следующее:
1. Проверьте имя или тег объекта, с которым вы сталкиваетесь, чтобы убедиться, что это именно пол или стена.
2. Измените логику обработки в зависимости от нормали коллизии.
Вот модифицированный пример кода:
```csharp
private void OnCollisionStay(Collision collision)
{
// Получаем нормаль контакта
Vector3 contactNormal = collision.contacts[0].normal;
// Проверяем, является ли материал "полом" или "стеной"
if (collision.gameObject.CompareTag("Floor"))
{
float angle = Vector3.Angle(contactNormal, Vector3.up);
// Устанавливаем трение только для пола
if (angle < 45f)
{
playerCapsuleCollider.material.dynamicFriction = 1f; // Пол
}
else
{
playerCapsuleCollider.material.dynamicFriction = 0; // Не пол, например стена
}
}
else if (collision.gameObject.CompareTag("Wall"))
{
// Если это стена, мы устанавливаем трение в 0
playerCapsuleCollider.material.dynamicFriction = 0;
}
}
```
В этом коде предполагается, что ваши объекты пола и стен имеют теги "Floor" и "Wall". Вы можете изменить логику проверки в зависимости от ваших специфических условий и структуры проекта.
Кроме того, помните, что трение может также влиять на разные части капсулы. Убедитесь, что это не вызывает неожиданных результатов в других частях физического взаимодействия.