Unityレースゲームの作り方2 プレイヤーの車を作って動かしてみよう

Unity C# レースゲームの作り方 (PC・スマホ・VRクロスプラットフォーム開発チュートリアル)


Unity入門の森オリジナル本格ゲーム制作講座はこちら
7種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

本講座ではUnityで3Dレースゲームの作り方について説明しています。今回は第2回です。

前回、プロジェクトを立ち上げ、レーシングゲームに必要なアセットを準備し、コースマップを作成しました。

前回の記事 :

Unityレースゲームの作り方1 レースのコースを作ろう アセット準備・3Dマップ配置
本講座ではUnityで3Dレースゲームの作り方について解説していきます。講座の後半ではスマホタイプ、VR対応も行っていきます。 マリオカート、グランツーリスモ、ワイルドスピードなど名作となるレースゲームはたくさんありますが、今回の講座...

今回はプレイヤーとなる車を動かしていきましょう。実際にコードを記載して動かしていくので、VisualStudioやVisualStudioCodeなどコードエディタをあらかじめダウンロードしておきましょう。

では始めていきましょう!

なお、ここからUnityのHierarchyウインドウ、Inspectorウインドウ、Projectウインドウなどのウインドウ(または〇〇ビューという呼び方もする)のことを、そのままHierarchy、Inspectorなどと記載していきます。


【Line登録者限定のプレゼントもあるよ!】

RigidBodyとColliderコンポーネントを用いた車の設定

まず車に物理的な判定を持たせるために、「Rigidbody」「Collider」のコンポーネントを付与していきます。

Rigidbodyで車オブジェクトの物理設定を行う

Hierarchyで「Player」を選択して、Inspectorの「AddComponent」ボタンをクリックします。

すると下記のようなウインドウがでますので、上の検索欄に「Rigidbody」と入力して下に表示される「Rigidbody」を選択しましょう。すると「Player」に「Rigidbody」が付与されます。

Rigidbody : GameObjectを物理特性によって制御する事ができるようになります。力を加えたり、トルク(回転力)を加えたりといった操作が可能になります。
たくさんの設定項目がありますが、今回使用する項目だけ簡単に解説しておきます。
Mass 質量 (kg)
Drag 空気抵抗(0が抵抗なし)
Angular Drag 回転の空気抵抗(0が抵抗なし)
Use Gravity 重力の影響を受けるかのフラグ

これらの項目を下記のように設定していきます。

Colliderコンポーネントで当たり判定を設定する

次にCollider(コライダー)を付与していきます。Colliderには形がたくさんありますが、今回は「Capsule Collider」を使用します。

Collider : GameObjectに当たり判定や侵入検知など物理的な反応をもたせるためのものです。Colliderも持つGameObject同士は衝突、接触といった物理反応が可能になります。
Rigidbodyと同じようにInspectorの「AddComponent」で、「Capsule Collider」と入力し付与しましょう。
 
コライダーで重要なのはまず「IsTrigger」というチェックマークです。これはGameObjectに衝突判定をもたせるか?のフラグになります。
この「IsTrigger」をチェックするとGameObjectは衝突判定を行わずに「接触、侵入した」というイベントのみを発行します。
今回は衝突してほしいのでチェックはしないでおきましょう。
 
次に一番下の「Direction」という項目がありますのでこれを「Z-Axis」に変更します。
これはCapsule Colliderの軸の方向を表していて、今はZ軸方向に伸びるカプセルのコライダーになります。
 
次に一番上のEditColliderの「へ」に丸がついたようなマークのボタンを押します。するとSceneウインドウでコライダーが緑色の線と点で見えるようになり、この点(下記画像の赤く囲っているところ)を動かすことでコライダーの大きさや形を調整することができます。
この調整で下記のような形状に変更しましょう。
 
すこし大きいですがOKです。
ここで、「Rigidbody」「Collider」は下記のようになっているかと思いますので確認してください。「CapsuleCollider」の少数の値は多少違っていても問題ありません。上記で調整したコライダーの大きさなどを表しています。
 
