見出し画像

Unity フリック操作を作ろう!

どうもマカロンです。

今回は久しぶりに技術記事です。
スマホでフリックする動きを作っていきたいと思います!

この記事を読んで完成するもの

まずは今回完成するものの動画をどうぞ

画像1

今回紹介する記事は下記の記事をベースに指を離した際に処理が始まる仕組みから各方向に一定量スワイプしたら自動で処理が始まるように改良してゲームで実装しやすいようにしました。
https://qiita.com/pilkul/items/e8864882b3f7e59b05e3



概要

キャプチャ

今回作ったものはスワイプで移動する赤い球(Player)と元の位置に座標を戻すリセットボタンです。

ソースコードはPlayer.csのみです!こちらがコードになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
   /*プレイヤーの持つパラメータを参照*/
   private Vector3 pos;//プレイヤーの座標

   /*操作に関する処理*/
   private Vector3 touchStartPos;//画面タップ開始地点の座標
   private Vector3 touchNowPos;//現在の座標
   private string direction;//現在のタッチの状態を代入するstring
   private bool isTouch;//タッチされているかどうか

   /*動作に関する処理*/
   private bool isMove;//動いているかどうか
   [SerializeField] private float moveSpeed;//プレイヤーの移動速度

   //=================================
   //初期化
   //=================================
   void Start()
   {

   }

   //=================================
   //更新
   //=================================
   void Update()
   {
       if (isMove) { Move(); }//移動
       else { Flick(); }//フリックの処理
   }

   //=================================
   //フリック操作
   //=================================
   void Flick()
   {
       //画面がタップされた時
       if (Input.GetKeyDown(KeyCode.Mouse0))
       {
           touchStartPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z);
           isTouch = true;
       }
       //画面から指が離れた時
       if (Input.GetKeyUp(KeyCode.Mouse0))
       {
           //タッチを検出
           if (direction == "touch")
           {
               //タッチの処理
               Debug.Log("タッチ");
           }
           isTouch = false;
       }

       //現在タッチされている場合
       if (isTouch)
       {
           touchNowPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z);
           GetDirection();//座標からタッチ、フリックの状態を管理
       }
   }

   //=================================
   //座標の管理
   //=================================
   void GetDirection()
   {
       //現在の座標と開始地点の座標の差を代入
       float directionX = touchNowPos.x - touchStartPos.x;
       float directionY = touchNowPos.y - touchStartPos.y;

       //差の大きさによって条件分岐
       if (Mathf.Abs(directionY) < Mathf.Abs(directionX))
       {
           if (30 < directionX)
           {
               //右向きにフリック
               direction = "right";
           }
           else if (-30 > directionX)
           {
               //左向きにフリック
               direction = "left";
           }
       }
       else if (Mathf.Abs(directionX) < Mathf.Abs(directionY))
       {
           if (30 < directionY)
           {
               //上向きにフリック
               direction = "up";
           }
           else if (-30 > directionY)
           {
               //下向きのフリック
               direction = "down";
           }
       }

       //フリック操作がなかった場合
       else
       {
           //タッチを検出
           direction = "touch";
       }

       if (direction == null || direction == "touch") { return; }

       isTouch = false;
       isMove = true;
   }

   //=================================
   //移動
   //=================================
   void Move()
   {
       pos = transform.position;
       //フリックの方向によって分岐
       switch (direction)
       {
           case "up":
               //上フリックされた時の処理
               pos.y += moveSpeed;
               break;

           case "down":
               //下フリックされた時の処理
               pos.y -= moveSpeed;
               break;

           case "right":
               //右フリックされた時の処理
               pos.x += moveSpeed;
               break;

           case "left":
               //左フリックされた時の処理
               pos.x -= moveSpeed;
               break;
       }

       transform.position = pos;
   }

   //=================================
   //初期座標に戻る
   //=================================
   public void Reset()
   {
       transform.position = new Vector3(0.0f,0.0f,0.0f);
       direction = null;
       isMove = false;
   }
}



ボタンにリセット処理の登録(不要な人は飛ばしてください)

    //=================================
   //初期座標に戻る
   //=================================
   public void Reset()
   {
       transform.position = new Vector3(0.0f,0.0f,0.0f);
       direction = null;
       isMove = false;
   }

この部分でプレイヤーの座標を0にしてdirectionをnull、isMoveを初期化しています。

directionは現在の入力状態を表す変数なのでnullにしてリセットします。
isMove は今プレイヤーが動いているかどうかを見るのでfalseにて動きを停止

関数をpublicにすることでButtonにセットすることが可能になるのでボタンを押された際にReset関数が呼ばれるように設定します。

キャプチャ



確認

キャプチャ

最後にプレイヤーのスピードを外部からいじれるようにしてあるのでここで好きな値を設定して完成(画像のスピードは冒頭の動画のスピードと同じです)

これで完成です!お疲れさまでした!!!!



最後に

桃鉄と半妖の夜叉姫についても記事を書きたいと思っているのと有料記事も書きたいと思っていますが、ゲームも作りたいし、ゲームで遊びたいので今一番行きたいところはドラゴンボールZに登場する精神と時の部屋です。


ゲームを作るにはやはりお金がないとできることが限られてしまいます。なのでよろしければどうか支援してくださるとうれしいです