課題2: バスケットの移動方法をキーボード入力に変更する

目的: マウスクリックではなく、キーボードの上下左右矢印キーでバスケットを瞬間的に移動できるように変更し、ユーザー入力の処理方法を学ぶ。

背景:

  • ゲームのバスケットは3×3のグリッド上に配置されており、バスケットはグリッドの中心に瞬時に移動します。キーボード入力でも同様の挙動を実現する必要があります。

ステップ:

BasketControllerUpdateメソッドを修正する:

  • マウスクリックによる移動処理を削除し、上下左右矢印キーによる瞬間移動処理を追加します。
  • Input.GetKeyDown を使用して、キーが押された瞬間に移動を行います。

修正後のUpdateメソッドのコード例:

void Update()
{
    float moveDistance = 1.0f; // 移動する距離(1マス)
    Vector3 newPosition = transform.position;

    if(Input.GetKeyDown(KeyCode.LeftArrow))
    {
        newPosition += Vector3.left * moveDistance; // 左に1マス移動
    }
    if(Input.GetKeyDown(KeyCode.RightArrow))
    {
        newPosition += Vector3.right * moveDistance; // 右に1マス移動
    }
    if(Input.GetKeyDown(KeyCode.UpArrow))
    {
        newPosition += Vector3.forward * moveDistance; // 前(上)に1マス移動
    }
    if(Input.GetKeyDown(KeyCode.DownArrow))
    {
        newPosition += Vector3.back * moveDistance; // 後ろ(下)に1マス移動
    }

    // グリッド範囲内に制限(例: x, z が -1, 0, 1 の範囲)
    newPosition.x = Mathf.Clamp(Mathf.Round(newPosition.x), -1.0f, 1.0f);
    newPosition.z = Mathf.Clamp(Mathf.Round(newPosition.z), -1.0f, 1.0f);

    // バスケットの位置を更新
    transform.position = new Vector3(
        Mathf.Round(newPosition.x),
        transform.position.y,
        Mathf.Round(newPosition.z)
    );

    /*
    // 以前のマウス移動処理はここにありますが、削除またはコメントアウトします。
    if(Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit, Mathf.Infinity))
        {
            float x = Mathf.RoundToInt(hit.point.x);
            float z = Mathf.RoundToInt(hit.point.z);
            transform.position = new Vector3(x, 0, z); // バスケットの位置を更新
        }
    }
    */
}

動作確認:

  • Unityエディタ上でプレイモードにし、上下左右矢印キーを押すとバスケットが瞬間的に1マス分移動することを確認する。
  • バスケットがグリッドの中心に整列していることを確認する。
  • グリッドの範囲外に移動しないことを確認する。

学習ポイント:

  • Input.GetKeyDown を用いた瞬間的なユーザー入力の処理方法。
  • グリッド上でのオブジェクトの移動制御。
  • オブジェクトの位置を整数に丸めてグリッド整列を維持する方法。
  • 不要なコードの削除と責任の分離。

Unity

Posted by hidepon