本記事の環境
本記事は以下の環境で開発を進めております。
- 開発OS: Windows OS(UnityはMac OSでも同様に開発可能)
- Unity: 4.5.3
- 開発言語: C#
- IDE: Visual Studio 2013 + Tools for Unity(標準のMono Developでも可)
OSについてはWindowsを利用しますが、Macでも同様に開発可能です。IDEにVisual Studioを利用しますが、標準のMonoDevelopでもコードは変わりません。
サンプルプログラムは本記事開始時(第3回終了直後)のプロジェクトが「project_004_start.zip」、終了時点のプロジェクトが「project_004_end.zip」です。
記事開始時点の状態にする
本記事の開始時点の状態から開発を開始する方法を紹介します。
project_004_start.zipのダウンロード
project_004_start.zip(プロジェクト初期)をダウンロード。任意のディレクトリに解凍します。
プロジェクトを開く
Unityを起動して上部メニューの「File」-「Open Project...」をクリックします。展開したファイルのproject\actionGameフォルダを開いた状態で「フォルダーの選択」をクリックします。
以上で本記事開始時の状態のプロジェクトが開かれます。
今回作成するサンプルを実行する
今回作成する内容を実行すると、以下のようになります。コードを書き始める前にゴールを確認しておくと理解しやすくなると思います。
- 今回作成するものを確認する(Unity Playerプラグインを許可する必要があります)
キャラクターをジャンプさせる
まずは、シンプルにキャラクターに上向きの力を加えて上昇させてみます。
ジャンプキーの取得
今回はスペースキーでキャラクターをジャンプさせることにします。スペースキーが押されたかどうかは、InputクラスのGetKeyDownメソッドで以下のように取得します。
// スペースキーでジャンプ if (Input.GetKeyDown("space")) { // スペースキーが押された際の処理を記述 }
キャラクターをジャンプさせる
キャラクターのジャンプは上向きの力を与えることで実現します。前回キャラクターを左右に動かす場合にrigidbody2D.AddForceメソッドを利用した処理の上方向版です。
// 上方向に力を加える this._charactor.rigidbody2D.AddForce(Vector2.up * 400f);
ジャンプキーの取得と合わせると以下のような処理になります。
// スペースキーでジャンプ if (Input.GetKeyDown("space")) { this._charactor.rigidbody2D.AddForce(Vector2.up * 400f); }
コードを整理してGameManagerクラスの書き換えます。
public class GameManager : MonoBehaviour { private GameObject _charactor; // Use this for initialization void Start () { // キャラクターを取得する this._charactor = GameObject.Find("charactor"); } // Update is called once per frame void Update () { // 左右のキーで左右に移動 float horizontal = Input.GetAxis("Horizontal"); this._moveCharactor(Vector2.right * 10f * horizontal); // スペースキーでジャンプ if (Input.GetKeyDown("space")) { this._moveCharactor(Vector2.up * 400f); } } /// <summary> /// キャラクターを移動させる /// </summary> /// <param name="force">移動させる方向と値</param> private void _moveCharactor(Vector2 force) { this._charactor.rigidbody2D.AddForce(force); } }
これでスペースキーを押すと、キャラクターが上方にジャンプするようになりました。
現時点の問題点
ここまでのコードには問題があります。キャラクターがジャンプ中にスペースキーを押すと、さらにジャンプを行いキャラクターがどんどん上昇して行ってしまいます。そういうゲームもあるでしょうが、今回は「ジャンプ中は再度上昇することはできない」という仕様にしたいと考えています。