【Unity】2Dゲーム初心者向け 重力 ジャンプ カメラワーク

Unityで作る2D横スクロールゲームのチュートリアル記事のアイキャッチ画像です。プレイヤーキャラクターがジャンプし、カメラが追従している様子が描かれています。
Unity
この記事は約8分で読めます。

おはようございます!

1月28日 火曜日。晴れ🌞
予想気温14/5℃。あっっったかくはない。寒い。。

さあ、いよいよマリオを作っていきますよ!

今日の教材はこちら、

[PR]

[PR]

 

スポンサーリンク

・新しいシーン(chap8)作成

・床を作る
 ・Sprite Renderer描画モードを「Tiled」にして伸ばす
 ・「Box Collider 2D」をアタッチし「自動タイリング」にチェック

・一旦、シーンにももをドラッグ&ドロップ
 ・「Box Collider 2D」「Rigidbody 2D」をアタッチ

・アタッチしたももをAssets配下にドラッグ&ドロップしてプレハブを作成

Unityエディタ上で作成した桃のプレハブのキャプチャ画像です。このプレハブは、2Dゲームのシーンに配置され、ゲームオブジェクトとして扱われます。
桃のプレハブ

・ヒエラルキーウィンドウのももを削除

・ヒエラルキーウィンドウの[Main Camera]を選択
 ・「On Mouse Down Create Prefab」をアタッチ
 ・「New Prefab」に作成したもものプレハブを設定

Unityエディタのインスペクターウィンドウです。C#スクリプト「On Mouse Down Create Prefab」の設定画面を示しており、マウスをクリックした際に生成されるプレハブとして、作成した桃のプレハブが割り当てられています。
プレハブ設定

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。画面をクリックするたびに桃が生成され、重力によって下に落下する様子が示されています。
桃の生成と落下

 

おおー!ももがいっぱい!!

ももーー!!

 

[PR]

 

 

・右向きの女の子の画像をシーンに配置
 ・「Rigidbody 2D」「Capsule Collider 2D」をアタッチ

・ツールパネルの「コライダージオメトリを編集」ボタンより体の範囲を設定
 ※その際、グリッドがオンになってるとうまく調整できないのでオフにすること

Unityエディタで、キャラクターの画像にコライダーを設定している様子を示すGIFアニメーションです。コライダーは、物理演算を行う際にオブジェクトの衝突判定に利用されます。
コライダー設定

 

・さらに「On Key Press Move Gravity」をアタッチ

・床を複製し、宙に浮かせて足場を作る
 ・3つ目の足場に宝箱を配置し、宝箱をタッチするとクリアにする

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。プレイヤーキャラクターを左右キーで移動させ、スペースキーでジャンプさせる操作を行っています。
キャラクタージャンプ

 

<「左右キーで移動、スペースキーでジャンプする(On Key Press Move Gravity)」抜粋>

・ジャンプするキーをプルダウンで選択

public InputKey jumpKey = InputKey.Jump;

 Jump:スペースキー
 Fire1:左Ctrlキー
 Fire2:左Altキー
 Fire3:左Shiftキー
 Submit:スペースキーorEnterキー

 ※👆これらがどこで設定されているのかはわかりません。。。そういうもんなんでしょうな。

 

・横方向の移動量

vx = 0;
vx = Input.GetAxisRaw(“Horizontal”) * speed; //移動量を計算

if (vx != 0)
{
leftFlag = vx < 0; //値がマイナスならフラグを立てる
}
rbody.linearVelocity = new Vector2(vx, rbody.linearVelocity.y); //移動
GetComponent<SpriteRenderer>().flipX = leftFlag; //フラグがTrueなら左右反転

 

・「地面に接しているか」を調べる

isGrounded = Physics2D.Raycast(startRay, Vector2.down, checkDistance);

 

・ジャンプ処理

if (Input.GetButtonDown(jumpKey.ToString()) && isGrounded && !isJumping)
//(ジャンプキーが押され地面に接していてジャンプ中じゃない)場合
{
isJumping = true;
rbody.AddForce(new Vector2(0, jumppower), ForceMode2D.Impulse);
}

rbody.AddForceで上向きの力を加えている

 

[PR]

 

 

・2つ目の床にコンポーネントを追加
 ・「Rigidbody 2D」「Ping Pong Move V」をアタッチ

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。ゲーム内の床が一定時間ごとに上下に動いている様子が示されています。
上下に動く床

 

<「行ったり来たり移動する(垂直)(Ping Pong Move V)」抜粋>

・Kinematicモード

void Start ()
{
// 重力や外力の影響を受けずにスクリプトで移動
rbody = GetComponent<Rigidbody2D>();
rbody.bodyType = RigidbodyType2D.Kinematic;
}

「Kinematicモード」自分は重力・外力の影響を受けずに動くけど、他の物体には物理的に押しのける

 

・一定時間で上下に往復移動

