【Unity/2D】Flappy Bird風ゲームを作ってみる話 #4 土管を移動させるスクリプトを作成する

記事をご覧いただき、誠にありがとうございます。
投稿主の無能です。

前回は、土管のオブジェクトに必要なコンポーネントをアタッチして、Prefab化をしました。

今回は、土管のオブジェクトにスクリプトを作って、プレイヤーの障害物になるようにしていきたいと思います。

土管のオブジェクトに右から左へ動くスクリプトを書く

ジャンプするプレイヤーがいるので、それを邪魔する土管になるようにスクリプトを作成します。

スクリプトの内容は、土管を右から左に動くというスクリプトになります。

新たに「PipeController」というスクリプトを作成し、上下の土管にアタッチしておきます。

アタッチしたら、土管オブジェクトへの変更をPrefabに適用するため、Prefabという項目の直下にあるOverridesというドロップダウンリストを開き、開いたら右下のApply Allボタンで変更を適用します。

新たに「PipeController」スクリプトを作成

PipeControllerスクリプトを上下の土管オブジェクトにアタッチ

OverridesドロップダウンリストからApply Allボタンを押して変更を適用

ではスクリプトを書いていきましょう。

エンコードは任意です。

PipeController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Search;
using UnityEngine;

public class PipeController : MonoBehaviour
{
    #region Var-Pipe
    [Header("土管の動く速度")]
    [SerializeField] float pipeMoveSpeed = 1f;
    #endregion

    #region Var-Internal
    Rigidbody2D pipeRB;                             // 土管のRigidbody
    #endregion

    #region Start
    void Start()
    {
        // 土管のRigidbodyを取得
        pipeRB = GetComponent<Rigidbody2D>();
        // 土管を動かす
        PipeMove();       
    }
    #endregion

    #region PipeMove
    void PipeMove()
    {
        // 土管に左方向のベクトルを持たせる
        pipeRB.velocity = Vector2.left * pipeMoveSpeed;
    }
    #endregion
}
では見ていきましょう。

メンバ変数

メンバ変数は、土管の動く速度となるpipeMoveSpeedです。

後は、内部処理用に使う土管のRigidbody2DのpipeRBです。

Start関数

ではStart関数を見ていきます。

Start関数では、最初に土管のRigidbodyを取得しています。

そしてPipeMove関数を呼んでいます。

PipeMove関数

次にPipeMove関数を見ていきます。

PipeMove関数では、土管のRigidbodyに左方向のベクトルを与えています。

簡単に言えば、土管が左に動くようにしてあります。

そして与えたベクトルの大きさ、つまり土管が動く速度は、左方向の1(座標で表すと(-1, 0))とpipeMoveSpeedを掛け合わせたものになります。

つまり、pipeMoveSpeedが大きくなるほどベクトルが大きい、速度が速くなる、ということになります。

プレイヤーが上方向にジャンプする仕組みを左方向にしただけの簡単なスクリプトですね。

ですが、Rigidbody2DのBody Typeを思い出してください。

土管のBody TypeはKinematicなので、重力の影響は受けないんでした。
更に明確なユーザー制御のみで動くので、土管は影響を受けない形でスーッと左に動いていきます。
もっと言えば、重力だけではなく他の影響も受けないので、プレイヤーが衝突してもプレイヤーのみが衝突した影響を受けます。

これがDynamicとの違いになります。
だからギミック向けになるんですね。

ではUnityで動作確認してみます。

上下の土管双方にアタッチしたPipeControllerスクリプトにPipeMoveSpeedが増えているので、その値を4にします。

UnityでpipeMoveSpeedを4に変更

それでは動作確認をしてみましょう。

動作確認

Unityで実行ボタンを押して動作確認しましょう。

上下の土管が左方向へ動いた

上下の土管が左へ動きました。

まとめ

今回は
  • PipeControllerスクリプトを作成し、上下の土管オブジェクトにアタッチした
  • スクリプトを書いて土管オブジェクトを動くようにした
  • 土管オブジェクトの動く速度を変更して動作確認した
という事をやりました。

次回は、オブジェクトを破棄するエリアを作りたいと思います。

では、また次回!

コメント