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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

2423閲覧

unity タッチに合わせて自機が移動する仕組みを作りたい

dousuruyo

総合スコア74

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/01/04 09:57

編集2022/01/12 10:55

前提・実現したいこと

シューティングゲームの開発を行っています
タッチ・スライドに合わせて自機が移動する仕組みを作りたいです
スライドしたぶんだけ自機がその方向に移動する感じです

発生している問題

一度、別のネットに落ちてたソースコードをもってきてそれで実現できたのですが、(引用元のリンクは、忘却の彼方へ過ぎました。。)
ほかの部分を色々修正してるうちに、再度移動のところの確認をしたところ、自機が画面から表示されなくなりました

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5/// <summary> 6/// 自機コントローラ 7/// </summary> 8public class JikiController : MonoBehaviour { 9 public GameObject bulletPrefab; 10 private float timeElapsed; 11 private Vector3 touchPosition; 12 13 public float mouseSensitivity = 5f;//マウスの感度 14 public float distanceToCamera = 10f;//カメラとプレイヤーの距離 15 public float goRotationSmooth = 20f;//目標角度に向かう時の速さ 16 public float outRotationSmooth = 3f;//元の角度に向かう時の速さ 17 public float slope = 30f;//目標角度 18 Vector3 playerPointInViewport;//プレーヤーのビューポート座標 19 Vector3 mouseMovement;//マウスの移動量 20 private Touch touch;//タップのデータ 21 private Vector3 touchPoint;//タップした場所 22 private float touchMovementX;//タッチの移動量x 23 private float touchMovementY;//タッチの移動量y 24 25 // Use this for initialization; 26 void Start () { 27 transform.rotation = Camera.main.transform.rotation; 28 transform.position = Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, distanceToCamera)); 29 //初期値の決定 30 Debug.Log("初期位置:"+ transform.position); 31 } 32 33 // Update is called once per frame 34 void Update() { 35 timeElapsed += Time.deltaTime; 36 37 //相対移動 38 if (Application.platform == RuntimePlatform.WindowsEditor) { 39 OnMouseDrag(); 40 } 41 else { 42 OnTouchDrag(); 43 } 44 45 // androidのときは1秒ごと発射 46 if (timeElapsed >= 0.5f) { 47 //Instantiate(bulletPrefab, transform.position, Quaternion.identity); 48 49 timeElapsed = 0.0f; 50 } 51 } 52 53 /// <summary> 54 /// 自機移動(エミュ 角度変更機能あり) 55 /// </summary> 56 void OnMouseDrag() { 57 //もしマウスが押されたとき 58 if (Input.GetMouseButton(0)){ 59 transform.position = Camera.main.ViewportToWorldPoint(playerPointInViewport); 60 //プレーヤーのビューポート座標をワールド座標に変換して代入 61 //if (Input.GetAxis("Mouse X") < 0)//もしマウスが左に移動したとき 62 //{ 63 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, slope), goRotationSmooth * -Input.GetAxis("Mouse X") * Time.deltaTime); 64 // //カメラの角度(基準)とslopeを滑らかに合成してプレイヤーの角度に代入する(Time.deltaTimeを掛けているのは環境の違いによる回転の差をなくすため) 65 //} 66 //if (Input.GetAxis("Mouse X") > 0)//もしマウスが右に移動したとき 67 //{ 68 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, -slope), goRotationSmooth * Input.GetAxis("Mouse X") * Time.deltaTime); 69 // //上と同じ 70 //} 71 } 72 //if (!Input.GetMouseButton(0) || Input.GetMouseButton(0) && Input.GetAxis("Mouse X") == 0)//もしマウスが押されていない or マウスが押されている + マウスが移動していないとき 73 //{ 74 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, 0), outRotationSmooth * Time.deltaTime); 75 // //元の角度に戻す 76 //} 77 mouseMovement = new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), 0) * Time.deltaTime * mouseSensitivity; 78 //マウスの移動量(Time.deltaTimeを掛けているのは環境の違いによる移動量の差をなくすため) 79 playerPointInViewport = Camera.main.WorldToViewportPoint(transform.position) + mouseMovement; 80 //プレイヤーの場所とマウスの移動量を足す 81 playerPointInViewport.z = distanceToCamera; 82 //プレイヤーとカメラの距離(ビューポート座標に直接代入しても変換したときに自動的に距離にしてくれる(便利)) 83 Clamp();//移動制限 84 } 85 86 /// <summary> 87 /// 自機移動(android実機) 88 /// </summary> 89 void OnTouchDrag() { 90 if (Input.touchCount > 0)//もしタッチされたとき 91 { 92 touch = Input.GetTouch(0);//タッチのデータを代入 93 touchMovementX = touch.deltaPosition.x / mouseSensitivity * Time.deltaTime; 94 touchMovementY = touch.deltaPosition.y / mouseSensitivity * Time.deltaTime; 95 transform.position = Camera.main.ViewportToWorldPoint(playerPointInViewport); 96 //プレーヤーのビューポート座標をワールド座標に変換して代入 97 //if (touchMovementX < 0)//もしタッチの場所が左に移動したとき 98 //{ 99 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, slope), goRotationSmooth * -touchMovementX); 100 // //カメラの角度(基準)とslopeを滑らかに合成してプレイヤーの角度に代入する 101 //} 102 //if (touchMovementX > 0)//もしタッチの場所が右に移動したとき 103 //{ 104 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, -slope), goRotationSmooth * touchMovementX); 105 // //上と同じ 106 //} 107 } 108 //if (Input.touchCount == 0 || Input.touchCount > 0 && touchMovementX == 0)//もしタッチされていない or タッチされている + タッチ場所が移動していないとき 109 //{ 110 // transform.rotation = Quaternion.Slerp(transform.rotation, Camera.main.transform.rotation * Quaternion.Euler(0, 0, 0), outRotationSmooth * Time.deltaTime); 111 // //元の角度に戻す 112 //} 113 mouseMovement = new Vector3(touchMovementX, touchMovementY); 114 //タッチの移動量 115 playerPointInViewport = Camera.main.WorldToViewportPoint(transform.position) + mouseMovement; 116 //プレイヤーの場所とタッチの移動量を足す 117 playerPointInViewport.z = distanceToCamera; 118 //プレイヤーとカメラの距離(ビューポート座標に直接代入しても変換したときに自動的に距離にしてくれる(便利)) 119 Clamp();//移動制限 120 } 121 122 void Clamp() { 123 playerPointInViewport.x = Mathf.Clamp(playerPointInViewport.x, 0, 1); 124 playerPointInViewport.y = Mathf.Clamp(playerPointInViewport.y, 0, 1); 125 //プレーヤーのビューポート座標を制限する 126 } 127} 128

