actionScript書きの日記

アラフォーFlashデベロッパのブログ。actionscriptやobjective-cを経て、現在はUnity、Spine、AfterEffectsがメイン。

Unityちゃん (2D)を使用して、2Dゲームを作ってみる その3 ユーザー入力の受付

前回までで画像の設定とアニメーションの作成方法を一通り見たので、そのようにして作成したGameObjectを、ユーザーからの入力に応じて動かしてみることにする。

今回はPCでの入力を主に見ていくが、スマートホンなどのケースも少しずつ触れていくことにする。

■PCでの入力受付

PCでの入力というと、メインとなるのは

  • キー入力
  • マウス入力
  • の二つとなるだろう。これらをそれぞれ見ていくこととする。

    キー入力

    キー入力の場合、やり方が複数ある。順を追って見ていくことにする。

    Input.GetKey, GetKeyDown , GetKeyUp

    指定したキーが該当する状態にあるかどうかを確認するための関数。戻り値はBooleanか?

    名前状態
    Input.GetKeyキーを押している間は常にtrue
    Input.GetKeyDownキーが押されていない状態から押した際にtrue
    InputGetKeyUpキーを押している状態から離した際にtrue

    これらのメソッドを用いて、キーの状態を取得することになる。 具体的に見てみよう。

    クラス「InputManager.cs」を作成し、前回生成したキャラクターのGameObjectにアタッチする。 クラス内の関数「update」内に、キー入力を受け付けるための処理を記述していく。

    void Update () {
    	if (Input.GetKey (KeyCode.RightArrow)) {
    	Debug.Log ("右矢印が押された");
    	}
    }
    

    右矢印キーが押されている間ずっと反応させたい場合、上記のような形になる。 この形で矢印キーによるキャラの移動を実装してみる。

    
    float horizonalSpeed;
    float horizonalMaxSpeed = 6.0f;
    int horizonalDir;
    Rigidbody2D rb2d;
    
    const int DIR_RIGHT = 1;
    const int DIR_LEFT = -1;
    const int DIR_NONE = 0;
    const int DIR_TOP = 1;
    const int DIR_BOTTOM = -1;
    
    const string MOVE_TYPE_HORIZONAL = "horizonal";
    const string MOVE_TYPE_VERTICAL = "vartical";
    
    
    // Update is called once per frame
    void Update ()
    {
    	if (Input.GetKeyDown (KeyCode.RightArrow)) {
    		horizonalDir = DIR_RIGHT;
    	}
    	if (Input.GetKeyDown (KeyCode.LeftArrow)) {
    		horizonalDir = DIR_LEFT;
    	}
    	//キーを離した際の処理。
    	if (Input.GetKeyUp (KeyCode.RightArrow)) {
    		if (!Input.GetKey (KeyCode.LeftArrow)) {
    		stop(MOVE_TYPE_HORIZONAL);
    		}
    	}
    	else if (Input.GetKeyUp (KeyCode.LeftArrow)) {
    		if (!Input.GetKey (KeyCode.RightArrow)) {
    		stop(MOVE_TYPE_HORIZONAL);
    		}
    	}
    	move (horizonalDir, jumpFlg);
    }
    
    /// 
    /// 移動停止処理
    /// 
    /// Type.
    void stop(string type)
    {
    	if (type == MOVE_TYPE_HORIZONAL) {
    		horizonalDir = DIR_NONE;
    		horizonalSpeed = 0.0f;
    	}
    }
    		
    
    /// 
    /// キャラを移動させる関数。
    /// 
    /// Dir.
    void move (int dir, bool jumpFlg)
    {
    	horizonalSpeed += accelSpeed * dir;
    	if (horizonalSpeed > horizonalMaxSpeed) {
    		horizonalSpeed = horizonalMaxSpeed;
    	} else if (horizonalSpeed < -horizonalMaxSpeed) {
    		horizonalSpeed = -horizonalMaxSpeed;
    	}
    	rb2d.velocity = new Vector2 (horizonalSpeed, 0);
    }
    

    これでキャラを矢印キーで左右に動かすことが可能になる。

    Unityちゃんのサンプル内では、ちょっと違った処理を行っている。次回はその処理を解析する。