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();で値を表示、結果は問題なし。
そのチュートリアルのURLを記載したほうがよろしいかと思います。
回答2件
あなたの回答
tips
プレビュー