開発blog?とりあえず何でもやってみる人。試した結果などの記録的な何か(笑)。参考にでもなれば嬉しい。利用制限はありません。[edit]既にスワイプ、ロングタップ(クリック)は掲載しているが、スマートフォン等はピンチという操作もよく使われるので、Androidのプラグインに同梱する形で配布することにした。ついでにこのピンチを使って、オブジェクトを拡大・縮小、またはカメラを近づけたり、遠ざけたりする方法(スクリプト)も書いておこう。これらはプラグインのパッケージにデモとしてセットアップされているので、自分で作るのが面倒な人はプラグインをダウンロードして、コピペで利用しても良いと思う。デモをダウンロードできます。アプリのインストール」許可が必要です。コールバックする関数を登録すれば使用可。Ratio=1)も含まれる)。///・内部的には画面でタッチされた2本の指の間隔をピクセル単位で取得する。戻り値は画面幅で割った正規化された値とピクセルそのもので返すかを選べる(isNormalized)。///・ピンチの操作は1本→2本となったときのみ認識する。3本以上→2本になったときは無効。取得できるもののみ)。(必ず最初と2本目の指)。}}ピンチ検出の簡単な解説をしておくと、スマホなどのタッチデバイスで指を2本置いたとき、それぞれの座標からそれらの距離を取得し、指を動かすことによってその座標間の距離の差分でピンチと認識するというものである。このスクリプトではもう少し細かく検出されていて、例えば指が1本→2本となったときはピンチと認識するが、指が3本以上→2本となったときは認識しない(1本、3本以上のときは常に無視する)。コールバックの引数で返ってくる値は「現在のピンチの幅(距離)」「直前のピンチ幅との差分」「ピンチ開始したときの比率」と3つの値を返す。するとピクセル単位で返ってくる)。Ratio)や認識できる画面領域(validArea)などは以前に書いたスワイプ、ロングタップと同じ仕様だ。実際にこれらスクリプトを同時に使用しても問題ないように作ってある。文)に条件を追加して欲しい。取得できるものに限られる。PCなどでは無効になるため)。コールバックするように書き換えても良いだろう。使ってコードから追加する方法もある。コールバック実装は以下を参照)。■ピンチでオブジェクトを拡大・縮小するここからは上記の「PinchInput」を使って、実際にオブジェクトの拡大・縮小の操作をやってみよう。このスクリプトは使い回しできるのでライブラリとして追加もしてある。考え方を理解すれば他のものに利用することも可能だろう。ピンチの仕様を考え中。アリシアのカメラには、値にピンチ幅の差分を用いているが、例えばオブジェクトの拡大・縮小に使うにはピンチ幅の比率(指を2倍に拡げたら、オブジェクトも2倍になるとか)の方が感覚として合ってるな。コールバックを登録すれば使用可。}}仮に拡大・縮小するオブジェクトを「Cube」としたとき、インスペクタでの設定は上のようにしよう。にアタッチしても構わないが、「PinchToScale」の「Target」には対象となるオブジェクトを指定し、「PinchInput」のピンチ開始時のコールバック「OnPinchStart」に「PinchToScale.OnPinchStart」を登録(Dynamicの方)、ピンチ中のコールバック「OnPinch」には「PinchToScale.OnPinch」を登録(Dynamicの方)する。あとは「PinchInput」の「isNormalize」がオンになっているのを確認すればOKだ(デフォルト=オン)。0.25,...など])で拡大・縮小を行っている。この操作には主にコールバック引数の「ratio」(比率)を使っている。スケール操作はローカルスケール(transform.localScale)になる。倍と閉じるのは簡単だということだ。ratio(比率)の方が人間の感覚・見た目には合ってるようだ。線形でやりたい場合はカーブを間に挟んだ方が良い感じになるかも知れない。その辺りは自分で工夫してみて欲しい。■ピンチでカメラの遠近を操作する次に上記の「PinchInput」を使って、視点となるオブジェクトの遠近操作をやってみよう。このスクリプトは使い回しできるのでライブラリとして追加もしてある。考え方を理解すれば他のものに利用することも可能だろう。ピンチ、スワイプ、ロングタップはスマホでは普通に使う機能なので、プラグインのパッケージに同梱しようとデモを作成中。プラグイン自体はAndroid専用だけど、ピンチ操作などはUnityでのコードだけなので、iOSでも使えると思う。ブログにも書くつもりだが、次のバージョンとして配布しよう。コールバックを登録すれば使用可。}}仮に視点先となるオブジェクトを「Cube」としたとき、インスペクタでの設定は上のようにしよう。にアタッチしても構わないが、「PinchToDistance」の「Target」には対象となるオブジェクトを指定し、「PinchInput」のピンチ開始時のコールバック「OnPinchStart」に「PinchToDistance.OnPinchStart」を登録(Dynamicの方)、ピンチ中のコールバック「OnPinch」には「PinchToDistance.OnPinch」を登録(Dynamicの方)する。あとは「PinchInput」の「isNormalize」がオンになっているのを確認すればOKだ(デフォルト=オン)。スクリプトの簡単な解説をしておくと、ピンチ開始時のコールバック(OnPinchStart)は使ってないのだが、ピンチ中は指の開閉による直線の距離の差分(指を開くと正の値が、指を閉じると負の値が返る)で遠近操作を行っている。この操作には主にコールバック引数の「delta」(距離差分)を使っていて、直前の指と指の距離との差を利用し、オブジェクトとの距離を加減算することによって、カメラを移動する感じだ(ただし指を開いたときに近づくには距離をマイナス、指を閉じたときは遠くにするには距離をプラスなので、符号は逆)。具体的な値については「isNormalize」がオンになっているときは画面幅で正規化(widthReference=falseのときは画面の高さで正規化)された値が返り、オフになっているときはピクセル単位で返ってくる。異なった値になってしまうからだ。480/960)となり、画面解像度に依存しなくなる。するか、正規化された値×解像度でもピクセル単位に変換できるので、好きな方を使うと良いだろう。※この記事のスクリプトはプラグインのライブラリにも同梱されています。デモをダウンロードできます。アプリのインストール」許可が必要です。