• トップ
  • ブログ一覧
  • 【Unity】WheelColliderを使って簡単なレースゲームを作ってみた
  • 【Unity】WheelColliderを使って簡単なレースゲームを作ってみた

    メディアチームメディアチーム
    2020.10.02

    IT技術

    WheelColliderを使って簡単なレースゲームに挑戦!

    今回は、「WheelCollider」を使って、簡単なレースゲームを作っていきたいと思います!

    機能としては、スタートした時にタイマーが開始して、ゴールした時にタイマーが止まるというシンプルなもの。

    わかりやすく解説していきますので、ぜひ挑戦してみてくださいね!

    WheelColliderとは?

    「WheelCollider」とは、車のシステムを簡単に作成できるものです。

    しかし、WheelCollider が提供しているものは、以下の素材のみ。

    1. 単純なゴムタイヤ
    2. 単純なサスペンション
    3. 単純なブレーキ
    4. 原始的なハンドル
    5. 原始的なモーター

    なので作れる車は、下のような、本格的なスポーツカーを再現するのは、ちょっと難しいかもしれません。

    とはいえ、WheelCollider のパラメータ弄りだけで、ちょっとした乗り物が作れるなら手軽ではありますね!

    WheelColliderによる車の作成

    まずは車の「3D モデル」を用意します。

    AssetStore から、「Standard Assets」 をダウンロードしていきましょう。

    モデルの準備

    画像のように、「 Vehicles > Car 」にのみチェックを入れ、インポートします。

    インポートが終わったら、エラーが発生しないように、「Scripts」というファイルを削除しておいてください。

    車の本体を作成

    Models というファイルの中の「SkyCar」を、Scene上にドラッグ&ドロップします。

    このとき、「Transorm > Position 」を、「 ( 0 , 0 , 0 ) 」にしておいてください。

    次に、Boxcollider をコンポーネントして、画像のように大きさを合わせます。

    そしたら、Rigidbody もコンポーネントして、Mass(質量)を「 1000 」にしましょう。

    タイヤを作成

    Hierarchy の SkyCar の中に、「Wheels > FrontRight, FrontLeft, BackRight, BackLeft」と、4つ空のゲームオブジェクトを、下の画像のように作成します。

    作成し終わったら、4つの空のオブジェクトのそれぞれに、「WheelCollider」をコンポーネントしてください。

    それぞれの Transform の値を変えて、タイヤがある場所に移動させます。

    最後に、Plane を作成して、地面を作っておきましょう。

    スクリプトによる制御

    次は、WheelCollider を制御するスクリプトを作成していきます。

    まず、「CarMove.cs」を作成して、SkyCar にコンポーネントしましょう。

    「CarMove.cs」には、以下のように記述します。

    1using UnityEngine;
    2using System.Collections;
    3using System.Collections.Generic;
    4
    5public class CarMove : MonoBehaviour
    6{
    7    public List<AxleInfo> axleInfos; 
    8    public float maxMotorTorque; 
    9    public float maxSteeringAngle; 
    10    public void FixedUpdate()
    11    {
    12        float motor = maxMotorTorque * Input.GetAxis("Vertical");
    13
    14        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
    15
    16        foreach (AxleInfo axleInfo in axleInfos)
    17        {
    18            if (axleInfo.steering)
    19            {
    20                axleInfo.leftWheel.steerAngle = steering;
    21                axleInfo.rightWheel.steerAngle = steering;
    22            }
    23            if (axleInfo.motor)
    24            {
    25                axleInfo.leftWheel.motorTorque = motor;
    26                axleInfo.rightWheel.motorTorque = motor;
    27            }
    28        }
    29    }
    30}
    31
    32[System.Serializable]
    33public class AxleInfo
    34{
    35    public WheelCollider leftWheel;
    36    public WheelCollider rightWheel;
    37    public bool motor; 
    38    public bool steering; 
    39}

    コードを記述し終わったら、「CarMove.cs」を、下の画像のように設定します。

    このとき、先ほど作成した、WheelCollider のオブジェクトを指定しておいてください。

    これで、車を動かせるようになりました!

    カメラを追随させる

    カメラを追随させるには、「MainCamera」を、SkyCar の子オブジェクトにします。

    このとき、「 Transform > Position 」 を 「 ( 0 , 2.3 , -6 ) 」 に設定したら完了です。

    これで、カメラが車を追従するようになりました!

    実行してみよう!

    これで、車の作成は終わりです!

    実際に、「実行ボタン」を押して、作った車を動かしてみましょう!

    ただ、地面が一色だと、動いてないように見えるかもしれませんね…。

    次は、レースマップを作成して、よりゲームっぽくしていきたいと思います!

    レースマップの作成

    まずは、以下より、レースマップをダウンロードしてください。

    レースマップ
    https://rightcode.co.jp/wp-content/uploads/2020/07/Field.png

    Plane を作成して 以下のように設定しましょう。

    1. Position を ( 0 , 0 , 0 )
    2. Rotation を ( 0 , 180 , 0 )
    3. Scale を ( 5 , 1 , 10 ) 

    その Plane に、先ほどダウンロードしたマップをドラッグ&ドロップします。

    SkyCar を画像のように、スタートラインに移動させたら準備完了です。

    次は、システムを作成していきましょう!

    システムの作成

    スタートラインを超えたときに「タイマーを開始」し、1週してラインを超えたときに「タイマーを止める」というシステムを作っていきます。

    1週しているかを判断するために、コース上にはチェックポイントを作成していきます。

    スタート・ゴールラインの作成

    空のゲームオブジェクトを作成して、名前を「StartLine」などにします。

    BoxCollider をコンポーネントして、「is Trigger」にチェックを入れ、大きさをラインに合わせおきましょう。

    Inspecter から、Tag を AddTag から追加して、「Line」にします。

    位置は、スタートラインに合わせましょう。

    チェックポイントの作成

    空のゲームオブジェクトを作成して、名前を「CheckPoint」などにします。

    ここでも、BoxCollider をコンポーネントして、「is Trigger」にチェックを入れ、大きさを調節します。

    Inspecter から、Tag を AddTag から追加して、「CheckPoint」にします。

    複製をして、画像のように配置してください。

    タイマーを表示する

    「Canvas > Text」を作成して、画面中央に移動させます。

    これは、タイマーを表示させるのに使います。

    FontSize や位置などは、自由に調節しましょう。

    スクリプトによる制御

    「RaceSystem.cs」を作成して、SkyCar にコンポーネントします。

    「RaceSystem.cs」には、以下のように記述していきましょう!

    1using System.Collections;
    2using System.Collections.Generic;
    3using UnityEngine;
    4using UnityEngine.UI;
    5
    6public class RaceSystem : MonoBehaviour
    7{
    8
    9    public Text timeText;
    10
    11    private int count;
    12    private bool cangoal,goalnow = false, StartGoalLine = false;;
    13    private float seconds, minutes;
    14
    15    void Update()
    16    {
    17        timer();
    18    }
    19
    20    private void OnTriggerEnter(Collider other)
    21    {
    22        if(other.gameObject.tag == "CheckPoint")//チェックポイントに触れた
    23        {
    24            Destroy(other.gameObject);
    25            count += 1;
    26        }
    27        if(other.gameObject.tag == "Line")//スタートラインに触れた
    28        {
    29           if(count == 6)//チェックポイントをすべて通ったか
    30            {
    31                Debug.Log("GOAL!");
    32                StartGoalLine = false;
    33                goalnow = true;
    34            }
    35            else
    36            {
    37                StartGoalLine = true;
    38            }
    39        }
    40    }
    41
    42    void timer()
    43    {
    44        if (StartGoalLine)
    45        {
    46            seconds += Time.deltaTime;
    47        }
    48
    49        if(seconds >= 60)
    50        {
    51            minutes++;
    52            seconds -= 60;
    53        }
    54
    55        if (!goalnow)
    56        {
    57            //ゴールしてない
    58            timeText.text = "Time " + minutes.ToString("00") + " : " + ((int)seconds).ToString("00");
    59        }
    60        else
    61        {
    62            //ゴールした
    63            timeText.text = "ゴールタイムは  " + minutes.ToString("00") + " : " + ((int)seconds).ToString("00");
    64        }
    65    }
    66}

    Inspecter 上で、TimeText に先ほど作った Text をアタッチします。

    遊んでみる!

    動かしてみると、しっかりとタイマーが動いています。

    ゴールした後には、ゴールタイムも表示されていますね!

    さいごに

    シンプルなレースゲームはできましたか?

    今回は「WheelColliderを使った簡単なレースゲーム」を作ってみました。

    サウンドやエフェクトなども追加して、さらにオンラインで対戦もできるようになれば、もっと面白くなりそうですね!

    ぜひ皆さんも、色々アレンジを加えながら、自分オリジナルのレースゲームを作ってみてください!

    こちらの記事もオススメ!

    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background