ひつじを動かそう その2 のバックアップ(No.1)


はじめに

ステージを作るの続きです。

 

これまでに羊をキー入力で操作できるようにして、ステージまで制作しました。
しかし今のままでは、ひつじの動きとステージがあっていませんね。
そのでこのページでは、ゲームに合わせたひつじの動きの完成版を作りましょう。

 

本格的にひつじを動かそう

ステップ2:少しずつ動かしてみよう

 

これだと、一瞬での移動になってしまいます。
ということで次は、少しずつ移動できるように改良してみましょう。

 
  1. // 省略
  2.     private Rigidbody2D rigidbody = null; // 変数の定義
  3.  
  4.     public int speed = 0.01f;
  5.  
  6.     // Start is called before the first frame update
  7.     void Start()
  8.     {
  9.         rigidbody = this.GetComponent<Rigidbody2D>(); // 「Rigidbody2D」コンポーネントの取得
  10.     }
  11.  
  12.     // Update is called once per frame
  13.     void Update()
  14.     { 
  15.         Vector2 pos = rigidbody.position; // 「This.transform」から「rigidbody」に
  16.  
  17.         if (Input.GetKey(KeyCode.D)) 
  18.         {
  19.             pos.x += speed;
  20.         }
  21.  
  22.         if (Input.GetKey(KeyCode.A))
  23.         {
  24.             pos.x -= speed;
  25.         }
  26.  
  27.         rigidbody.position = pos; // 「This.transform」から「rigidbody」に
  28.     }
  29. }
 

次は、一旦「void Start()」の中身を消して、「void Update()」の中身を上のように変えてください。

 

「void Update()」はそのオブジェクトがゲームに出現してから毎フレーム呼び出されるメゾットです。
フレームとは、アニメーションのコマ割り、パラパラ漫画のようなもので、画像の切り替わりの間隔のことです。
先ほどと同様、ひつじは最初からいますので、ゲームが開始したら毎フレームで「void Update()」の中身が実行されます。
中身についてみていくと、1行目と4行目はさっきと同じですね。
変わったのは2、3行目で、「現在の変数のxy座標にそれぞれ0.01足す」というものです。
ちなみに、数値の後にある"f"は数値がfloat型(少数の型)であることを識別するためにつけています。

 

まとめると、「ゲームが開始してから毎フレームごとに、xy座標がそれぞれ0.01ずつ増えていく」となります。

 

実際動かしてみると、少しずつ右上に移動するようになるかと思います。

 

ステップ3:スピード調節をしよう

 

今は、ひつじのスピードの係数は0.01固定ですね。
次は、スピードをインスペクターから自由に調節できるように改良してみましょう。

 
  1. // 省略
  2.     //Update関数の中
  3.  
  4.         if (Input.GetKey(KeyCode.D)) 
  5.         {
  6.             pos.x += speed * Time.deltaTime; //「* Time.deltaTime」を追加
  7.         }
  8.  
  9.         if (Input.GetKey(KeyCode.A))
  10.         {
  11.             pos.x -= speed * Time.deltaTime; //「* Time.deltaTime」を追加
  12.         }
  13. // 省略
 

「void Start()」の上と、「void Update()」の中身をこのように変えます。

 

3行目では、float型(小数を扱う型)として"speed"という名前の変数を定義します。
変数は、データを保存しておく入れ物のようなものです。
今回は予め0.01fを初期値として入れておきます。
ところで、前にある"public"は、そこで定義UnityEditerのインスペクターからspeedの値を変更できるようになる合言葉のようなものです。覚えておいてください。

 

14,15行目では、数値を変数に置き換えています。
こうすることで、これまでは0.01で固定だったものがspeedに入れる数値を変えることで変えられるようになりました。

 

実際にひつじのインスペクターからspeedの数値を変えて、ゲームを開始してみましょう。
ひつじのスピードは変わったでしょうか。

 

ステップ4:キー入力で操作できるようにしよう

 

今のままでは、ずっと同じ方向に行くばかりです。
そこで、次はひつじをキー入力で操作できるようにします。

 
  1. // 省略
  2.     private Rigidbody2D rigidbody = null;
  3.     private SpriteRenderer spriteRenderer = null; // 変数の定義
  4.  
  5.     public float speed = 0.01f;
  6.  
  7.     // Start is called before the first frame update
  8.     void Start()
  9.     {
  10.         rigidbody = this.GetComponent<Rigidbody2D>();
  11.         spriteRenderer = this.GetComponent<SpriteRenderer>(); //  SpriteRenderer コンポーネントの取得
  12.     }
  13.  
  14.     // Update is called once per frame
  15.     void Update()
  16.     { 
  17.         Vector2 pos = rigidbody.position; 
  18.  
  19.         if (Input.GetKey(KeyCode.D)) 
  20.         {
  21.             pos.x += speed * Time.deltaTime; 
  22.             spriteRenderer.flipX = true; // Dキーを押しているとき FlipX は true
  23.         }
  24.  
  25.         if (Input.GetKey(KeyCode.A))
  26.         {
  27.             pos.x -= speed * Time.deltaTime; 
  28.             spriteRenderer.flipX = false; // Aキーを押しているとき FlipX は false
  29.         }
  30. // 省略
 

これまでは、Update文が呼び出されるたびに無条件で"pos"を増加させてきましたが、
今回は「特定のキーが入力されたら」という条件が満たされていれば"pos"を変化させる、という風に命令の実行に条件を設けたいわけです。
そこで使われるのがif文になります。
if文の書き方は、

  1. void Update()
  2.     {
  3. // 省略
  4.         // スペースキーの入力チェック
  5.         if (Input.GetKey(KeyCode.Space)) 
  6.         {
  7.             // ここにジャンプの処理を書く
  8.         }
  9.     }

と、なっていて、
条件文が満たされていれば(条件文の返り値が"true"であれば){}の中の命令文が実行され、
条件文が満たされていなければ(条件文の返り値が"false"であれば){}の中の命令文がは無視されるようになっています。

 

今回の例を見ていくと、
"Input.GetKey (KeyCode.D)"というのが、Dキーが入力されれば"true"、されていなければ"false"が返されるため、
Dキーを押していると、"pos"のx座標が"speed"の大きさ分増えるようになり、
"Input.GetKey (KeyCode.A)"というのが、Aキーが入力されれば"true"、されていなければ"false"が返されるため、
Aキーを押していると、"pos"のx座標が"speed"の大きさ分減るようになります。
何もキーを押していないと、どちらのif文の条件式も満たされないので、"pos"の値は変化しないことになります。

 

これを実行してみると、
ひつじはDキーを押している間は右に、Aキーを押している間は左に移動して、何も押していないと動かないようになったはずです。
("speed"が正の数の時。負の数の時は左右逆に。インスペクターから正の数に直そう!)