見出し画像

ゲーム作成初心者が【unity】でゲームを作りたい #6【CharacterControllerを使ったジャンプ】

初め

今回は【CharacterController】を使ったジャンプですね。
参考URLは↓

【CharacterController】

では、やっていきます。
ファイル名は【jump2】にして、動かす【Cube】に【CharacterController】コンポーネントを入れておきましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class jump2 : MonoBehaviour
{
   public float JumpPower = 10;

   private Vector3 moveDirection = Vector3.zero;

   CharacterController controller;

   void Start()
   {
       controller = GetComponent<CharacterController>();
   }

   void Update()
   {
       if (controller.isGrounded)
       {
           if (Input.GetKeyDown(KeyCode.Space))
           {
               moveDirection.y = JumpPower;
           }
       }

       moveDirection.y -= gravity * Time.deltaTime;
       controller.Move(moveDirection * Time.deltaTime);
   }
}

コードはこれですね。

このコードは前の記事でやった【move6】を少し変えただけなので、詳しくは【#3】へ。

public float JumpPower = 10;

ジャンプ量の指定をする【JumpPower】関数を作成する。

if (Input.GetKeyDown(KeyCode.Space))
{
    moveDirection.y = JumpPower;
}

新しいのはこれですね。

上の【if】は『スペースキーが押された「瞬間」』ですね。

そしてその中【moveDirection.y = JumpPower】は
【moveDirection】の中の【Y】の値に【JumpPower】関数の数字を入れるになります。
※ただこれだけだと【Vector3関数 moveDirection】に数字を入れただけなので。最後の

controller.Move(moveDirection * Time.deltaTime);

このコードで動かしてしています。
(【controller】に【moveDirection】と時間をかけた値を入れる、でしたね)

ではコードが出来たので動かしてみましょう。

画像1

ちゃんとスペースを押すと【Cube】がジャンプしますね。

+移動

このままでは移動ができないので、移動できるようにしましょう。

if (controller.isGrounded)
{
    moveDirection = new Vector3(Input.GetAxis("Horizontal"), //書き足し
                                0, 
                                Input.GetAxis("Vertical"));
    moveDirection = transform.TransformDirection(moveDirection);//書き足し
    moveDirection *= speed;//書き足し
    
    if (Input.GetKeyDown(KeyCode.Space))
    {
        moveDirection.y = JumpPower;
    }
}

【if (controller.isGrounded)】の中に前の記事で作った【move6】のコードの一部をコピーして貼り付けました。(書き足しと書いてあるところを書き足しました)

ではこのプログラムを保存して動かしてみましょう。

画像2

うーん。一応を移動が出来てジャンプもできてはいますがちょっと挙動がおかしいですね。

ジャンプ中に移動入力ができない。
なので少し変えましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class jump2 : MonoBehaviour
{
   public float speed = 3.0f;
   public float gravity = 9.81f;

   public float JumpPower = 10;

   private Vector3 moveDirection = Vector3.zero;

   CharacterController controller;

   float y;
   float x;
   float z;

   void Start()
   {
       controller = GetComponent<CharacterController>();
   }

   void Update()
   {
       x = Input.GetAxis("Horizontal");
       z = Input.GetAxis("Vertical");

       if (controller.isGrounded)
       {
           moveDirection.z = z * speed;
           moveDirection.x = x * speed;
           moveDirection = transform.TransformDirection(moveDirection);

           if (Input.GetKeyDown(KeyCode.Space))
           {
               y = JumpPower;
               moveDirection.y = y;
           }
       }

       if (!controller.isGrounded)
       {
           moveDirection.z = z * speed;
           moveDirection.x = x * speed;
           moveDirection = transform.TransformDirection(moveDirection);
       }

       moveDirection.y -= gravity * Time.deltaTime;
       controller.Move(moveDirection * Time.deltaTime);
   }
}

