質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1947閲覧

スワイプ入力によるRigidbodyオブジェクトの移動のやり方

yomoyari

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/09/17 15:08

お世話になります。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

どのように改善することで理想とする動きが実現できますでしょうか? 考え方やソースコードのアドバイスなどいただけましたら幸いです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2019/09/22 01:36 編集

GetMouseButtonDownとGetMouseButtonの順番は保証されない気がします。Debug.Logを仕込むなどして、想定通りの順番で各変数が想定通りの座標になっているか確認してみてください。 「Input.GetTouch」などで取得出来るTouchクラスが「タッチ開始」「移動中」などのフェーズを持ってるのでそちらを使用して確実にタイミングを取った方がいいかもしれません。 https://docs.unity3d.com/ja/current/ScriptReference/Input.GetTouch.html https://docs.unity3d.com/ja/current/ScriptReference/Touch-phase.html もしくは「EventTrigger.OnDrag」系インターフェースを使うのもアリかと。 https://qiita.com/okuhiiro/items/4c313038798da6923205
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問