お世話になります。Unityを利用してスマートフォン向け3Dゲームを勉強中です。
前提・実現したいこと
今回、「スワイプ入力によるRigidbodyがアタッチされたSphereの移動」を実現したいと思っているのですが現状のやり方だと最初にタップした位置が必ず起点となってしまいます。
たとえば真ん中をタップした際に、左にスワイプしたあと右に動かしたいと思ったときは最初にタップした位置よりも右のところまでスワイプ入力しなければなりません。
これを、現在のタップ位置から左右上下の判定をとって動かすようにしたいのです。
現状の動き
最初にタップした位置(黒点)からの、タップ位置のベクトルを出して動かす。
起点(黒点)との差で動かすため、右に動かしたい場合には最初の起点よりも右にスワイプする必要がある
改善したい動き
現在の位置が基準?となるため最初の起点に関係なく現在の地点より右側をスワイプすると右に移動する
起点となる地点を更新すれば良いかとも思ったのですが、そうするとどの点とどの点のベクトルを作って動かしてやれば良いのかいまいちわからず詰まってしまいました。
###現状のソースコード
現在はタップした地点と現在のタップ地点の差を取りベクトルを正規化して設定されたスピードをかけたものをSphereのvelocityに直接代入しています。
右にスワイプしたら右に移動し、左にスワイプしたら左に移動。タップしたら停止するなど基本的な挙動としては理想通りに動いています。
cs
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MoveTest : MonoBehaviour 6{ 7 float speed = 3; 8 Vector3 startPos,nowPos; 9 10 void Update() 11 { 12 if (Input.GetMouseButtonDown(0)) { 13 var tapPos = Input.mousePosition; 14 tapPos.z = 10; 15 startPos = Camera.main.ScreenToWorldPoint(tapPos); 16 17 }else if (Input.GetMouseButton(0)) { 18 var tapPos = Input.mousePosition; 19 tapPos.z = 10; 20 nowPos = Camera.main.ScreenToWorldPoint(tapPos); 21 22 var twoVec = nowPos - startPos; 23 twoVec.z = twoVec.y; 24 twoVec.y = 0; 25 26 GetComponent<Rigidbody>().velocity = twoVec.normalized * speed; 27 28 } 29 30 } 31} 32
###改善したいこと
他のスマートフォンゲームを遊んでいて、同じようなスワイプ操作にも関わらずもっと直感的に遊べるものがあったのでそれに近づけたいと思っています。
それが「Crazy Kick!」というゲームなのですが、これもボールをスワイプ操作で動かしてゴールまで連れて行くというゲームです。
左にスワイプすれば左に動き、タップしたら勢いが止まる、左にスワイプしてから右に指を動かすと最初の起点を超えていなくても右に動く という理想の動きが行われています。
しかし最初のタップ地点がすべての起点となるわけではなく、現在の位置から右にスワイプすれば右、左にスワイプすれば左とよりレスポンスの良い動きで動かすことができるようになっています。これを実現したいです。
(参考動画)Crazy Kick! Zone 1-10 Walkthrough Gameplay | Voodoo
https://www.youtube.com/watch?v=H8_UpzMkfDA
どのように改善することで理想とする動きが実現できますでしょうか? 考え方やソースコードのアドバイスなどいただけましたら幸いです
あなたの回答
tips
プレビュー