How to properly convert mouse pos to world pos

I want to drag rigidbodies on the screen with the mouse. Before ranting about how this question has been answered a bunch of times, I have a question pertaining to the nature of Camera.ScreenToWorldPoint(). When I use it to convert Input.mousePosition, it gives me the x,y, and z position of the camera, not exactly the mouse. How can I get the mouse’s world position and lock the z coordinate at a specific value?

I have had great success with this script, which puts both ScreenToWorldPoint and WorldToScreenPoint to use.

using UnityEngine;
using System.Collections;
public class DragAndDrop : MonoBehaviour {
	private Vector3 screenPoint, offset;
	
	void OnMouseDown() { //Select object
		screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,
        	Input.mousePosition.y, screenPoint.z));
	}
	void OnMouseDrag() {
		Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset - new Vector3(0,0, - 0.8561556f);
        transform.parent.position = curPosition;
	}
}

The Script was found elsewhere on answers.unity, but I’m afraid I can’t remember where.

You should be able to analyze and synthesize the code you need from this, as this script uses the distance to the screen as a lock for the z dimension.

This doesn’t really explain the nature of ScreenToWorldPoint. I suspect it to be the result of the camera being a point in 3D space, with a viewplane, which we percieve to be the screen. These will of course have 3D coords and direction, even the viewplane. I find it makes sense that you’d get both x, y, and z.