Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ スマホでのオブジェクトの操作 スライド

f:id:Harukichi:20210430001329g:plain

 

新たなスマートフォンのゲームアプリの開発中!!

 

カーソルの操作の制御で、画面に左右のボタンを設けて・・・というのはよくあるが、スマホだもんね

ボタンでの操作というのはやっぱ野暮じゃない?

 

てな感じで、画面のスワイプというかスライドでカーソルを動かすことに挑戦したので、やり方を書き残しておく

 

大まかな手順

①操作したいオブジェクトにEventTriggerを追加

スクリプトでオブジェクトが押されたこと、そのままスライドされたことを検知して、移動距離に応じてオブジェクトも動かす

 

◆Event Triggerの追加

操作したいオブジェクトにEvent Triggerを追加し、PointerDown、PointerUpのイベントが発生した時に呼び出す関数を割り付ける

f:id:Harukichi:20210430002012p:plain

 

スクリプトでの制御

//オブジェクトが押された(タップされた)イベント発生時に呼び出される関数

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);

 

今回は以上