using UnityEngine;
using System.Runtime.InteropServices;
class Move : MonoBehaviour
{
[SerializeField] float speedMove;
bool isMove;
Camera _camera;
Transform _transform;
Vector3 world, delta;
void Start()
{
_camera = GetComponent<Camera>();
_transform = GetComponent<Transform>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
var mp = Input.mousePosition;
Ray ray = _camera.ScreenPointToRay(mp);
if (Physics.Raycast(ray, out RaycastHit hit))
{
Tools.GetCursorPos(out Point cp);
delta.x = cp.x - mp.x;
delta.y = cp.y - mp.y;
world = hit.point;
isMove = true;
}
}
if (isMove)
{
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
Vector3 move = new Vector3(x, 0.0f, y);
Vector3 spPrev = _camera.WorldToScreenPoint(world);
_transform.Translate(-move * speedMove, Space.World);
Vector3 spNext = _camera.WorldToScreenPoint(world);
delta.y += (spPrev.y - spNext.y) * 2.0f;
spNext += delta;
Tools.SetCursorPos((int)spNext.x, (int)spNext.y);
}
if (Input.GetMouseButtonUp(0))
{
isMove = false;
}
}
}
struct Point
{
public int x;
public int y;
}
static class Tools
{
[DllImport("user32.dll")]
public static extern bool SetCursorPos(int x, int y);
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out Point point);
}