新たなスマートフォンのゲームアプリの開発中!!
カーソルの操作の制御で、画面に左右のボタンを設けて・・・というのはよくあるが、スマホだもんね
ボタンでの操作というのはやっぱ野暮じゃない?
てな感じで、画面のスワイプというかスライドでカーソルを動かすことに挑戦したので、やり方を書き残しておく
大まかな手順
①操作したいオブジェクトにEventTriggerを追加
②スクリプトでオブジェクトが押されたこと、そのままスライドされたことを検知して、移動距離に応じてオブジェクトも動かす
◆Event Triggerの追加
操作したいオブジェクトにEvent Triggerを追加し、PointerDown、PointerUpのイベントが発生した時に呼び出す関数を割り付ける
◆スクリプトでの制御
//オブジェクトが押された(タップされた)イベント発生時に呼び出される関数
public void OnPointerDown()
{
//押された状態に設定
TapFlag = true;
//押された位置を取得
Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);
//スマホ内の座標に変換して記憶しておく
lastMousePos = Camera.main.ScreenToWorldPoint(pos);
}
//オブジェクトから指が離れた(タップをやめた)イベント発生時に呼び出される関数
public void OnPointerUp()
{
//押されていない状態に設定
TapFlag = false;
//押された位置をクリア
lastMousePos = Vector3.zero;
}
//Update関数にて、オブジェクトが押されている状態中を監視し、移動していたらオブジェクトの位置も更新
void Update()
{
if (TapFlag)
{
//現在位置を取得
Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);
NewMousePos = Camera.main.ScreenToWorldPoint(pos);
//前回位置からの移動量を算出 X座標のみ
float DestX = NewMousePos.x - lastMousePos.x;
//移動量をそのまま反映すると動作がもっさりなため10倍
float Xpos = transform.position.x + DestX*10f;
//画面内からはみ出さないようにX値を調整
transform.position = new Vector3(Mathf.Clamp(Xpos, -12, 12), transform.position.y, transform.position.z);
//位置情報を更新
lastMousePos = NewMousePos;
}
}
◎今回の罠 ハマったポイント
Camera.main.ScreenToWorldPoint()が今回のハマったポイント
最初はこの関数にInput.mousePositionを引数として設定していたが、動かない
よくわからないがカメラの位置情報のみが取得され、タップしている位置を変えても値も変化しない
ということで、ググりまくること3時間(-_-メ)
ようやく同じ罠にはまった先人の記事を発見!! (感謝)
この関数の引数はVector3型で、Input.mousePositionからも当然Vector3値がセットされるものと思っていたが、xとyしか設定されず、zのデータがないので、ScreenToWorldPoint()からはまともなデータの取得ができない
カメラにより表示される画面の内容はカメラの位置からZ方向に「10」離れた位置のものらしい
なので、タップした位置データの作成は、タップした位置情報にz情報を10として設定している
Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10f);
今回は以上