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

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

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

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

Unity

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

Q&A

解決済

1回答

2905閲覧

スワイプ量に応じてオブジェクトを移動させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2018/06/04 01:01

編集2018/06/07 00:24

前提・実現したいこと

Unity 3Dで、スワイプ量に応じて、オブジェクトを移動させる方法を教えていただきたいです。
指の動きに対して、オブジェクトが同期して動くようにしたいです。
ご教示お願い致します。

試したこと

こちらのサイトで、タッチ位置そのものにオブジェクトを追従する方法はわかりました。

試したこと

C#

1public class InputManager : MonoBehaviour { 2 float distance; 3 GameObject cube; 4 // Use this for initialization 5 void Start () { 6 cube = GameObject.Find("Cube"); 7 } 8 9 // Update is called once per frame 10 void Update () { 11 Vector3 position = Input.mousePosition; 12 position.z = 10f; 13 Vector3 worldposition = Camera.main.ScreenToWorldPoint(position); 14 if(Input.GetMouseButtonDown(0)){ 15 distance = Vector3.Distance(worldposition, cube.transform.position); 16 }else if(Input.GetMouseButton(0)){ 17 cube.transform.position = worldposition + distance; 18 } 19 } 20}

cube.transform.position = worldposition + distance; でエラーになります。

あと、このままだとオブジェクトが画面からはみ出てしまうこともあるので、
画面内に納まる制限をつけた動きにする(オブジェクトが画面外に、はみ出ようとするとそれ以上動かないようにする)ことを、
コードで組みたいのですが、どうすればよいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

スワイプの定義にもよりますが、「タッチ開始位置とタッチ終了(=離された)位置の差」を取ればいいかと。
位置がVector3ならVector3.Distance(開始位置, 終了位置)で距離(float)が取れますし、
終了位置 - 開始位置で2点間のベクトル(Vector)が取れます。

画面サイズに応じた補正については以下。
Unity : モバイルでのスワイプ、ドラッグ入力量を補正する - いんでぃーづ
そもそもスワイプをどう取得するかは「unity スワイプ」「unity フリック」等で検索をどうぞ。
一例:Unity-フリック操作について - Qiita


(追記分)

「キューブの元の位置から、タッチ位置を動かした分だけ移動」だと思うので、考え方としては
cube.transform.position = cube.transform.position + distance;
こうだと思います。

で、最初の回答にも書きましたがVector3.Distanceは距離(float)を取得します。
Vecor3(三次元)とfloat(一次元)は足すことは出来ないので、ここは終了位置 - 開始位置を使って差のベクトルを取得して、キューブの元の位置に足し算します。

なお、distanceも「タッチ開始位置から現在のタッチ位置まで」になっていなかったので修正しています。

C#

1 Vector3 startPos; //タッチ開始位置 2 3 void Update () { 4 if(Input.GetMouseButtonDown(0)){ 5 //タッチ開始位置を保存 6 startPos = Input.mousePosition; 7 }else if(Input.GetMouseButton(0)){ 8 Vector3 position = Input.mousePosition; 9 position.z = 10f; 10 Vector3 worldposition = Camera.main.ScreenToWorldPoint(position); 11 //「現在位置-タッチ開始位置」の差のベクトルを取る 12 Vector3 distance = worldposition - startPos; 13 cube.transform.position += distance; //元の位置に足す 14 } 15 }

「ベクトルの足し算引き算」(プログラムではなく数学の範疇)を調べてみるといいと思います。
(Unityの場合、「ベクトル」も「座標」もVector3を使うのでどっちなのか理解した上でコードを読み書きする必要あり)

移動制限については「unity 移動制限」で検索すれば色々出て来るので都合の良い方法を探してみてください。

投稿2018/06/04 04:33

編集2018/06/07 01:19
sakura_hana

総合スコア11425

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

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

退会済みユーザー

退会済みユーザー

2018/06/04 13:04

ご回答ありがとうございます。 仕様の説明が下手ですみません。正確に言うと、スワイプではないのかもしれませんが、 指の動きに同期してオブジェクトを動かすものでした。 ご回答者様からいただいた回答をヒントにコードを組んでみました。 タップ時に、タップ位置とゲームオブジェクトとの差分をとっておけば、 あとは動かしたときに、タップ位置から、その差分を足した所にゲームオブジェクトを配置すれば、 同期した動きになるような気がするのですが、いかがですか? ただ、追記にも書いた通り、そのコードがうまく書けませんでした。 あと、移動制限もコードで組みたいのですが、どのような方法がありますか?
sakura_hana

2018/06/07 01:19

回答に追記しました。
退会済みユーザー

退会済みユーザー

2018/06/08 07:45

ご回答ありがとうございます。 ベクトルの足し算引き算、勉強になりました。 移動制限についても調べて勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問