смотри:
физика в Untiy считается в FixedUpdate. с интервалом, указанным в PlayerSettings. по умолчанию каждые 0.02 секунд. (или 50 раз в секунду)
Update происходит с непредсказуемым интервалом (если у тебя изначально не стоит лок на fps).
если ты в каждом кадре будешь изменять позицию объекта, действия которого завязаны на физическом движке, у тебя не будут совпадать координаты коллайдеров и коллизии не будут засчитываться.
чтобы лучше понять о чем идет речь, попробуй вот эту функцию:
public class ExampleClass : MonoBehaviour
{
void FixedUpdate()
{
if (Input.GetKeyDown("space"))
{
Debug.Log("space key was pressed");
}
}
}
и оцени, как часто будешь попадать в нужный момент своими руками в пробел, чтобы движок задетектил нажатие в нужном для тебя кадре.
ровно таким же образом, у тебя физика работает некорректно. т.к. ты слишком часто или слишком редко изменяешь координаты твоего физического объекта.
отсюда вытекает два решения:
1) либо изменяй положение gameObject только в момент обработки физики (в FixedUpdate)
2) либо работай с физическим объектом, как с физическим объектом (через Rigidbody)
подсказка: корректнее будет идти по второму пути