ズーム機能はユニティでズームを実現する方法について話す今日、ゲーム開発能力で使用されています。
IEndDragHandler 3ユニティインタフェースはドラッグ開始、ドラッグに対応する、共通インタフェースである1.IDragHandler、IBeginDragHandlerは、あなたが端をドラッグすることができる(これらの3つのインターフェイスは、衝突を追加することなくUGUI(のみを使用することができることに留意すべきです)、スプライト(スプライト缶れるonmousedown、onMouseDrag、onMouseUpの))を使用し、オブジェクトは、サブエレメント以下のカヴァにする必要がドラッグすることはできません。
簡単なドラッグ&ドロップを見て、最初の終わりをドラッグするだけの簡単な判断を始めるドラッグクリックの単一のポイントではない、記録場所のクリック、マーカー状態が真でドラッグします。終了状態flase内のドラッグマークをドラッグします。
公共 ボイドOnBeginDrag(PointerEventData EVENTDATA) { 場合(Input.touchCount <= 1 ) { isDrag = 真。 LASTPOINT = Input.mousePosition。 } } 公共 ボイドOnEndDrag(PointerEventData EVENTDATA) { isDrag = 偽。 }
この方法では、ドラッグで参照するためのキー:このメソッドは、常にあなたのプレスの過程で実行され、基本的に各行がコメントを持って、あなたは良いが理解している必要があり
公共 のボイドondrag(PointerEventData eventDataA) { IF(isDrag && Input.touchCount <= 1。 ) { // 現在のマウスの位置を記録 にCurrentPoint = Input.mousePosition; // レコードの距離を移動-数我々はカメラ理由を移動したいので、オブジェクトの移動の表示 // 彼らは移動する物体を追加することができない場合-原理は同じである、移動物体が直接再構成を引き起こす可能性があり、特に(例えば、それはどうなるマップのような)多数のオブジェクトのは、パフォーマンスになります巨大な消費 MOVEDIR = - (CurrentPointの- LASTPOINT); // 正規z軸方向 MOVEDIR = 新しい新規のVector3(moveDir.x、moveDir.y、0 ); // 0の移動距離ならば、いかなるドラッグは、直接返さないこと IF(MOVEDIR ==Vector3.zero) { リターン; } // このセクションでは、参照することができるhttps://www.jianshu.com/p/148725feecfa // 主画面に対して行われるスケーリングと一致移動距離のカメラの移動距離が変化しない フロートを =アスペクトeyeCamera.aspect; フロート halfFOVTan Mathf.Tan =((eyeCamera.fieldOfView * 0.5F)* Mathf.Deg2Rad); フロートハイト= Mathf.Abs(eyeCamera.transform.position.z)halfFOVTan * 2 ; // 参照画像(計算透視カメラビューポートの幅と高さの概略) フロート幅ハイト* = アスペクト; //は、カメラの必要な移動距離を算出している実際 moveDir.x = moveDir.x / screen.width *幅; moveDir.y = moveDir.y / screen.height * ハイト; // カメラの移動距離:あなたはもっとゆっくり移動した後に縮小するつながる単語を追加しない場合、我々は、言っているスケーリング係数以下MOVEDIRの背中に乗ります高速増幅比較後にその移動 eyeCamera.transform.Translate(MOVEDIR *スケール/ 6.6f ); IF(= LASTPOINT!CurrentPointの) { LASTPOINT = CurrentPointの; } } }
2.ズーム
//ここでIは、6.6に等しいデフォルトサイズに正射カメラ、カメラと直交を用いるので、
専用フロートスケール= 6.6f;
公共ボイドScaleView()
{
//マルチタッチ、ズーム(新しいレコード2つのタッチポイント)
タッチnewTouch1 = Input.GetTouch(0);
タッチnewTouch2 = Input.GetTouch(1);
//判決が取り消され、または新しいポイントをクリックするか、ScaleView方法から直接持ち上げるされていない
ため(int型I = 0 ; IはInput.touchCountを<; Iは++)
{
IF(Input.GetTouch(I).phase == TouchPhase.Began || Input.GetTouch(I).phase == TouchPhase.Canceled ||
Input.GetTouch(I) == TouchPhase.Ended .phase)
{
現在のポイントをキャンセル//した後は、記録の点となる
。lastTouch2 = newTouch2
lastTouch1 = newTouch1。
返す;
}
}
// 2つの古い点と新たな2点間の距離は、モデルを拡大するために大きくなり、モデルは、に小さい規模になるとの間の距離を計算
;フロートlastDistance = Vector2.Distance(lastTouch1.position、lastTouch2.position)
フロートnewDistance =をVector2.Distance(newTouch1.position、newTouch2.position);
//両者間の距離の差は、拡大ジェスチャは、ジェスチャをズームアウトするために、正、負である
= lastDistanceオフセットフロート- newDistanceと、
画素の//増幅率、0.01倍オペレータ(100調節可能)
scaleFactorでフロート= / zoomFactorオフセット;
//現在のカメラのサイズ
フロートlocalScale = eyeCamera.orthographicSize;
//計算全体の倍率
スケール= + localScale scaleFactorで、
IF(スケール<minScale)
{
= minScaleスケール;
}
そうIF(スケール> MaxScaleの)
{
スケール= MaxScaleの;
}
//カメラのサイズ調整
、Scale2D.SetCameraOrthographicSize(スケール、eyeCamera)
//最新のタッチポイント、次の使用覚え
lastTouch1 = newTouch1と、
lastTouch2をnewTouch2 =;
}