某所で質問に上がっていたので試しに実装してみました。
ピンチ操作の2本の指の中間点を中心にして拡大縮小します。
実験的に作ったものなので、実行時の条件がかなり限定されています。
・iPhone4S (Retina, 640×960ピクセル)
・CameraのProjectionはOrthographic
その他環境では、座標の変換時のパラメータ等を調整する必要があります。このままだと、おそらく拡大縮小時の中心がズレます。
以下からパッケージをダウンロードして下さい。
test_pinch.unitypackage (14KByte)
新規プロジェクトを作成して、ダウンロードしたパッケージをインポートしてください。
ビルド設定でターゲットプラットフォームを「iOS」に切り替えて、Gameウィンドウのサイズは「iPhone 4G Tall (640×960)」を選択してください。
シーン(test1)を開いて再生してください。
※タッチ操作はUnity上では確認できないので、UnityRemoteやiOSデバイスを使用してください。
ピンチ操作の2本の指の中心に赤い四角が表示されます。この四角を中心に拡大縮小が行われます。
参考:ソースコード
テスト用に書いたので汚いです。ゴメンナサイ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
using UnityEngine; using System.Collections; public class PinchTest : MonoBehaviour { private enum PINCH_STATUS { NONE = -1, UP = 0, PINCH, }; private PINCH_STATUS pinchStatus = PINCH_STATUS.UP; private PINCH_STATUS pinchStatusNext = PINCH_STATUS.NONE; private float pinchLength; private Vector2 center; public GameObject cube; public Camera cam; void Start() { } void movePoint(Vector2 po) { Vector3 nowPo = cube.transform.localPosition; cube.transform.localPosition = new Vector3(po.x, po.y, nowPo.z); } Vector2 convertCenter(Vector2 po) { float scale = cam.orthographicSize / 480f; po *= scale; Vector2 camPos = new Vector2(cam.transform.localPosition.x, cam.transform.localPosition.y); Vector2 org = camPos - new Vector2(320f * scale, 480f * scale); po += org; return po; } void Update() { switch(pinchStatus) { case PINCH_STATUS.UP: if(Input.touchCount > 1) { Touch touch0 = Input.GetTouch(0); Touch touch1 = Input.GetTouch(1); pinchLength = Vector2.Distance(touch0.position, touch1.position); center = (touch0.position + touch1.position) * 0.5f; center = convertCenter(center); print(touch0.position + ", " + touch1.position + ", " + center); movePoint(center); pinchStatusNext = PINCH_STATUS.PINCH; } break; case PINCH_STATUS.PINCH: if(Input.touchCount < 2) { pinchStatusNext = PINCH_STATUS.UP; } break; } while(pinchStatusNext != PINCH_STATUS.NONE) { pinchStatus = pinchStatusNext; pinchStatusNext = PINCH_STATUS.NONE; } switch(pinchStatus) { case PINCH_STATUS.PINCH: Touch touch0 = Input.GetTouch(0); Touch touch1 = Input.GetTouch(1); float nowPinchLength = Vector2.Distance(touch0.position, touch1.position); float scale = nowPinchLength / pinchLength; cam.camera.orthographicSize /= scale; pinchLength = nowPinchLength; Vector2 nowCamPos = new Vector2(cam.transform.localPosition.x, cam.transform.localPosition.y); Vector2 diff = center - nowCamPos; scale = 1.0f - scale; diff = diff * scale; cam.transform.localPosition -= new Vector3(diff.x, diff.y, 0); break; } } } |
座標の扱い、変換がかなり強引な感じになってます。もっとスマートに出来そうな気がするけど・・・
追記 2014/02/12
座標系の変換は、CameraメソッドのScreenToWorldPointメソッドを使えば良いですね ^^;
1 2 3 4 5 |
Vector2 convertCenter(Vector2 po) { Vector3 p = cam.ScreenToWorldPoint(new Vector3(po.x, po.y, 0)); return new Vector2(p.x, p.y); } |
コメントを残す
コメントを投稿するにはログインしてください。