Вы можете использовать лучи и плоскости, чтобы вычислить это.
Перед перемещением объекта создайте Ray
от камеры до точки на объекте, которую необходимо удерживать в том же положении:
// Where the "feet" are relative to the object's origin
public Vector3 cameraKeepOffset = new Vector3(0f,-1f,0f);
public Ray perspectiveRay;
...
Vector3 positionToKeep = transform.position + cameraKeepOffset;
Vector3 cameraPosition = Camera.main.transform.position;
perspectiveRay = new Ray(cameraPosition, positionToKeep - cameraPosition);
Идея состоит в том, что всякий раз, когда объект движется, найдите, где вдоль этого луча он может быть размещен. Если мы поместим горизонтальную плоскость в положение y, где луч пересекает эту плоскость, где должен быть расположен объект.
Итак, когда объект перемещается, создайте Plane
там, где смещение, найдите, где perspectiveRay
пересекает его, затем переместите объект так, чтобы его смещение было в этой точке:
Plane yPlane = new Plane(Vector3.up, cameraKeepOffset + transform.position);
float distanceFromCam;
if ( !Raycast(perspectiveRay, out distanceFromCam)) {
Debug.log("Camera is not pointing at plane");
// Handle bugs here, return if necessary, etc.
} else {
Vector3 intersectionPoint = Ray.GetPoint(distanceFromCam);
transform.position = intersectionPoint - cameraKeepOffset;
}