Поскольку вы хотите, чтобы курсор перемещался только игроком и обновлялся относительно мирового пространства, а не пространства экрана, вам необходимо реализовать виртуальный курсор, существующий в мировом пространстве.
Сначала создайтеваш виртуальный курсор как GameObject
.На Update
вы можете обновить его положение с помощью
float sensitivity = 1f;
transform.position += sensitivity * new Vector2(
Input.GetAxis("Mouse X"),
Input.GetAxis("Mouse Y")
);
Then, instead of using the camera to find the cursor position, you just check the `transform.position` of that virtual cursor `GameObject`.
Во-вторых, вам нужно заблокировать встроенный курсор.Вы можете сделать это с помощью
Cursor.lockState = CursorLockMode.Locked;
Если вам нужно отменить это (например, если вы вызываете меню и вам нужно использовать обычный курсор без перемещения виртуального курсора вокруг), то вы можете использовать:
Cursor.lockState = CursorLockMode.None;
или, если вам нужно, чтобы курсор оставался в окне:
Cursor.lockState = CursorLockMode.Confined;
Если вы хотите переместить шар только в последнюю позицию, нажатую / коснуласьтогда вот более простое решение.
Отслеживайте позицию цели для мяча, и, если она была установлена:
private Vector2 moveGoalPos;
private bool moveGoalSet= false;
Измените moveGoalPos
только на кадрахтам, где щелкают мышью / касаются экрана. :
bool isTouched;
if (isMouseEnable) {
isTouched = Input.GetMouseButtonDown(0);
PixelPos = Input.mousePosition;
} else {
isTouched = Input.touchCount > 0;
Touch touch = Input.GetTouch(0);
PixelPos = touch.position;
}
if (isTouched) {
moveGoalPos= Camera.main.ScreenToWorldPoint(PixelPos);
moveGoalSet= true;
}
Однако на каждом кадре вы хотите перемещать мяч в мировое пространство moveGoalPos
(только если цельбыло установлено):
if (moveGoalSet) {
Vector2 OffsetPos = moveGoalPos + CursorOffSet;
GCursor.transform.position = OffsetPos;
print(OffsetPos);
Vector2 LerpPos = Vector2.Lerp(rb.transform.position, OffsetPos, 0.05f);
rb.MovePosition(LerpPos);
}
Когда вам нужно остановить перемещение шара в последнюю позицию касания / нажатия (например, если вы изменили или сбросили уровень), вам нужно сбросить moveGoalSet
:
moveGoalSet = false;