Я могу только предположить, что у вас есть много объектов, запускающих этот скрипт, что и является причиной ваших проблем. Чтобы убедиться в этом, попробуйте уменьшить количество объектов, имеющих компонент TouchDragDrop , до 1 или 2 объектов. Вы, вероятно, заметите, что игра больше не замедляется.
Каждый раз, когда вы касаетесь экрана, все объекты с прикрепленным скриптом TouchDragDrop.cs читают ввод, а затем выполняют свою логику moveTouch. c. Если у вас есть 50 объектов с TouchDragDrop.cs , вы выполните Physics2D.OverlapPoint 50 раз. Это то, что может убить вашу производительность.
Physics2D.OverlapPoint следует вызывать только один раз. Если многие объекты должны реагировать на ваше прикосновение, рассмотрите возможность перемещения ввода и касания logi c к одному объекту gameObject, который отвечает только за чтение ввода и возврат того, какой коллайдер попал. Затем перенесите свою «логику движения c» в другой скрипт (возможно, он называется Draggable.cs ). Вместо того, чтобы сравнивать каждый GameObject, вы можете сделать следующее из этого единственного входного скрипта:
touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
Collider2D touchedCollider = Physics2D.OverlapPoint(touchPosition)
Draggable dragObj = touchedCollider?.GetComponent<Draggable>();
dragObj?.MoveTouch(touchPosition);
Обновление
Поскольку проблема не связана с количеством объектов GameObject в настоящее время, скорее всего, это связано с конфликтом между циклом Fixed и циклом Frame. Я написал довольно длинное объяснение различий между 2 , но вкратце я считаю, что это может быть вашей проблемой:
Когда вы читаете входные данные каждый кадр во время движения, положение коллайдера вашего физического объекта не обновляется немедленно. Обновляется только в фиксированном цикле, что означает, что у вашего входа есть небольшой шанс выйти за пределы коллайдера.
Вот новое решение:
Вместо подтверждения того, что вы касаетесь объекта в каждом кадре, давайте предположим, что вам нужно проверять позицию касания только один раз (во время Touc hPhase.Began). Я рекомендую что-то вроде этого:
void BeginTouchMove()
{
if(myCollider2D == Physics2D.OverlapPoint(touchPosition))
{
isMoving = true;
}
}
Тогда вы можете оставить свой MoveTouch () logi c таким же, как у вас выше, только с проверкой (isMoving).