Unityレースゲームの作り方3 カーブ・アクセル速度制限とカメラの追尾処理の実装

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


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

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

今回は第三回となります。

前回の記事 :

Unityレースゲームの作り方2 プレイヤーの車を作って動かしてみよう
本講座ではUnityで3Dレースゲームの作り方について説明しています。今回は第2回です。 前回、プロジェクトを立ち上げ、レーシングゲームに必要なアセットを準備し、コースマップを作成しました。 前回の記事 : 今回はプレイヤーと...

前回はプレイヤーを前後に動かしましたが、今回は車を横に動かしてカーブする、速度制限を付けてブレーキをかける、カメラの移動処理などよりゲームらしくなる実装を行っていきます。

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


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

カーレースの車をカーブ(横移動しながら曲がる)処理を作る

まずは横移動(曲がれるように)を作成していきます。

横は横方向の力を与えるのではなく、左右の回転の力(トルク)を与えていきます。では「PlayerController.cs」に追加していきますので、まずは追加済みのコードを見てみましょう。

(・・・は変更のないところを省略しています)

まずは「rotPower」という回転力を「SerializeField」で用意します。

そして「FixedUpdate」内で新しく作成する「RotationUpdate()」を実行します。

「RotationUpdate()」は回転力を加える関数です。

 

回転力を加えるのは「rigid.AddTorque()」で、「AddForce」と同じように加える力と加え方を指定します。

PCキーボードの「A」「D」ボタンを押すことを条件(if文)に、それぞれ左右へ回転力を加えています。

「transform.up」というのは、現在状態での上方向の単位ベクトルです。

Rigidbody.AddTorque( 与える力(Vector3), 力の与え方(ForceMode : 省略可) ) => リジッドボディに回転力を加える
 

Transform Scaleパラメータで車体の大きさ調整

ここで、一旦大きさの調整をします。

各自いい感じに変更しても大丈夫ですが、一部今回使用しているアセットのコースに微妙な段差がある部分があるため、小さくしすぎるとその影響が大きくなる可能性があるので注意しましょう。

ではまず大きさですが、これは単純にHierarchyから「Player」を選択しInspectorの「Transform」の「Scale」を

にしましょう。コースの幅を考えて少しだけ小さくしました。

車のアクセルに速度制限を付ける

次に速度ですが、今のままだと横転しやすかったりするので「PlayerController.cs」に速度制限を追加していきます。まずは追加したコードを見てみましょう。

 

追加箇所は、2つの制限値の変数と移動処理、回転処理の中です。

まず「SerializeField」属性をつけて速度制限値「speedSqrLimit」、回転速度制限値「rotationSqrLimit」を用意し初期値を入れておきます。「SerializeField」を付けることによってUnityのInspectorから値を変更できます。

次に「MoveUpdate()」内を解説します。

最初の追加部分はこの部分です。

まず「sqrVel」という変数を準備し、「rigid.velocity.sqrMagnitude」を入れています。

ここで「rigid.velocity」というのは、「rigid」というRigidbodyの現在の速度を表すVector3(3次元ベクトル)の値です。

そして、「sqrMagnitude」はベクトルの2乗の長さを表し、今回は速度の大きさの2乗となります。

これが設定したリミットより大きい場合「if( sqrAng > rotationSqrLimit ) 」には「return」、つまりここで処理を終了し、下の処理を行わないようにします。

return : その時点で処理を終了(返り値がある場合は値を返す(return)。今回は返り値のないvoid なので終了)
Vector3には「magnitude」「sqrMagnitude」という2つのベクトルの長さを表す値、また「Vector3.Distance()」という関数が用意されております。この中で「magnitude」「Vector3.Distance()」はベクトルの長さ、「sqrMagnitude」はベクトルの2乗の長さを表します。ここでは簡単に説明しますが、Unityではベクトルの長さを得るのにルート「√」の計算が必要で、この計算に結構な負荷がかかります。そのため今回のように繰り返し行われる計算の場合は、2乗の値である「sqrMagnitude」を使用したほうがベターです。
これにより速度制限をかけることができます。
 
その下の追加部分

も同じで「sqrVel」が「speedSqrLimit * 0.2f」以上の場合はここで処理を終了し、それ以降の後ろ移動の処理を行わないようにします。

これで後ろ方向は前よりも小さい速度でしか移動できなくなります。

 
回転の方も同じです。

回転速度は「rigid.angularVelocity」で取得でき、それを設定した制限値と比較し、オーバーしたら「return」します。

左右を分ける必要はないのでこの一つでOKです。

カメラの移動処理を作る UnityのLerpメソッドの使い方

現在カメラが暫定的に設定した、車の後ろに固定している状態なので、動きに少し違和感があります。

なのでこれを臨場感のある動きに変更していきます。

まず「Player」の子にある「MainCamera」を外に出して何の子でもない状態にします。そして「Player」のScaleを変更した影響で「MainCamera」のScaleも変わっているので、Inspectorの「Transform」からScaleを( 1, 1, 1 )に変更しておきましょう。

次にカメラの移動処理を「PlayerController.cs」に追加していきます。まずは追加したコードを見ていきましょう。

続きを読む

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

カーレースゲームのテストプレイを行う

では再生して試してみましょう。

横移動、速度制限、カメラ移動を作成したことにより、だいぶレースっぽくなりましたね。

今回の記事は以上になります。

次回はスタート、ラップ数、ゴールなどの処理を作成していきます。

次回の記事 : 

Unity レースゲームの作り方4 ゴールゲート作成と周回数の計測を実装しよう
本講座ではUnityで3Dレースゲームの作り方について解説しています。今回は第4回です。 今回は第四回となります。 前回はプレイヤーのカーブ(横移動処理)、アクセルの速度制限、背後に存在するカメラの追跡処理を作成しました。 前回の...

 

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



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

コメント

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