ソースコードには今回とは関係ないっぽい部分もたくさんありますが、どこが関係しているのか私では断定できないので、この.csはそのまま載せます

試したこと

Strt()の中のpositionを決定する一文を消したところ、最初は自機が表示されましたが、タッチすると自機がどっかに消えました。。
また、すべてのWorldToViewportPoint→ViewportToWorldPointに変更したら、自機が表示されてタッチした際に時機が動くようにはなったのですが、以前のようにスライド量に応じたぶん移動、ではなく、ほとんど少ししか移動しないようになってしまいました
おそらくカメラがビューポート座標ではなくワールド座標しかみなくなったから?が原因だと思いますが、設定がわからないです。。

何か原因として考えられるとこ、ほかに必要な情報等あればなんでもいいので教えてもらえると助かります><

追記

オブジェクトのZ軸の座標が5or10になったらカメラに写って移動するようになりましたが、、
以前と違って移動がスムーズではなく、スライドしたぶん移動しなくなりました
考えられる原因としてはどのへんでしょうか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14184908134?__ysp=dW5pdHkgT25Nb3VzZURyYWcgQ2xhbXAg55%2Bl5oG16KKL
こちらが参考にしたリンクです

また、オブジェクト上のmouseSensitivityやdistanceToCameraの値を色々変えるとタッチ・スライドした際の移動速度が全然変わるので、そこの設定値をちょうどよく変えればいいのだと思いますが、
この値はどうすればちょうどよくなるのでしょうか?。。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問