Unityでピンチインとか(EasyTouch)

ayumegu(プログラマー)
よろしくお願いします。

ちょっとピンチインアウトとスワイプのサンプルを作りたかったので
使用するのはEasyTouch($30)

とりあえずピンチの設定

わかりやすいようにこちらの画像を引いた

Unityにインポートしてテクスチャ設定をSpriteに変更してApply

画面に配置する
続きましてEasyTouchをインポートし,EasyTouchを配置
Tools→Hedgehog Team→EasyTouch→Add EasyTouch for C#

Javascript版とC#版があります。

EasyTouchが配置できたら空のゲームオブジェクトを作成し、C#のスクリプトを作成してアタッチ

アタッチしたスクリプトにとりあえずピンチまわりの文章を記載
これで実行するとログに表示されます

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
using UnityEngine;
using System.Collections;

public class TouchManager : MonoBehaviour {

  // Use this for initialization
  void Start () {
  }

  void OnEnable(){
      EasyTouch.On_PinchIn += On_PinchIn;
      EasyTouch.On_PinchOut += On_PinchOut;
      EasyTouch.On_PinchEnd += On_PinchEnd;
  }

  void OnDisable(){
      EasyTouch.On_PinchIn -= On_PinchIn;
      EasyTouch.On_PinchOut -= On_PinchOut;
      EasyTouch.On_PinchEnd -= On_PinchEnd;
  }

  private void  On_PinchIn( Gesture gesture ){
      Debug.Log ("pinch in");
  }
  
  private void  On_PinchOut( Gesture gesture ){
      Debug.Log ("pinch out");
  }
  
  private void  On_PinchEnd( Gesture gesture ){
      Debug.Log ("pinch end");
  }

  // Update is called once per frame
  void Update () {
  
  }
}

Playを押してcommand+option+ドラッグでピンチのテストがGameビュー上で行える

つくったもの

機能としては以下

  • ピンチでの拡大率の変更
  • ドラッグでの移動
  • 画像の範囲内でしかカメラを移動できない実装

こんな感じ
option+command+ドラッグでブラウザからピンチできます

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using UnityEngine;
using System.Collections;

public class TouchManager : MonoBehaviour {
  // TODO Screen.sizeによって拡大率を変える必要がありそう
  private GameObject mainCamera;               // メインカメラ
  private float orthoSizeMax = 6.0f;            // 最大縮小サイズ
  private float orthoSizeMin = 3.0f;            // 最大拡大サイズ
  private float baseOrthographicSize = 5.0f;    // デフォルト拡大サイズ
  private float orthographicSize;              // カメラの拡大サイズ
  private float nowOrthgraphicSize;            // 現在のカメラの拡大サイズ
  private Vector2 swipeVector;             // スワイプで動く量
  public GameObject sprite;

  void Start () {
      mainCamera = GameObject.Find("Main Camera");
      mainCamera.camera.orthographicSize = baseOrthographicSize;
      orthographicSize = mainCamera.camera.orthographicSize;
      nowOrthgraphicSize = orthographicSize;
  }
  
  
  void OnEnable(){
      EasyTouch.On_PinchIn += On_PinchIn;
      EasyTouch.On_PinchOut += On_PinchOut;
      EasyTouch.On_PinchEnd += On_PinchEnd;

      EasyTouch.On_SwipeStart += On_SwipeStart;
      EasyTouch.On_Swipe += On_Swipe;
      EasyTouch.On_SwipeEnd += On_SwipeEnd;
  }
  
  void OnDisable(){
      EasyTouch.On_PinchIn -= On_PinchIn;
      EasyTouch.On_PinchOut -= On_PinchOut;
      EasyTouch.On_PinchEnd -= On_PinchEnd;

      EasyTouch.On_SwipeStart -= On_SwipeStart;
      EasyTouch.On_Swipe -= On_Swipe;
      EasyTouch.On_SwipeEnd -= On_SwipeEnd;
  }
  
  private void  On_PinchIn( Gesture gesture ){
      float zoom = Time.deltaTime * gesture.deltaPinch / 5.0f;
      orthographicSize = mainCamera.camera.orthographicSize + zoom;
      if(orthographicSize > orthoSizeMax){
          orthographicSize = orthoSizeMax;
      }
  }
  