ここで、一度再生してみます。一旦Sceneウインドウで「Player」を適当な道の上に移動させましょう。そしてわかりやすいように少し道の上空においておいて再生します。
(まだカメラの設定をしていませんのでSceneウインドウで見えるようにしておきましょう。)
 
Playerがどこにあるかわからなくなっていたりしたら、Hierarchyの「Player」をダブルクリックしましょう。すると自動で「Player」がSceneウインドウ内の中心に映るようににSceneカメラが動きます。それから、マウスホイールでズームイン・アウト、右クリックで回転、中クリックで移動などができますので見やすいようにSceneカメラを調整しましょう。
 
すとん、と落ちて地面でとまったでしょうか?(タイヤが少し埋まってるのは今はOK)
これは車にRigidbodyにより重力の影響をうけ下に落ち、車のコライダーと地面のコライダー(もともと地面に付与されています)の接触により止まっています。
この状態から、力を加えたりして移動をしていきます。
 

タイヤにコライダーを付けて車が走れるようにする

移動処理を作成していきますが、その前にコライダーを追加していきます。

というのも現在カプセルを横にしたようなコライダーのみなので、このままだと横にコロコロ転がってしまいます。なので車の動きに近づけるようにタイヤ部分のコライダーを作成していきます。

タイヤ用のコライダー

まずHierarchyで「Player」を右クリック「3DObject/Cylinder」で円柱を2つ作成します。

それぞれ「FrontWheel」「RearWheel」とします。そしてこの円柱を横向きにして前2つのタイヤ、後ろ2つのタイヤにかぶるくらいの大きさに調整します。下記を参考にしてください。

配置できたら、「FrontWheel」「RearWheel」を選択してInspectorを見てください。これらのコライダーは「CapsuleCollider」になっているかと思います。これは文字通りカプセルの形をしているので円柱形ではありません。なのでこの「CapsuleCollider」を削除しましょう。

そして、「FrontWheel」「RearWheel」にそれぞれ「MeshCollider」を付与してください。「MeshCollider」ではメッシュ(この場合円柱)に合わせたコライダーになります。

そして「MeshCollider」の「Convex」のチェックを入れておきましょう(入れないと衝突できません)。

Layerの設定

次に「Layer」を設定します。Layer(レイヤー)とは簡単に言うとグループ分けするような機能です。

まずHierarchyで「Player」を選択しInspectorのほぼ一番上、名前の下の「Layer」という項目の右「Default」となっているところをクリックします。

出てきたウインドウの一番下の「AddLayer」をクリックするとInspectorが「Tag&Layer」という画面になりますので、ここで「Player」「PlayerWheel」という2つのレイヤーを追加します。

レイヤーの作成ができたら、まず「Player」を選択しInspectorで「Layer」を選択し先程作成した「Player」レイヤーに設定します。このとき下記のようなウインドウが出ます。

これは「この子オブジェクトも同じレイヤーに設定しますか?」という内容です。これは「Yes」を押しましょう。(Wheelのレイヤーも同時に変更されますので必ずこのあとにWheelのレイヤーを設定しましょう)

次に「FrontWheel」「RearWheel」を選択しこの2つは、「PlayerWheel」レイヤーに設定します。

そして、ここでUnityの上部Menu「Edit」をクリックし「ProjectSetting」を開きます。(画像はMacのウインドウですのでWindowsは少し見た目が違います)

開いたウインドウの左のメニューで「Physic」を選択し一番下のチェックマークがたくさんあるところを見てください。これはLayerごとにPhysic、つまり物理的な接触の可否を設定できます。

ここで設定するのは「Player」と「PlayerWheel」の交差するところにあるチェックマークです。このチェックーマークを外すことで「Player」のレイヤーが設定されているGameObjectと「PlayerWheel」のレイヤーが設定されているGameObjectの物理的な接触が不可能になります。

