【Unity】WheelColliderを使って簡単なレースゲームを作ってみた
IT技術
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」には、以下のように記述します。
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 を作成して 以下のように設定しましょう。
- 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」には、以下のように記述していきましょう!
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を使った簡単なレースゲーム」を作ってみました。
サウンドやエフェクトなども追加して、さらにオンラインで対戦もできるようになれば、もっと面白くなりそうですね!
ぜひ皆さんも、色々アレンジを加えながら、自分オリジナルのレースゲームを作ってみてください!
こちらの記事もオススメ!
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit