2017-11-09 12 views
1

編集:3Dではなく、2Dの実装には答えが必要です。だから私のプロジェクトでは「前に尋ねられた質問」はうまくいかない。Unity 2Dマウスズームしますが、マウスポイントの位置をズームインします

編集:以下の受け入れられた回答を使用してください、これは私の作業スクリプトです。 Vector3の0.1Fの部分がうまくいくのは難しいので、ややこしいですが、うまくいきます。しかし、Time.deltaTimeはうまくいかなかった。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CameraZoom : MonoBehaviour 
{ 

private float zoom = 10; 
Vector3 newPosition; 

void Update() 
{ 
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9) 
    { 
     zoom -= 1; 
     Camera.main.orthographicSize = zoom; 
     newPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
     transform.position = Vector3.Lerp(transform.position, newPosition, 0.1F); 
    } 

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101) 
    { 
     zoom += 1; 
     Camera.main.orthographicSize = zoom; 
    } 

} 

} 

元の質問:私はとズームアウトのための基本的なスクリプトを持っていますが、私はマウスホイールでピンを見るにはズームインしたときに、私はマウスカーソルの位置にズームインします。 Paradox Games(EU4など)では、画面の左にある国にマウスを置いてズームインしてズームインすると、ズームインしてズームインして中央になります。

これまでの私の基本的なスクリプトは、私のカメラに取り付けられています。カメラは、ただ直線でズームイン/ズームアウトします。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CameraZoom : MonoBehaviour { 

public float zoom = 10F; 

void Update() { 
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9) 
    { 
     zoom -= 1; 
    } 

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101) 
    { 
     zoom += 1; 
    } 

    GetComponent<Camera>().orthographicSize = zoom; 

    } 
} 
+0

「前に質問しました」という回答の問題は、それが3D実装用で、2Dが必要だということです。カメラの位置を変えることで動作しますが、私は2Dのために「正射影」で何かをする必要があると思います。 – Farflame

+0

重複としてマークしませんでしたが、重複もうまく機能するはずです – Programmer

+0

それはありません。実際、複写はカメラ変換を動かすので何もしません。私は2Dで何もしないと信じています。 2D版では、カメラの正投影サイズを変更する必要があります。私の解決策は大丈夫ですが、完璧ではありません。人々が同じ解決策を探すためにここに来ると仮定して、複製がまったく機能しないので正解とマークしてはいけません。 – Farflame

答えて

3

私はこれを試していませんが、これがうまくいくと思います。

Vector3 newPosition; 
bool canZoom; 
bool isMoving; 

void Update() 
{ 
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9) 
    { 
     zoom -= 1; 
     canZoom = true; 
    } 

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101) 
    { 
     zoom += 1; 
     canZoom = true; 
    } 

    if (canZoom) 
    { 
     isMoving = true; 
     Camera.main.orthographicSize = zoom; 
     newPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition); 
    } 
    if (isMoving) 
    { 
     transform.position = Vector3.Lerp (transform.position, newPosition, Time.deltaTime); 
    } 

    if(transform.position == newPosition) 
    { 
     isMoving = false; 
    } 

} 

注:カメラが特定のカメラの高さを維持するようにするには、移動する前にnewPosisionのy値を調整します。

これが役に立ちます。

+0

数学は正しいと思われ、動作しているように見えますが、唯一の問題はスクロールを開始すると永久にスクロールして制御が難しいことです。私はそれを修正しようとしているが、私は基本的な考えが正しいと思う。 – Farflame

+0

これはあなたを軌道に乗せるためのものです。答えを受け入れてください。幸運 –

2

ワールド空間の違いを計算し、ズームしながらその方向に移動します。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class CameraZoom : MonoBehaviour { 

public float zoom = 10F; 

void Update() { 
    if (Input.GetAxis("Mouse ScrollWheel") > 0 && zoom > 9) 
    { 
     zoom -= 1; 
    } 

    if (Input.GetAxis("Mouse ScrollWheel") < 0 && zoom < 101) 
    { 
     zoom += 1; 
    } 

    Camera cam = GetComponent<Camera>(); 
    RaycastHit hit; 
    Ray ray = cam.ScreenPointToRay(Input.mousePosition); 
    Vector3 targetPos; 

    if (Physics.Raycast(ray , out hit)) 
    { 
     targetPos = hit.point; 
    } 

カメラcam = GetComponent();

cam.orthographicSize = zoom; 
    cam.transform.position += (targetPos - transform.position)/5f; 

    } 
} 
+0

私はユニティに新しい、いくつかのエラーを取得します。 Camera Camの2回目の使用既に宣言されているように取り除くだけでいいと思います。しかし、私は 'targetPos'の最後の行にエラーが発生しています。これは、 '割り当てられていないローカル変数targetPosの使用'です。私はそれがちょうど上に割り当てられているので、それが割り当てられていない方法を取得しません.... – Farflame

+0

正解、私は答えを更新しました。 "targetPos"は、レイキャストがヒットしない場合は必ず割り当てられません。最後の行をifブロックの内側に置くことができます。 しかし、あなたが何かを打っていないことを確認するために、デバッグしてください。 レイキャストを動作させるには、マウスがオブジェクトをホールドする必要があります。あなたは地形か何かを持っていますか? – KYL3R

関連する問題