Ваш screenPos
по-прежнему находится в пиксельном пространстве экрана, поскольку вы не использовали вывод ScreenToWorldPoint
var screenPos = Input.mousePosition;
var worldPos = Camera.main.ScreenToWorldPoint(screenPos);
// It's redundant going through the gameObject here btw
var TropfenTouchDistance = Vector3.Distance(worldPos, transform.position);
if ( TropfenTouchDistance <= maxDistance)
{
TropfenDestruction();
}
В любом случае, обратите внимание, что ScreenToWorldPoint
* Для 1010 * также необходим компонент Z
Позиция на экране (часто мышь x, y), плюс позиция z для глубины (например, плоскость отсечения камеры) .
, указывающий, как далеко от заданной Camera
точка должна быть спроецирована в мир.
Чтобы преодолеть это, вы можете использовать математическое Plane
, чтобы вы могли получить точно спроецированную точку рядом с объектом, используя ScreenPointToRay
в Plane.Raycast
// In general store the camera reference as Camera.main is very expensive!
[SerializeField] private Camera _camera;
private void Update()
{
if(!_camera) _camera = Camera.main;
var plane = new Plane(Camera.main.transform.forward, transform.position);
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if(plane.Raycast(ray, out var hitDistance))
{
var worldPoint = ray.GetPoint(hitDistance);
var TropfenTouchDistance = Vector3.Distance(worldPos, transform.position);
if ( TropfenTouchDistance <= maxDistance)
{
TropfenDestruction();
}
}
}