ピンチイン・ピンチアウト操作でカメラ位置を前後させ、
画面表示を拡大縮小させる機能を作りました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MainCameraController : MonoBehaviour { float heightMin = 2.0f; float heightMax = 2000.0f; //前回の2点間の距離 float pre_point2Dist; //初期値 float cameraHeight = 10.0f; Vector3 pre_t1; Vector3 pre_t2; void Update() { /*-------- ピンチイン・ピンチアウト処理 --------*/ // マルチタッチ判定 if (Input.touchCount >= 2) { // タッチしている2点を取得 Touch t1 = Input.GetTouch(0); Touch t2 = Input.GetTouch(1); //2点タッチ開始時の距離を保持 if (t2.phase == TouchPhase.Began) { pre_point2Dist = Vector2.Distance(t1.position, t2.position); } //タッチ位置の変化を検出 else if (t1.phase == TouchPhase.Moved || t2.phase == TouchPhase.Moved) { //2点タッチの位置、各タッチ位置の前回値との差を取得 float point2Dist = Vector2.Distance(t1.position, t2.position); float dist1 = Vector2.Distance(t1.position, pre_t1); float dist2 = Vector2.Distance(t2.position, pre_t2); //2点間の差が縮んだらマイナス、開いたらプラスにする if (Mathf.Sign(point2Dist - pre_point2Dist) >= 0) { cameraHeight = (dist1 + dist2) / 100.0f; } else if (Mathf.Sign(point2Dist - pre_point2Dist) <= 0) { cameraHeight = -(dist1 + dist2) / 100.0f; } //タッチ位置の差に変化があれば変更 if (cameraHeight != 0) { float y = this.transform.position.y; float heightLimitJudg = cameraHeight + y; // 限界値をオーバーした際の処理 if (heightLimitJudg > (heightMax + 1.0f)) { heightLimitJudg = heightMax; this.transform.position = new Vector3(0, heightLimitJudg, 0); } else if (heightLimitJudg < (heightMin - 1.0f)) { heightLimitJudg = heightMin; this.transform.position = new Vector3(0, heightLimitJudg, 0); } else { this.transform.Translate(0, 0, cameraHeight); } } //前回値として2点間距離を保持 pre_point2Dist = point2Dist; } //前回値としてタッチ位置を保持 pre_t1 = t1.position; pre_t2 = t2.position; } } }
補足説明
カメラは「Inspector」上で X軸 を90度回しています。そのため、
this.transform.Translate(0, 0, cameraHeight);
では、相対位置を変化させているため Z軸 を操作していますが、
this.transform.position = new Vector3(0, heightLimitJudg, 0);
では、絶対位置を変化させているため Y軸 を操作しています。
if (heightLimitJudg > (heightMax + 1.0f))
else if (heightLimitJudg < (heightMin - 1.0f))
上記、限界値判定の際に1.0fを加算減算していますが、
実際の限界値と判定値を同じにすると、カメラ位置が限界値に張り付いてしまい、
操作を受け付けなくなってしまうので追加しています。