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

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

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

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

Q&A

解決済

2回答

2363閲覧

Unity キーボード入力がうまくいかない

jkoman

総合スコア17

Unity

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

0グッド

0クリップ

投稿2019/06/16 07:47

編集2019/06/16 08:17

Unityの公式のチュートリアル、ローグライクをやっているのですがキーボード入力の挙動が思った通りにならないです。
問題点
1.プレイヤーの初期座標は(0,0,0)だがキーボードの矢印キーを長押しすると(1.6775..,0,0)のようにきれいに1進まない
2.一瞬キーボードを押しただけでは反応しない
3.たまに動かなくなる
チュートリアル

プレイヤーコントローラーの一部

void Update() { if (!GameManager.instance.playersTurn) return; int horizontal = 0; int vertical = 0; horizontal = (int)Input.GetAxis("Horizontal"); vertical = (int)Input.GetAxis("Vertical"); if (horizontal != 0) { vertical = 0; } if (horizontal != 0 || vertical != 0) { AttemptMove<Wall>(horizontal, vertical); } }

MovingObject

public abstract class MovingObject : MonoBehaviour { public float moveTime = 0.1f; public LayerMask blockingLayer; private Rigidbody2D rb2d; private BoxCollider2D boxCollider; private float inverseMoveTime; // virtual 継承先でオーバーライドできる protected virtual void Start() { rb2d = GetComponent<Rigidbody2D>(); boxCollider = GetComponent<BoxCollider2D>(); inverseMoveTime = 1f / moveTime; } //移動可能か確認するメソッド protected bool Move(int xDir,int yDir,out RaycastHit2D hit) { Vector2 start = transform.position; Vector2 end = start + new Vector2(xDir, yDir); //自身のColliderを無効にし、Linecastで自分自身を判定しないようにする boxCollider.enabled = false; //現在地と目的地との間にblockingLayerのついたオブジェクトが無いか判定 hit = Physics2D.Linecast(start, end, blockingLayer); boxCollider.enabled = true; if(hit.transform == null) { StartCoroutine(SmoothMovement(end)); return true; } return false; } //目的地(end)に移動するためのメソッド //IEnumeratorはコルーチンのインターフェースという意味 //実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数 protected IEnumerator SmoothMovement(Vector3 end) { //sqrMagnitude ベクトルの二乗をかえす float sqrRemainingDistance = (transform.position - end).sqrMagnitude; //Epsilon ほとんど0に近い値 while(sqrRemainingDistance > float.Epsilon) { Vector3 newPosition = Vector3.MoveTowards(rb2d.position, end, inverseMoveTime * Time.deltaTime); rb2d.MovePosition(newPosition); sqrRemainingDistance = (transform.position - end).sqrMagnitude; //ココで処理を中断する yield return null; } } //<T>:ジェネリック機能 型を決めておかず、後から指定する protected virtual void AttemptMove<T>(int xDir, int yDir) //型をComponentに限定 where T : Component { RaycastHit2D hit ; bool canMove = Move(xDir, yDir,out hit); if(hit.transform == null) { return; } //障害物があった場合、障害物を型引数の型で取得 //型が<T>で指定したものと違う場合、取得できない T hitComponent = hit.transform.GetComponent<T>(); //障害物がある場合移動できない if (!canMove && hitComponent != null) { OnCantMove(hitComponent); } } //障害物があり移動ができなかった場合に呼び出される protected abstract void OnCantMove<T>(T component) where T : Component; }

試したこと
horizontal = (int)Input.GetAxis("Horizontal");
vertical = (int)Input.GetAxis("Vertical");
の値が-1,0,1以外の数とっているのかを確認するためDebug.Log();で値を表示、結果は問題なし。

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

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

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

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

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

fiveHundred

2019/06/16 08:09

そのチュートリアルのURLを記載したほうがよろしいかと思います。
guest

回答2

0

自己解決

Input.GetAxisの部分がわからない原因でInput.GetAxisRawでなおりました。

投稿2019/06/16 09:18

jkoman

総合スコア17

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

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

0

実際に試した訳ではないので、正しいかどうか分かりませんが…

SmoothMovement によって動いている途中に Move メソッドが呼ばれる可能性があるのが原因ではないでしょうか。
Move メソッドの中は次のようになっているので、

Vector2 start = transform.position; Vector2 end = start + new Vector2(xDir, yDir);

動いている途中に Move メソッドが呼ばれると、transform.position は整数でない値なので、end も整数でない値になるはずです。

なので、一番簡単な解決策としては、下のように追加するのが楽だと思います

Vector2 start = transform.position; Vector2 end = start + new Vector2(xDir, yDir); end.x = Mathf.round(end.x); end.y = Mathf.round(end.y);

投稿2019/06/16 08:52

maai

総合スコア463

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

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

jkoman

2019/06/16 09:17

回答ありがとうございました。参考にします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問