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


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#contents
*はじめに [#caf03486]
&size(18){[[ステージを作る]]};の続きです。
#br
これまでに羊をキー入力で操作できるようにして、ステージまで制作しました。
しかし今のままでは、ひつじの動きとステージがあっていませんね。
そのでこのページでは、ゲームに合わせたひつじの動きの完成版を作りましょう。
#br
*本格的にひつじを動かそう [#pb64733a]

**ステップ2:少しずつ動かしてみよう [#q3f2dde7]
#br
これだと、一瞬での移動になってしまいます。
ということで次は、少しずつ移動できるように改良してみましょう。
#br
#geshi(csharp,number){{

    // Start is called before the first frame update
    void Start()
    { 
//全部消す
    }

    // Update is called once per frame
    void Update()
    { 
        //ここから書いていく
        Vector2 pos = this.transform.position;

        pos.x += 0.01f;
        pos.y += 0.01f;

        this.transform.position = pos;
    }
}
}}
#br
次は、一旦「void Start()」の中身を消して、「void Update()」の中身を上のように変えてください。
#br
「void Update()」はそのオブジェクトがゲームに出現してから毎フレーム呼び出されるメゾットです。
フレームとは、アニメーションのコマ割り、パラパラ漫画のようなもので、画像の切り替わりの間隔のことです。
先ほどと同様、ひつじは最初からいますので、ゲームが開始したら毎フレームで「void Update()」の中身が実行されます。
中身についてみていくと、1行目と4行目はさっきと同じですね。
変わったのは2、3行目で、「現在の変数のxy座標にそれぞれ0.01足す」というものです。
ちなみに、数値の後にある"f"は数値がfloat型(少数の型)であることを識別するためにつけています。
#br
まとめると、「ゲームが開始してから毎フレームごとに、xy座標がそれぞれ0.01ずつ増えていく」となります。
#br
実際動かしてみると、少しずつ右上に移動するようになるかと思います。
#br
**ステップ3:スピード調節をしよう [#r264312f]
#br
今は、ひつじのスピードの係数は0.01固定ですね。
次は、スピードをインスペクターから自由に調節できるように改良してみましょう。
#br
#geshi(csharp,number){{

    //ここに書き加える
    public float speed = 0.01f;

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    { 
        Vector3 pos = this.transform.position;

        pos.x += speed; //0.01f -> speed
        pos.y += speed; //0.01f -> speed

        this.transform.position = pos;
    }
}
}}
#br
「void Start()」の上と、「void Update()」の中身をこのように変えます。
#br
3行目では、float型(小数を扱う型)として"speed"という名前の変数を定義します。
変数は、データを保存しておく入れ物のようなものです。
今回は予め0.01fを初期値として入れておきます。
ところで、前にある"public"は、そこで定義UnityEditerのインスペクターからspeedの値を変更できるようになる合言葉のようなものです。覚えておいてください。
#br
14,15行目では、数値を変数に置き換えています。
こうすることで、これまでは0.01で固定だったものがspeedに入れる数値を変えることで変えられるようになりました。
#br
実際にひつじのインスペクターからspeedの数値を変えて、ゲームを開始してみましょう。
ひつじのスピードは変わったでしょうか。
#br
**ステップ4:キー入力で操作できるようにしよう [#s2a580b5]
#br
今のままでは、ずっと同じ方向に行くばかりです。
そこで、次はひつじをキー入力で操作できるようにします。
#br
#geshi(csharp,number){{

    // Update is called once per frame
    void Update()
    { 
        Vector2 pos = this.transform.position;

        //pos.x += speed; //0.01f -> speed->消す
        //pos.y += speed; //0.01f -> speed->消す

        //ここから編集
        if (Input.GetKey(KeyCode.D)) 
        {
            pos.x += speed;
        }

        if (Input.GetKey(KeyCode.A))
        {
            pos.x -= speed;
        }

        this.transform.position = pos;
    }
}
}}
#br
これまでは、Update文が呼び出されるたびに無条件で"pos"を増加させてきましたが、
今回は「特定のキーが入力されたら」という条件が満たされていれば"pos"を変化させる、という風に命令の実行に条件を設けたいわけです。
そこで使われるのがif文になります。
if文の書き方は、
#geshi(csharp,number){{
if (条件文) 
{
命令文
}
}}
と、なっていて、
条件文が満たされていれば(条件文の返り値が"true"であれば){}の中の命令文が実行され、
条件文が満たされていなければ(条件文の返り値が"false"であれば){}の中の命令文がは無視されるようになっています。
#br
今回の例を見ていくと、
"Input.GetKey (KeyCode.D)"というのが、Dキーが入力されれば"true"、されていなければ"false"が返されるため、
Dキーを押していると、"pos"のx座標が"speed"の大きさ分増えるようになり、
"Input.GetKey (KeyCode.A)"というのが、Aキーが入力されれば"true"、されていなければ"false"が返されるため、
Aキーを押していると、"pos"のx座標が"speed"の大きさ分減るようになります。
何もキーを押していないと、どちらのif文の条件式も満たされないので、"pos"の値は変化しないことになります。
#br
これを実行してみると、
ひつじはDキーを押している間は右に、Aキーを押している間は左に移動して、何も押していないと動かないようになったはずです。
("speed"が正の数の時。負の数の時は左右逆に。インスペクターから正の数に直そう!)