SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

速習 Unity 2Dゲーム開発

速習 Unity 2Dゲーム開発
~第4回 キャラクターのジャンプ

速習 Unity 2Dゲーム開発 第4回

スクリプトの修正

 CharactorManagerスクリプトを以下のように修正します。

キャラクターがジャンプ中かを判定する
public class CharactorManager : MonoBehaviour {

    private bool _isJumping;

    public bool isJumping
    {
        get { return _isJumping; }
    }
    

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {

    }

    /// <summary>
    /// 接触した(=着地)
    /// </summary>
    /// <param name="col"></param>
    public void OnCollisionEnter2D(Collision2D col)
    {
        this._isJumping = false;
    }

    /// <summary>
    /// 接触状態から離れた(=ジャンプ開始)
    /// </summary>
    /// <param name="col"></param>
    public void OnCollisionExit2D(Collision2D col)
    {
        this._isJumping = true;
    }
}

 OnCollisionEnter2DとOnCollisionExit2Dという2つのメソッドが新しい要素として登場しました。

 OnCollisionEnter2Dは、GameObject(今回の場合charactor)が別のGameObjectと接触した際に呼び出されます。OnCollisionExit2Dは、逆にキャラクターが離れた場合に呼び出されます。

 別のGameObjectと接触した際(OnCollisionEnter2D)に床の上にいると判定し、_isJumpingプロパティをfalseに設定します。GameObjectから離れた際にジャンプ中と判断して_isJumpingをtrueに設定します。

GameManager側の修正

 続いてGameManagerスクリプト側を以下のように修正します。

GameManagerでCharactorManagerを参照する
public class GameManager : MonoBehaviour {

    private GameObject _charactor;
    private CharactorManager _charactorScript;

    // Use this for initialization
    void Start () {
        // キャラクターを取得する
        this._charactor = GameObject.Find("charactor");

        // キャラクターのスクリプトを取得する
        this._charactorScript = this._charactor.GetComponent<CharactorManager>();
    }
    
    // Update is called once per frame
    void Update () {
        Debug.Log(this._charactorScript.isJumping);

        // 左右のキーで左右に移動
        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);
    }
}

 キャラクターに関連づけたスクリプト(CharactorManager)はGetComponent<CharactorManager>();という呼び出しによってGameObjectから取得できます。

 今回は値の確認にDebug.Logメソッドを利用しています。Debug.Logメソッドを利用すると、以下の画像のようにConsoleウィンドウに値を出力することができます。

コンソールで値の確認を行う
コンソールで値の確認を行う

 最後に、ジャンプ時にはスペースキーを押しても上昇する力を加えないように、GameManagerスクリプトのUpdateメソッドを以下のように書き換えます。

ジャンプ中はスペースキーを無効に
void Update () {

    // 左右のキーで左右に移動
    float horizontal = Input.GetAxis("Horizontal");

    this._moveCharactor(Vector2.right * 10f * horizontal);

    // スペースキーでジャンプ
    // ジャンプ中はスペースキーが押されてもさらに上昇しない
    if (Input.GetKeyDown("space") && this._charactorScript.isJumping == false)
    {
        this._moveCharactor(Vector2.up * 400f);
    }
}

 これでキャラクターが思った通りにジャンプを行うようになりました。

まとめ

 今回はキャラクターがキー入力を取得する方法と、ジャンプの判定、コンソールへのデバッグ出力の方法を紹介しました。

 これで基本的なキャラクターの移動処理は実装できましたが、移動しても向きが変わらなかったり、ジャンプ中もキャラクターが同じ画像のままです。次回はキャラクターを動きに合わせてアニメーションさせる方法を紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
速習 Unity 2Dゲーム開発連載記事一覧

もっと読む

この記事の著者

西村 誠(ニシムラ マコト)

 Microsoft MVP Windows Platform Development。 Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。 ブログ:眠るシーラカンスと水底のプログラマー 著書:基礎から学ぶ Windowsストアアプリ開発

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8029 2014/11/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー