3Dシューティングゲームの作り方3 プレイヤー移動処理・視点変化・カメラ追随処理を開発

Unity 3Dシューティングゲームの作り方


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

前回の記事では背景となるGameObjectをTerrainを使用して配置しました。

前回の記事:

3Dシューティングゲームの作り方その2Terrainを使ってフィールドを作る
前の記事で3Dシューティングに必要なプレイヤー機体やHPゲージなどを作成し、シーンに配置していきました。 前回の記事: 今回はゲームの背景となるフィールドをシーンに追加します。 UnityのTerrainを利用すると簡単に背景とな...

今回ではその背景に指定したルートをプレイヤーが移動するようにしましょう!

定めた場所を通りながら自動的にプレイヤーの向きや進行方向も変更していきます。

また、プレイヤーの子オブジェクトにカメラをアタッチして1人称視点ゲームに変化させます。


【Unity入門の森の最新ゲーム開発講座もお届け】

プレイヤーを移動させる

プレイヤー操作用のスクリプトを新しく追加します。スクリプトの名前は「Player」にしてください。

追加できたらシーンの「Player」にアタッチしてください。

次のサンプルコードは前の講座で配置したルート上のポイントの間でプレイヤーを移動させるものになります。

スクリプトが無事コンパイルできたら、次はシーンに配置したGameObjectに必要な設定を行なっていきましょう!

まず「Player」の設定をしましょう。

  • PlayerコンポーネントのRoutePointsフィールドにBackGroundの子のPointオブジェクトを移動順にヒエラルキーからアタッチする
  • 「Player」プレハブにRigidbodyをアタッチし、IsKinematicにチェックを入れる
  • RigidbodyのUse Gravityのチェックを外す
  • 「Player」プレハブにSphereColliderをアタッチして、Edit Colliderを選択し、Radiusを変更しモデル全体を覆うようにする(値は1記事目で作った機体による。個々人で調整)

この講座ではルート上のポイントと衝突したときにそのポイントに到達したことにしています。

そのため当たり判定を行う必要があるのですが、それにはRigidbodyコンポーネントがアタッチされていないといけません。

今回の場合では単純に当たり判定を行うことだけにRgidbodyコンポーネントを使用しているので、Is Kinematicにチェックを入れ、物理エンジンによる操作は行わないようにしています。

次にルート上のポイント全てに次の設定を行なってください

タグの設定はこの次の項目を参考にしてください。

プレイヤーはポイントに当たった時に進行ルートを変えるので、その辺りを意識して調節してください。

  • タグを「RoutePoint」に設定
  • Collider系のコンポーネントをアタッチし、IsTriggerにチェックする
  • Colliderの大きさはルートに応じて適当なサイズにする

Collider系のコンポーネントには次のものがあるので、適宜使い分けてください。ただし3D用のColliderを使用してください。

  • BoxCollider
  • SphereCollider
  • CapsuleCollider
  • MeshCollider

などなど。

GameObjectのタグについて

UnityではGameObjectの判別のためにタグを指定することができます。

タグはInspectorの上にあるTagから設定できます。

タグは設定する際に既にあるものを使うor新しくタグを追加して使うことができます。

  • InspectorのTagをクリックし、開いたメニューから「Add Tag」をクリック
  • Inspectorの表示が切り替わるので、そこからTagsの欄に追加したいタグの名前を追加する

この記事ではルート上のポイントに「RoutePoint」というタグを指定しますので、上で説明した手順で「RoutePoint」タグを追加してから、GameObjectに設定してください。

スクリプト上からはUnityEngine.GameObject.tagからGameObjectに設定されているタグを取得できます。

カメラがプレイヤーに追従するようにする。

このまま再生するとプレイヤーだけが移動しカメラから映らなくなります。

そのためシーンにある「Main Camera」を「Player」の子GameObjectにします。子GameObjectに追加した「Main Camera」は「Player」プレハブには追加しないように注意してください。

また「Main Camera」には次の設定を行なってください。

  • TransformのPositionを(0, 0, -20)にする
  • TransformのRotationを(0, 0, 0)にする
  • TransformのScaleを(1, 1, 1)にする

注:↑の値は人によって適性な値が異なります。作ったコースや機体の大きさなどに合わせて調整してください。

プレイヤーを上下左右に移動させる

一応ここまででプレイヤーをルート上のポイントの間を移動できるようになりました。

ただこのままだと直進するだけなので、ルートから外れない程度に上下左右に移動できるようにしてみましょう。

Playerコンポーネントに次のものを追加してください。

「Horizontal」と「Vertical」に指定されたキーやボタンを押すことで進行方向に合わせた上下左右に移動するようになっています。

数学的な知識を含んだ処理になっていますが、本筋からは外れるので詳しい解説は省略します(どこかでまた数学講座も作りたいところですね)。

注意点として、移動ルートの直線上から微妙に外れることがあるため、「RoutePoint」タグをつけたシーン上のGameObjectと当たらなくなる場合が出てくるようになります。

その際は次の修正を行なってください。

  • 「RoutePoint」の当たり判定の領域を広げる。
  • その際、進行ルートも微妙にずれたりするので、Transformの位置を微調節する
  • 地形にめり込んだりする時は「Background」の方も修正してください。

修正はトライ&エラーで頑張りましょう。移動可能経路の抑えを増やすことでも調整可能です。

なお、プレイヤーはルートのポイントに当たった時に進行方向を変えることを念頭に置いておくと修正しやすいと思います。

まとめ

今回の記事でプレイヤーをルートに沿って移動させることができました。

3Dゲームでは数学の知識があるとより自由に安定した動作を作ることができるので、より凝ったものを作りたい方は3Dゲームの物理や数学を勉強してみるのもいいでしょう。

まとめると以下のようになります。

  • GameObjectを識別する際はタグを利用できる。
  • 3Dゲームではベクトルや行列の知識があるとより自由にGameObjectを制御することが出来る。

それでは次の記事に行ってみましょう。

参考用:スクリプトの完成図

ちなみに今回の記事で作成したスクリプトの完成図は次のようになります。

3Dシューティングゲームの作り方講座に戻る>>


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

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