  private void  On_PinchOut( Gesture gesture ){
      float zoom = Time.deltaTime * gesture.deltaPinch / 5.0f;
      orthographicSize = mainCamera.camera.orthographicSize - zoom;
      if(orthographicSize < orthoSizeMin){
          orthographicSize = orthoSizeMin;
      }
  }
  
  private void  On_PinchEnd( Gesture gesture ){
  }


  private void  On_SwipeStart( Gesture gesture ){
  }
  
  private void  On_Swipe( Gesture gesture ){
  }
  
  private void  On_SwipeEnd( Gesture gesture ){
      
      if (gesture.touchCount==1 ){
          swipeVector = gesture.deltaPosition * gesture.deltaTime;
      }
  }
  
  void Update () {
      
      // カメラのピンチ動作
      if (orthographicSize != nowOrthgraphicSize) {
          
          float tmp = (orthographicSize - nowOrthgraphicSize) / 10.0f;
          nowOrthgraphicSize += tmp;
          if(Mathf.Abs(tmp) < 0.1f) nowOrthgraphicSize = orthographicSize;
          
          mainCamera.camera.orthographicSize = orthographicSize;
          LimitCheckAndFix();
      }

      if(Input.GetMouseButtonDown(0))
      {
          StartCoroutine("CameraDragEvent");
      }
      // カメラのスワイプ動作
      if( swipeVector != Vector2.zero){
          Vector2 tmp = swipeVector / 10.0f;
          swipeVector -= tmp;
          if(Mathf.Abs(Vector2.Distance(Vector2.zero, tmp)) <= 0.1f)
          {
              swipeVector = Vector2.zero;
          }
          Vector3 cameraPos = mainCamera.transform.position;
          Vector3 tmp2 = new Vector3(tmp.x, tmp.y, 0);
          mainCamera.transform.position -= tmp2;
          LimitCheckAndFix();
      }
  }


  private IEnumerator CameraDragEvent()
  {
      Vector2 prevPosition = mainCamera.camera.ScreenToWorldPoint(Input.mousePosition);
      Vector2 curPosition = mainCamera.camera.ScreenToWorldPoint(Input.mousePosition);
      Vector3 prevMousePosition = Input.mousePosition;
      Vector3 curMousePosition = Input.mousePosition;
      
      
      while (Input.GetMouseButton(0))
      {
          if (Input.touchCount > 1)
          {
              yield break;
          }
          
          curMousePosition = Input.mousePosition;
          
          if (prevMousePosition != curMousePosition)
          {
              curPosition = mainCamera.camera.ScreenToWorldPoint(curMousePosition);

              Vector2 posDiff = (curPosition - prevPosition);
              Vector3 posDiff3 = new Vector3(posDiff.x, posDiff.y, 0f);
              mainCamera.transform.localPosition += -posDiff3;
              
          }
          
          prevMousePosition = curMousePosition;
          LimitCheckAndFix();
          yield return null;
      }
  }

  private void LimitCheckAndFix()
  {
      SpriteRenderer sr = sprite.GetComponent<SpriteRenderer>();
      Vector3 size = sr.bounds.size;
      float aspect = mainCamera.camera.aspect;

      if (mainCamera.transform.position.x < size.x / -2.0f + nowOrthgraphicSize * aspect){
          mainCamera.transform.SetPositionX(size.x / -2.0f + nowOrthgraphicSize * aspect);
      }

      if (mainCamera.transform.position.x > size.x / 2.0f - nowOrthgraphicSize * aspect){
          mainCamera.transform.SetPositionX(size.x / 2.0f - nowOrthgraphicSize * aspect);
      }

      if (mainCamera.transform.position.y < size.y / -2.0f + nowOrthgraphicSize){
          mainCamera.transform.SetPositionY(size.y / -2.0f + nowOrthgraphicSize);
      }

      if (mainCamera.transform.position.y > size.y / 2.0f - nowOrthgraphicSize){
          mainCamera.transform.SetPositionY(size.y / 2.0f - nowOrthgraphicSize);
      }

  }
  
}

ipod touchでもandroidでもちゃんと動いた。
ただTodoにも書いた通り、端末の解像度によって拡大率かえる必要がありそうです。
ソースはまだちょっと修正が必要そうですが
まぁ今回はこの辺で