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

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

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

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

Q&A

1回答

485閲覧

Unityで横向きスマホゲームを作るにあたっての質問

Jennifer

総合スコア0

Unity

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

0グッド

0クリップ

投稿2023/05/21 12:10

編集2023/05/22 03:41

█実現したいこと

スマホでよくある画面の半分より左側はスティックを動かしたりスワイプしたりでキャラクターの移動
右半分の画面をスワイプするとカメラが動くみたいな感じで実装したいのですが、どうやって実現するか分からなくて。
教えて下さると助かります。

█現在の状態
右画面左画面関係なくスワイプするとキャラクターが移動する。

初めての質問なので少し見にくかったり分かりずらいかもです

C#

1移動の入力用のスクリプトを貼り付けました。 2文字化けした影響でコメントアウトは削除してしまいました。 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using NamePlayer; 7using SaveDate; 8using UnityEngine.InputSystem; 9 10 11 12//入力用のスクリプト 13public class InputManager : MonoBehaviour 14{ 15 16private Vector3 worldPos = new Vector3(0, 0, 0); 17private Vector3 worldPosCopy = new Vector3(0, 0, 2); 18 19[SerializeField] private PlayerController Pcon; 20 21[SerializeField] private SaveTest Sates; 22 23private Inpputer InputTouch; 24bool Input_Ok = false; 25private Vector3 InputStartPos; 26 27private Vector3 V0 = Vector3.zero; 28Vector2 StartPos; 29private int InputCount = 0; 30 31[SerializeField, Tooltip("タップした場所を何秒クリックしたら攻撃判定に変える")] private int Hold; 32 33[SerializeField] private float SpaceX; 34[SerializeField] private float SpaceY; 35 36private bool Sp; 37[SerializeField] Camera cam; 38private float TouchingTime; 39 40 41[SerializeField] float NomalAttackTime; 42[SerializeField] float StrongAttack; 43 44bool NotHold; 45int HoldCount = 0; 46testM tm; 47 48private Vector3 temp; 49private void Awake() 50{ 51InputTouch = new Inpputer(); 52} 53 54// Start is called before the first frame update 55void Start() 56{ 57InputStartPos = Vector3.zero; 58NotHold = false; 59Sp = false; 60} 61 62#region 63private void OnEnable() 64{ 65//有効化 66InputTouch.Enable(); 67} 68private void OnDisable() 69{ 70//削除 71InputTouch.Disable(); 72} 73#endregion 74 75// Update is called once per frame 76void Update() 77{ 78PlayerInputVec(); 79if (Input_Ok) 80{ 81TouchingTime += Time.deltaTime; 82InputHold(); 83} 84} 85 86private void PlayerInputVec() 87{ 88#region 89InputTouch.Player.Touchpos.started += (InputAction.CallbackContext context) => 90{ 91//最初に入力してきた値取得 92InputStartPos = cam.ScreenToWorldPoint(InputTouch.Player.SwaipPos.ReadValue<Vector2>()); 93//タップしたかのflag 94Input_Ok = true; 95//スキル技を使っているflag 96Sp = false; 97InputCount = 0; 98temp = V0; 99worldPos = V0; 100NotHold = false; 101TouchingTime = 0; 102InputStartPos = cam.ScreenToWorldPoint(InputTouch.Player.SwaipPos.ReadValue<Vector2>()); 103}; 104InputTouch.Player.Touchpos.canceled += (InputAction.CallbackContext context) => 105{ 106Pcon.InputCancel(); 107Sp = false; 108Input_Ok = false; 109InputStartPos = V0; 110InputCount = 0; 111temp = V0; 112worldPos = V0; 113NotHold = false; 114if(TouchingTime <= NomalAttackTime) 115{ 116Pcon.NomalAttack(); 117TouchingTime = 0.0f; 118} 119if(TouchingTime >= StrongAttack) 120{ 121//Pcon.StrongAttack(); 122 123} 124}; 125#endregion 126} 127private void InputHold() 128{ 129StartPos = InputTouch.Player.SwaipPos.ReadValue<Vector2>(); 130 131if (worldPos == InputStartPos && !NotHold) 132{ 133InputCount++; 134if (InputCount >= Hold) 135{ 136Pcon.PlayerHold(); 137Sp = true; 138} 139} 140else 141{ 142InputCount = 0; 143} 144worldPosCopy = worldPos; 145worldPos = cam.ScreenToWorldPoint(StartPos); 146temp = worldPos -InputStartPos; 147float angle = GetAngle(InputStartPos, worldPos); 148 149if(temp.x <0.0f) 150{ 151temp.x = temp.x * -1; 152} 153if (temp.y < 0.0f) 154{ 155temp.y = temp.y * -1; 156} 157//スキル技を使ってるかどうか 158if (!Sp) 159{ 160//スピード調整 161if (temp.x >= 3) 162{ 163temp.x = 3; 164} 165if (temp.x <= -3) 166{ 167temp.x = 3; 168} 169if (temp.y >= 3) 170{ 171temp.y = 3; 172} 173if (temp.y <= -3) 174{ 175temp.y = -3; 176} 177} 178} 179 180//最初に入力した値と最後に入力した値から方向ベクトルを求めてから角度を算出している 181float GetAngle(Vector2 start, Vector2 target) 182{ 183Vector2 dt = target - start; 184float rad = Mathf.Atan2(dt.y, dt.x); 185float degree = rad * Mathf.Rad2Deg; 186 187return degree; 188} 189}

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

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

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

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

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

fiveHundred

2023/05/21 12:57

> 右画面左画面関係なくスワイプするとキャラクターが移動する。 ここまで出来ているのであれば、そのコードなどを提示するべきだと思いますが、どうですか。 それらが無いということは、(あなたが意図しているかどうかに関わらず)一から作れと言っているようなものです。
Jennifer

2023/05/22 03:42 編集

y_waiwaiさん 感謝です変更しました
y_waiwai

2023/05/22 01:05

コードは、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
fiveHundred

2023/05/22 03:35

まず、そのコードの内容は理解していますか? 単にどこかから拾っただけで、理解していないということはないですよね? もしそうでない場合は、「回答者に理解させてコードを書かせる」ということになり、本来あなたがやるべきことをやらせているという点で丸投げに該当します。 また、コードが見づらい(y_waiwaiさんの通りに修正してください)ので、全て読み切れていませんが、もしタッチ座標を取得できるのであれば、それで右半分か左半分かを最初に判定すればよいです。
Jennifer

2023/05/22 03:59

fiveHundredさん スクリプトは僕が書いているので理解はできています。 僕が気になっていたのは実装方法だったので スクリプトに関しては見る必要がないと思うので雑に放り投げてます。 InputStartPosでポジションが取れているのではてなブログさんのサイトを参考にしつつ実装してみます。 情報感謝です。
guest

回答1

0

提示されているコードとは関係ない実装になるのですが、画面の左半分と右半分を覆うようにUIのPanelを設置してそれぞれで判定をとる方法は試されましたか?

一般的がどうかはわからないのですが、移動と視界の実装を明確に分けることができ、インプット範囲の調整がビジュアルでできるため私はこの実装方法をよく使います。

投稿2023/05/22 12:58

toorai

総合スコア16

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

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

Jennifer

2023/05/22 23:32 編集

なるほどpanelですね。 過去にボタンでやってバグってしまったので無理かなと思ってたのですが panelのやり方はやったこと無かったです。 試してみます!情報感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問