今回は車本体のコライダーとタイヤ部分のコライダーが接触不可能になり、今のようにめり込んだままでも影響がなくなります。

 

また、タイヤのコライダーの見た目は必要ないので「FrontWheel」「RearWheel」を選択しInspectorで「MeshRenderer」のチェックマークをはずして非アクティブにしましょう。これで見た目のみ消すことができます。

ここで一旦再生してみましょう。タイヤ部分が地面にめり込まないで地面に車が置かれているかと思います。(上記画像はまだタイヤのコライダーの見た目は消していない状態の画像です)

C#スクリプトを用いて車の移動を実装する

ではここからコードを書いて車を動かしていきます。

まず、「Assets/AppMain/Script」のフォルダ内で右クリックをして「Create/C#Script」で新しいスクリプトを作成し「PlayerController」という名前にしましょう。

そして作成した「PlayerController.cs」をHierarchyの「Player」にドラック&ドロップします。こうすることで「Player」に「PlayerController」を付与する事ができます。

では、「PlayerController.cs」を開きましょう。

スクリプトの基本

まず最初は下記のようになっています。

簡単に説明すると、「using ○○」という最初の記載は、「○○」にあたる「UnityEngine」などの名前空間(namespace)の処理を使用しますよ、という宣言になります。現状はおまじないだと思って「using」や「namespace」という言葉があるよ、というくらいに認識しておきましょう。

次の部分、

です。「PlayerController」という名前の公開された(public)クラス(class)ですよ、という意味です。

そして「MonoBehaviour」というクラスを継承しているという意味です。ここでは継承に関して詳しくは触れませんが、Unityで使う処理はこの「:MonoBehaviour」をつけることで使えるようになる、と覚えておきましょう。

その下

これはUnityにおける基本メソッドです。「Start」というのは、GameObjectの起動時に一回だけ自動的に実行される処理です。

「Update」はGameObjectが起動しているときに自動的に1フレーム毎に実行され続ける処理です。

最後に

ですが、これは「コメント」です。C#では行の先頭に「//」をつけることでその行はコメントとなり処理とは関係ない記載になります。もちろん日本語を書いてもOKです。このコメントは消してしまって大丈夫です。

今回はスマホなどの操作にも対応してゆく予定ですが、まずはEditor上で簡単に試せるようにPCのキーボード入力で動かしていきます。

キーボード入力で車が移動する処理の追加

では処理を記載して行きます。まずは追加後の全文をご覧ください。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.stores.jp/)で講座閲覧権を取得してね。

まだ真っ直ぐしか進めませんが、このように動きます。

後ろ向きに移動する処理を作る

後ろの移動を作成します。やることは前と変わりません。PCでキーボードは「S」ボタンを押すと後ろに進むようにします。では下記のように「PlayerController.cs」に追加していきましょう。

(変化のないところは省略しています。)

追加部分は「MoveUpdate」内の部分です。

前に進むのと違うのは、if文の条件は「Sキーを押したら」にして、与える力にマイナスをつけて後ろ向きにしています。

このままで後ろに動きますが、前後同じスピードなので今の所少し違和感はあると思いますが、次回以降速度制限などで調整していきます。

また、今の状態だと車が何かに衝突した際などに転倒したりしてしまうと思います。このあたりも後々修正していきますね。

今回は以上になります。次回は横移動を作成し曲がれるようにしていきます。そして速度制限やカメラの調整もしていきます。

次回の記事 : 

Unityレースゲームの作り方3 カーブ・アクセル速度制限とカメラの追尾処理の実装
Uni本講座ではUnityで3Dレースゲームの作り方について説明していきます。 今回は第三回となります。 前回の記事 : 前回はプレイヤーを前後に動かしましたが、今回は車を横に動かしてカーブする、速度制限を付けてブレーキをかけ...

 

Unityレースゲームの作り方チュートリアル講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
7種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

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