
【Unity】WheelColliderを使って簡単なレースゲームを作ってみた
2021.12.20
WheelColliderを使って簡単なレースゲームに挑戦!
今回は、「WheelCollider」を使って、簡単なレースゲームを作っていきたいと思います!
機能としては、スタートした時にタイマーが開始して、ゴールした時にタイマーが止まるというシンプルなもの。
わかりやすく解説していきますので、ぜひ挑戦してみてくださいね!
WheelColliderとは?
「WheelCollider」とは、車のシステムを簡単に作成できるものです。
しかし、WheelCollider が提供しているものは、以下の素材のみ。
- 単純なゴムタイヤ
- 単純なサスペンション
- 単純なブレーキ
- 原始的なハンドル
- 原始的なモーター
なので作れる車は、下のような、本格的なスポーツカーを再現するのは、ちょっと難しいかもしれません。
とはいえ、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」には、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class CarMove : MonoBehaviour { public List<AxleInfo> axleInfos; public float maxMotorTorque; public float maxSteeringAngle; public void FixedUpdate() { float motor = maxMotorTorque * Input.GetAxis("Vertical"); float steering = maxSteeringAngle * Input.GetAxis("Horizontal"); foreach (AxleInfo axleInfo in axleInfos) { if (axleInfo.steering) { axleInfo.leftWheel.steerAngle = steering; axleInfo.rightWheel.steerAngle = steering; } if (axleInfo.motor) { axleInfo.leftWheel.motorTorque = motor; axleInfo.rightWheel.motorTorque = motor; } } } } [System.Serializable] public class AxleInfo { public WheelCollider leftWheel; public WheelCollider rightWheel; public bool motor; public bool steering; } |
コードを記述し終わったら、「CarMove.cs」を、下の画像のように設定します。
このとき、先ほど作成した、WheelCollider のオブジェクトを指定しておいてください。

これで、車を動かせるようになりました!
カメラを追随させる
カメラを追随させるには、「MainCamera」を、SkyCar の子オブジェクトにします。
このとき、「 Transform > Position 」 を 「 ( 0 , 2.3 , -6 ) 」 に設定したら完了です。
これで、カメラが車を追従するようになりました!
実行してみよう!
これで、車の作成は終わりです!
実際に、「実行ボタン」を押して、作った車を動かしてみましょう!
ただ、地面が一色だと、動いてないように見えるかもしれませんね…。
次は、レースマップを作成して、よりゲームっぽくしていきたいと思います!
レースマップの作成

まずは、以下より、レースマップをダウンロードしてください。
レースマップ
https://rightcode.co.jp/wp-content/uploads/2020/07/Field.png
Plane を作成して 以下のように設定しましょう。
- Position を ( 0 , 0 , 0 )
- Rotation を ( 0 , 180 , 0 )
- 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」には、以下のように記述していきましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RaceSystem : MonoBehaviour { public Text timeText; private int count; private bool cangoal,goalnow = false, StartGoalLine = false;; private float seconds, minutes; void Update() { timer(); } private void OnTriggerEnter(Collider other) { if(other.gameObject.tag == "CheckPoint")//チェックポイントに触れた { Destroy(other.gameObject); count += 1; } if(other.gameObject.tag == "Line")//スタートラインに触れた { if(count == 6)//チェックポイントをすべて通ったか { Debug.Log("GOAL!"); StartGoalLine = false; goalnow = true; } else { StartGoalLine = true; } } } void timer() { if (StartGoalLine) { seconds += Time.deltaTime; } if(seconds >= 60) { minutes++; seconds -= 60; } if (!goalnow) { //ゴールしてない timeText.text = "Time " + minutes.ToString("00") + " : " + ((int)seconds).ToString("00"); } else { //ゴールした timeText.text = "ゴールタイムは " + minutes.ToString("00") + " : " + ((int)seconds).ToString("00"); } } } |
Inspecter 上で、TimeText に先ほど作った Text をアタッチします。
遊んでみる!
動かしてみると、しっかりとタイマーが動いています。
ゴールした後には、ゴールタイムも表示されていますね!

さいごに
シンプルなレースゲームはできましたか?
今回は「WheelColliderを使った簡単なレースゲーム」を作ってみました。
サウンドやエフェクトなども追加して、さらにオンラインで対戦もできるようになれば、もっと面白くなりそうですね!
ぜひ皆さんも、色々アレンジを加えながら、自分オリジナルのレースゲームを作ってみてください!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン