以下のコードで可能です。(移動量が微妙にずれるので多分どこか間違っています。)
Camera MainCam;
void Start(){
MainCam = GetComponent<Camera>();
}
void Update(){
if(MainCam == null)
return;
if (Input.GetMouseButton(2))//マウスミドルボタンが押されたとき
{
//(1)マウス移動量を取得 ※1
float moveX = Input.GetAxis(“Mouse X”);
float moveY = Input.GetAxis(“Mouse Y”);
//(2)moveX, moveYをゲーム画面に対して0-2に正規化※2
moveX *= (Screen.currentResolution.width / Screen.width * 2f * 0.01f);
moveY *= (Screen.currentResolution.height / Screen.height * 2f * 0.01f);
//(3)projection逆変換 ※3
moveX /= MainCam.projectionMatrix.m00;
moveY /= MainCam.projectionMatrix.m11;
//(4)view逆変換
var mv = MainCam.cameraToWorldMatrix.MultiplyVector(new Vector4(moveX, moveY, 0));
//(5)カメラを移動
MainCam.transform.localPosition -= mv;// new Vector3(moveX, moveY, 0.0f);
///※1 Input. GetAxisで取得される値はモニターの解像度に対する変位を%として取得しているみたい。
///※2(ゲーム画面のスクリーン座標は-1から1で表される)
///※3 projection行列は多分対角行列だから逆変換はこれで良いと思う。
}
}
通常、スクリーン座標系からワールド座標系へ変換するには
スクリーン座標(-1から1で正規化されてる) –Projection Matrixの逆行列で変換-> ビュー座標 –View Matrixの逆行列で変換 –> ワールド座標
を行います。UnityではInput.GetAxisで取得されるマウス変位がモニター全体に対して%で取得されるために(2)で実際のゲーム画面に対しての移動量を取得しています。