void Update()
{
timer += Time.deltaTime;  //経過時間
if (timer >= moveTime)  //moveTime(定数)を超えたら
{
speed = -speed;  // 方向転換
timer = 0.0f;   //timer初期化
}
transform.Translate(Vector2.up * speed * Time.deltaTime);  //上下移動
}

 

[PR]

 

 

・[Ctrl+D]で床を追加
 ・「Rigidbody 2D」「Ping Pong Ridable Floor」をアタッチ

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。ゲーム内の床とプレイヤーが同時に横方向に移動している様子が示されています。
連動移動

 

<「行ったり来たり移動する(乗って動く床)(Ping Pong Ridable Floor)」抜粋>

・一定時間で左右に往復移動

void Update()
{
timer += Time.deltaTime;  //経過時間
if (timer >= moveTime)    //moveTime(定数)を超えたら
{
speed = -speed;  // 方向転換
timer = 0.0f;   //timer初期化
}
CheckRemove();  // 接触しなくなったら、一緒に移動を解除
transform.Translate(Vector2.right * speed * Time.deltaTime); //左右移動
}

 

・床に接触したら作動する処理

private void OnCollisionEnter2D(Collision2D other)
{
childObjects.Add(other.gameObject);
other.gameObject.transform.parent = transform;
}

OnCollisionEnter2D:床に何かが接触したら実行
childObjects.Add:「衝突したオブジェクト」を「床のオブジェクト」の子オブジェクトとして追加
other.gameObject:衝突したオブジェクトが入っている

 

・親子関係を解除

private void CheckRemove()
{
・・・
}

CheckRemove:もし床から離れていたら親子関係を解除し自由に動くようにする

 

[PR]

 

 

・すり抜けさせたい床にコンポーネントを追加
 ・「Platform Effector 2D」をアタッチ

・「Box Collider 2D」の「Used By Effector」にチェックを入れる

Unityエディタのインスペクターウィンドウです。オブジェクトがすり抜けられる壁の設定を行っており、「Used By Effector」にチェックが入っている様子を示しています。
すり抜け壁設定

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。プレイヤーが「Used By Effector」の設定がされている壁をすり抜けて移動している様子を示しています。
すり抜けアクション

 

・水の画像を配置
 ・Transformの「Z」の値を「3」
 ・「Box Collider 2D」「Buoyancy Effector 2D」をアタッチ
 ・インスペクターウィンドウの「Box Collider 2D」にて以下をチェック
  □ トリガーにする(Is Trigger)
  □ エフェクターで使用(Used By Effector)
  □ 自動タイリング(Auto Tiling)

・水面を調整
 ・一旦、Sprite Rendererのチェックをオフ
 ・「Buoyancy Effector 2D」の密度(Density)を「5」に変更
 ・Surface Levelの文字の箇所を左右にドラッグし水面を調整

UnityエディタのインスペクターウィンドウのGIFアニメーションです。「Buoyancy Effector 2D」のSurface Levelを調整することで、水面の高さを変更している様子を示しています。
水面調整

・最後にSprite Rendererのチェックをオンに戻す

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。プレイヤーキャラクターが水中に飛び込み、浮力によって水面まで上昇する様子を示しています。
浮力効果

 

[PR]

 

 

Unityエディタで作成した2Dゲームのステージ全体図です。スーパーマリオブラザーズのような広大なステージで、様々なオブジェクトや地形が含まれています。
広い2Dゲームステージ

 

・晴れの背景を配置
 ・Transformの「Z」の値を「10」に変更

 

・Main Cameraに「Camera Manager」をアタッチ
 ・「Player」プロパティに操作キャラを設定

・ヒエラルキーウィンドウにて、背景画像を「Main Camera」にドラッグ&ドロップ

Unityエディタのヒエラルキーウィンドウのキャプチャです。背景画像が「Main Camera」の子オブジェクトとして配置されている状態を示しています。
カメラの子オブジェクト

 →晴れの背景(bg_sunny_0)をMain Cameraの子オブジェクトにする

 

・「Camera Manager」の「Follow H Only」のチェックをオフ

 

・「Play」ボタンで実行

Unityゲームのプレイ画面のGIFアニメーションです。作成した広大なステージをプレイヤーキャラクターが探索している様子を示しています。
ゲームプレイ画面

 

<「カメラが動くものを追いかける(Camera Manager)」抜粋>

・LateUpdate関数
 →すべてのUpdate関数が呼ばれたあとに実行される

void LateUpdate() {
 ・・・
}

 

・スタート地点より左にスクロールしない処理

if (vx < xlimit) vx = xlimit;

 

 

CHAPTER8はボリュームそこそこ大きめ・・・

 

疲れました。。

つかれーた

 

明日もあるので、終わります。。

 

おつかれさまでした~(´Д⊂ヽ

 

 

[PR]

 

 

 

PAGE TOP
タイトルとURLをコピーしました