と、いうことで結構変えて複雑になりました。
(正直もっと簡単にしたいのですが、思いつく限り簡単なコードを書こうとすると全然動かないのでこうなりました)

ではどう変わったか、みていきましょう。

float y;
float x;
float z;

まず、それぞれの値を「保持」するための関数作成です。

x = Input.GetAxis("Horizontal");
z = Input.GetAxis("Vertical");

これで、左右の値を【x】関数に
上下の値を【z】関数に入れます。

if (controller.isGrounded)
{
    moveDirection.z = z * speed;
    moveDirection.x = x * speed;
    moveDirection = transform.TransformDirection(moveDirection);

【if (controller.isGrounded)】の中にこのコード入れます。

    moveDirection = new Vector3(Input.GetAxis("Horizontal"), //書き足し
                                0, 
                                Input.GetAxis("Vertical"));

前のこれではコードが読まれる際【Y】の値が『0』で固定化されてしまいいろいろなところに置くとジャンプすら出来なくなってしましいます。
なので、Yの値を書かないことで可変をさせています。(もっといいやり方を教えてください

それで上のように、【x】【z】それぞれ入力された値を入れ込んだプログラムにしている訳です。

if (!controller.isGrounded)
{
    moveDirection.z = z * speed;
    moveDirection.x = x * speed;
    moveDirection = transform.TransformDirection(moveDirection);
}

で、これですね。これ【if】の()内に【!】がありますよね。
【!】『不均等記号』と呼ばれていて、『一致していなかったら』という意味だそうです。
なので【if】の意味は『地面についていなかったら』という意味になります。
これを使って空中の動きを管理します。
このコードでは空中にいるときも、地面と同じ速度で移動をします。
ですが、

moveDirection.z = z * speed /2;
moveDirection.x = x * speed /2;

このようにすれば、空中にいる間の移動量は、地面での移動の半分になります。これで空中の移動速度の制限をすればそれっぽくします。

では、出来たので動かしてみましょう。

画像3

はいどうでしょうか、きれいに動いていると思います。数値を好みの値にしてきれいに動かしてみてください。

【CharacterController】浮く

前の記事で【CharacterController】を使ったとき少し浮いて見えると言いましたが、本当に浮いていたので、その対処方法をお教えします。

画像4

【スキン幅】という欄があると思います。これを

画像5

『0.001』という小さい値にすれば浮かなくなります。

【Horizontal】【Vertical】の格納場所

【Horizontal】【Vertical】がどこを参照しているのか説明します。

画像6

左上の【編集】→【プロジェクト設定】を開くと。

画像7

こういうウィンドウが出てくると思います。
そして左の欄から【入力マネージャー】を選択すると上の通りの画面が出ます。

画像8

【軸】という部分をクリックすると画像の通りの欄が現れます。
その中の【水平】【垂直】が【Horizontal】【Vertical】になります。

画像9

このように【水平】をクリックすると名前が【Horizontal】となっていますよね。この名前がプログラムで書き込まれるとこの中身が参照されます。
この中では、負方向(-1)ボタンに【left】、正方向(1)に【right】となっています。【Horizontal】をプログラムに入れ込むと、左キーを押せば『-1』を右キーを押せば『1』を出力されます。
そして、(副)書いてありますが機能は同じなので。
【a】が押されたら『-1』、【d】が押されたら『1』を出力します。

垂直も同じです。

この【入力マネージャー】を使えば自分の思ったキーコンフィグを作れます。
【入力マネージャー】の中の【サイズ】と書いてある欄に、数字が『18』となっていますよね。これが入力マネージャ―の数にです。なので『18』を『19』(増やすと)にすると新し入力マネージャーを作ることができます。

終わり

今回は少し複雑になってしまったプログラムを書きました。
今後はもっと複雑になっていくので私自身、少しでもわかりやすく説明できるようにしていきたいです。
今回の説明は分かりにくかったですか? もしよろしければコメントください。

では、お目通しいただきありがとうございました。




この記事が気に入ったらサポートをしてみませんか?