Unityでジャンプを実装したい人
ゲームを作り始めたし、さっそくキャラクターをジャンプさせてみたい!
RigidbodyとかCharacterControllerとかって使った方がいいの?
何が違うの?
こういった疑問に答えます。
本記事の内容
●ジャンプの爆速設定方法
●ジャンプのアルゴリズム解説
●他のコンポーネントでもジャンプを実装できます
この記事を書いている私は12才からフルスクラッチでゲームを作っています。
またコンパイラを専門として情報理工学の博士まで進学、中退をしており、プログラミング言語の文法にも関わる論文を書いていました。
本記事ではコピペで使える実行済みのコードと設定方法を紹介しつつ、コピペを卒業して自力で作るための考え方も説明します。
※実行環境
Unity2021.3.1f1
Windows 10
ジャンプをコピペ実装するコード
using UnityEngine; public class Jump : MonoBehaviour { //ジャンプの速度を設定 private const float _velocity = 5.0f; private Rigidbody _rigidbody; //着地状態を管理 private bool _isGrounded; void Start() { //Rigidbodyコンポーネントを取得 _rigidbody = GetComponent(); //最初は着地していない状態 _isGrounded = false; } void Update() { //着地しているかを判定 if (_isGrounded == true) { //スペースキーが押されているかを判定 if (Input.GetKeyDown(KeyCode.Space) == true) { //ジャンプの方向を上向きのベクトルに設定 Vector3 jump_vector = Vector3.up; //ジャンプの速度を計算 Vector3 jump_velocity = jump_vector * _velocity; //上向きの速度を設定 _rigidbody.velocity = jump_velocity; //地面から離れるので着地状態を書き換え _isGrounded = false; } } } void OnCollisionEnter(Collision other) { //着地を検出したので着地状態を書き換え _isGrounded = true; } }
●_rigidbody
自身のRigidbodyコンポーネントを管理する変数
ジャンプでキャラクターを上向きに動かす時に利用する
●_isGrounded
着地を管理するbool値
ジャンプの爆速設定方法
「Assets」フォルダに「Jump」スクリプトを作る
1.「Assets」フォルダの余白で「右クリック > Create > C# Script」
2.名前を「Jump」に変更
ご自身の環境がある場合は、合わせた場所にスクリプトを作ってください。
「Jump」スクリプトを編集する
1.「Jump」をダブルクリック
2.エディタが立ち上がるので、サンプルコードをコピーペースト
3.「ctrl+s」などで保存
スクリプト作りは実質的なコンポーネントを作りだと思ってください。
その証拠に、MonoBehaviourクラスはComponentクラスを継承しているクラスです。
実験用のオブジェクトを用意する
1.「Hierarchy」ウィンドウの余白で「右クリック > 3D Object > Cube」
2.「Hierarchy」ウィンドウの余白で「右クリック > 3D Object > Plane」
3.各オブジェクトの「Transform」を図のように設定
もちろんオブジェクトをピッタリに配置してもよいです。
必要なコンポーネントをアタッチする
1.「Hierarchy」ウィンドウで「Cube」をクリック
2.「Inspector」ウィンドウ最下部の「Add Component」ボタンをクリック
3.「jump」と入力すると先ほど作った「Jump」が出てくるのでクリック
4.同様に「Rigidbody」をアタッチ
以上で完了です!
スペースキーを押すと「Cube」がジャンプするハズ。
ジャンプのアルゴリズム解説
キャラクターの着地状態を管理する
サンプルコードでは、着地中かそうでないかをbool値で管理しています。
着地している場合はtrue、着地していない場合はfalseです。
ジャンプの開始時は着地しなくなるのでfalseを代入し、地面である「Plance」の当たり判定を検出した際は着地するのでtrueです。
もちろん着地中はジャンプが出来るので、if文で判定をしましょう。
if (_isGrounded == true) { (ジャンプの処理) }
こう書かれれば当たり前に思えるかもしれませんが、日本語がサンプルコードとして翻訳されていることに注目してください。
自分の狙った動きを実現するうえでは言語の知識だけでなく、狙った動きをなるべくムダなくコードにする力も大事です。
「Plane」との当たり判定はCollisionコンポーネントを活用して判定しています。
Collisionは少し設定がややこしく、よく分かっていないとバグらせやすいので気を付けてください。
参考:【コピペでUnity】確実にCollider(コライダー)を動かす実装例
オブジェクトが増えてきた場合は別途、タグなどを使って管理しましょう。
other.gameObject.tag("タグ名")
などで着地したオブジェクトを判別できます。
入力を受け取る
今回はInputクラスのGetKey関数を利用しました。
この関数はどのキーを押しているのかがコードを見ただけで分かりやすいのでオススメです。
他のキーを割り当てたい場合も、基本的にはInputクラスの関数を使えば間違いありません。
GetButtonでゲームでは定番のキーを利用したり、GetMouseButtonなどでマウスでジャンプさせることも出来ます。
参考:【コピペでUnity】これだけで矢印キーの取得がひととおり可能です
上に移動させる
ジャンプとは要するに、キャラクターを上に動かす処理です。
ジャンプをした瞬間は上向きの速度がかかっていることは直感的にも分かるかと思います。
よってRigidbodyインスタンスの変数velocityを使ってスピードを書きかえてあげましょう。
Rigidbodyのアタッチによってキャラクターには重力がかかり、着地もついでに実装できたことになります。
これを利用しない手はありません。
速度の計算はあえて細かく表現しました。
ベクトルの基本は「向き」と「大きさ」なので、速度の「向き」である変数jump_vectorを用意してから「大きさ」である変数_velocityを掛け算しています。
参考:【コピペでUnity】ややこしい実装もVector3の標準機能でサクっと解決!
さらに細かいジャンプの調整はAddForce関数などで可能です。
多少物理の知識が必要になるので、作った動作に違和感がある場合は「速度」や「加速度」などについて色々と調べてみましょう。
参考:【コピペでUnity】Rigidbody(リジッドボディ)の分かりづらいスクリプト制御を攻略
他のコンポーネントでもジャンプを実装できます
おそらく有名なのはCharacter Controllerクラスだと思います。
●move関数…上への移動
このようにジャンプの最低限のアルゴリズムさえ理解していれば、どのコンポーネントを使おうが基本は一緒です。
色々な機能があるコンポーネントは一見便利ですが、こういったアルゴリズムの理解を優先した方が習得する速さは上がると思います。
今回はこんなところです。
Unityはいいぞ。
コメント