112
0
0

第4回 - 主人公の基本操作を実装しよう【Unity講座2022】

Published at July 11, 2022 10:35 a.m.
Edited at April 19, 2023 2:19 p.m.

主人公の基本操作を実装しよう

今回の目標

  • 主人公の横移動、ジャンプを実装する!
  • 実装方法を少し考えてみる!!
  • 1. 準備

    いよいよ主人公の操作の実装をしていくわけですが、まずは準備が必要です。

    1-1. 主人公の配置

    1. Projectウィンドウ上でAssets/Assets FTTGR/Sprites/Characters/Heroに移動する。
    2. その中にあるHeroというファイルの横の三角形▼をクリックする。
    3. HeroIdle1というファイルを見つけたらSceneウィンドウにHeroIdle1をドラッグ&ドロップ。
    4. 主人公が画面に映るようになりました。名前を「Player」とでもつけておきます。
      スクリーンショット (56)[

    1-2. 主人公に当たり判定を付ける

    1. PlayerのInspectorから「Add Component」ボタンを押す。
    2. Physics 2Dをクリックし、Capusule Collider 2Dを探してクリック。

    1-3. 主人公に重力を付ける

    1. PlayerのInspectorから「Add Component」ボタンを押す。
    2. Physics 2Dをクリックし、RigidBody 2Dを探してクリック。

    1-4. 主人公を操作するコードを書くファイルの作成

    1. Projectウィンドウ上でAssets/Scriptsに移動する。
    2. Projectウィンドウ上で右クリックをし、Create→C# Scriptをクリック
    3. C# Scriptファイル名は「PlayerMove」とします。

    2. 操作の実装をする

    操作の実装をするのですが、どのように書けば良いかを考える練習をするためにコードを全ては書いていません。完成したコードはGitHubにあげておきます(?)。また、ここに書いてあるコードはひとつの例であり、横移動やジャンプの実装方法はいくつもあることを覚えておいてください。

    2-1. 主人公を横移動させる

    右に移動するコードを記載します。

    PlayerMove.cs
    
        private float speed = 0.05f;
    
        void Update()
        {
            Vector2 position = transform.position;
    
             //dキーを入力押している間、右に移動する処理
            if (Input.GetKey("d"))
            {
                position.x += speed;
            }
    
            transform.position = position;
        }
    

    ヒント1:

    transform.positionはオブジェクトの位置・回転・大きさを管理しています。

    ヒント2:

    つまりposition.xはオブジェクトのxを管理しています。

    ヒント3:

    右に進むときはオブジェクトのx座標をプラス+しています

    実装できたら一度動かしてみましょう

    2-2. 主人公をジャンプさせる

    主人公をジャンプさせるコードを記載します。

    PlayerMove.cs
        public float jumpPower = 200f;
    
        private Rigidbody2D rb;
    
        void Start()
        {
            rb = GetComponent<Rigidbody2D>();
        }
    
        void Update()
        {
            //Spaceキーを入力押したらジャンプする処理
            if (Input.GetKeyDown(KeyCode.Space) )
            {
                rb.velocity = Vector2.up * jumpPower;
            }
        }
    

    実装できたら一度動かしてみましょう
    おそらく、動かすと倒れてしまうと思います。
    Playerを選択した状態でRigidbody 2D→Constrainst▼をクリックすると出てくるFreeze RotationをチェックするとZ軸での回転をしなくなります。これにより、Playerは倒れなくなりました。

    スクリーンショット (57)

    このコードを書くと、確かにジャンプさせることは出来るのですが、無限にジャンプできてしまうので、今回のゲームにはあまり適していません。では、どうすれば良いのか少し考えてみましょう。
    ・
    ・
    ・

    地面にいるときだけジャンプ出来るようにすれば良いですね。

    UnityにはTagという機能があります。
    ここで、第3回のときに作成したフィールドに「Ground」というTagを付けていきましょう。

    1. Tilemapを選択した状態でTag[Undefined]→Add Tagをクリック。
    2. ▼Tagsにある「+」をクリックする。
    3. 「Ground」と入力する。
    4. Tilemapに「Ground」Tagが付いていることを確認する。

    スクリーンショット (58)

    スクリーンショット (60)

    これで第3回のときに作成したフィールドに「Ground」というTagが付きました。
    ここからは地面にいるかどうかを判定するコードを書いてもらおうと思います。難しいかもしれませんが、ヒントを見ながら考えてみて下さい。

    ヒント1:

    以下のコードで「Ground」が付けられたオブジェクトとの衝突判定が出来るようになります。

    T
    PlayerMove.cs
        void OnCollisionEnter2D(Collision2D col)
        {
            if(col.gameObject.CompareTag("Ground"))
            {
                //処理
            }
        }
    

    ヒント2:

    bool型の変数を使う(bool型の命名規則を覚えてたらそれに倣って変数名を決めてみて下さい)

    ヒント3:

    地面にいるときをTrue、いない時をFalseとする。

    ヒント4:

    ジャンプ処理の条件を Spaceキーを押したとき&&bool変数がfalseのとき にする。

    2-3. 着地判定の別の方法

    着地判定の方法は他にもありますが、少し難しいため今回は簡単に説明します。
    2-2では、主人公がフィールドに触れたら着地という処理にしていますが、この方法だと横から触れても頭から触れても着地したとなっています。そこで、足の部分に新しく着地判定用の当たり判定を付けるという方法があります。

    こちらで分かりやすく説明されています。

    3. おまけ

    このコードちゃんと動いているのか?と思うときはありませんか?これを使えばそのコードがどこまで正常に動いているか判断しやすくなります。

    omake.cs
                 Debug.Log("hogehoge");
    

    このコードを使うと処理をしたときにUnityのコンソールに"hogehoge"と表示されます。以下は一例です。

    omake.cs
        void Update()
        {
            Vector2 position = transform.position;
    
             //dキーを入力押している間、右に移動する処理
            if (Input.GetKey("d"))
            {
                //dキーが押されるとコンソールに"dキーが押されています"と表示されます。
                 Debug.Log("dキーが押されています");
    
                position.x += speed;
            }
    
            transform.position = position;
        }
    

    これは最初の方に書くべきだったかもしれません。

    4. まとめ

    今回は主人公の基本操作を実装しました。いきなりコードを考えてもらってしまったので難しいと感じた人もいるかもしれませんが、次回以降も頑張りましょう。きっと慣れます。

    次→
    第5回 - 敵を実装しよう【Unity講座2022】
    https://inct-densan.kibe.la/shared/entries/bf95cf27-35ef-4b28-b46e-5c15cfe50146

    5. 参考文献

    【初心者Unity】Transformのスクリプト操作まとめ(移動、回転、スケール) | TECH PROjin
    https://tech.pjin.jp/blog/2021/12/23/unity-script-transform/

    【Unity C#】キャラクターをジャンプさせるしくみ
    https://futabazemi.net/notes/unity-jump_rigidbody/