FPSゲームの作り方4 Unityで弓矢を作って向いてる方向に矢を放つ 銃弾にも応用可能

Unity FPSゲームの作り方


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

本講座では、UnityとC#を用いて3DFPSゲームを作成していきます。今回はその第4回目です。

前回はFPSゲームに必須となるプレイヤーのカメラ回転やジャンプ処理を作成しました。

前回の記事 : 

FPSゲームの作り方3 一人称カメラ操作の設定・ジャンプ処理の作成
本講座では、UnityとC#を用いて3DFPSゲームを作成していきます。 前回はカメラオブジェクトとしてプレイヤーを作成し、前後左右への移動処理を実装しました。 前回の記事 :  今回はまずプレイヤーの目にあたるカメラを任...

今回はFPSゲームにおける武器の作成・配置を行い、攻撃処理を作成していきます。本講座の導入部で書いたように今回は弓矢を使ったFPSを作成します。

もし一般的な銃の方がいい!という方は、むしろその方が簡単ですのでこの記事を参考にしてご自身で作成してみましょう。

では始めていきます。


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

Unityで作るFPSゲームの武器を作成・配置していこう

UnityにおけるFPSゲームの弓矢作りの流れは、

弓アセットを配置→矢プレハブを作成し弓から生成できるようにする→射出方向に矢を飛ばす→飛ばした矢を除去&再生成可能にする→すりぬけ対策を行う

要約するとこんな感じになります。

インポートしておいた武器アセットを配置

ではまず最初にダウンロードしておいた弓を配置していきましょう。

まずはHierarchyの「Player」の子にある「MainCamera」の子に空オブジェクトを作成し「Weapon」という名前にします。そのままInspectorでTransformのPositionを全て「0」にします。

空オブジェクト : 見た目、機能を持たないゲームオブジェクト。右クリック「CreateEmpty」で作成。

そして、その「Weapon」の子にProjectウインドウ「Assets/Elven Long Bow」フォルダにある、「Elven Long Bow」をドラック&ドロップで配置します。

その「Eleven Long Bow」を選択し、こちらもInspectorでTransformのPositionを一旦全て「0」にしておきましょう。

もしこの時配置した弓が真っ白の場合は「Assets/Elven Long Bow/Materials」にある「Elven Long Bow」という名前のマテリアルを、Inspectorの「Elven Long Bow」の子「default」にドラック&ドロップしてマテリアルを設定します。

でかいですね。位置、角度、大きさを調整しましょう。

Transformの調整

Hierarchyの「Player/MainCamera/Weapon/Elven Long Bow」を選択しInspectorでTransformを下記のように設定します。

これでカメラの前の少し左に弓がきました。

FPSゲームで放つ矢の作成

次に矢を作成します。

まず、Hierarchyに空オブジェクトを作成して「ArrowPoint」という名前にします。(何の子でもなくHierarchy下の空きスペースで右クリックしてCreateEmpty)

そして、「ArrowPoint」の子として空オブジェクトを作成し「Arrow」という名前にします。「Arrow」のTransformのPositionは全て「0」にしておいてください。

次はProjectウインドウの「Assets/Elven Long Bow」フォルダにある「Elven Long Bow Arrow」を「Arrow」の子にドラック&ドロップして配置します。

配置した「Elven Long Bow Arrow」のTransoformを下記のように設定してください。

この時矢が真っ白の場合は、「Assets/Elven Long Bow/Materials」フォルダにある「Elven Long Bow」というマテリアル(弓と同じ)を設定しましょう。

ここまで作成すると下記画像のようになります。

ここでは「Arrow」のZ軸の「+」方向、つまり正面が、矢の進行方向になるように設定しています。

 

次に「ArrowPoint」をドラック&ドロップして「Player/MainCamera/Weapon」の子に移動します。

移動したら「ArrowPoint」のTransoformのPositionがずれているかと思うので、下記のように設定してください。

これで、弓のそばに矢が来るようになったかと思います。

 

次にこの矢に「Rigidbody」と「Collider」を付与します。

「Arrow」を選択して、Inspectorの「AddComponent」を押して、「Rigidbody」「CapsuleCollider」を付与します。

「Rigidbody」は「Mass」を「0.01」、「useGravity」を「オフ」、「isKinematic」を「オン」に変更します。

「CapsuleCollider」は「Direction」を「Z-Axis」に変更して、矢を覆うような形に変更します。

コライダーは「EditCollider」を選択して、Sceneウインドウの緑の四角を移動することで大きさを変更できます。下記を参考に変更してみましょう。(Inspectorの数値はピッタリ一緒でなくても構いません)

矢のプレハブ化

矢は何本も使用しますので、プレハブにして攻撃の時に生成するようにします。

「ArrowPoint」の子にある「Arrow」を選択します。これをProjectウインドウの「Assets/AppMain/Prefab」フォルダにドラック&ドロップします。プレハブ化できるとHierarchyの「Arrow」の文字が青くなります。

確認したらHierarchyにある「Arrow」は消してしまいましょう。消すのは「Arrow」で「ArrowPoint」は残しておくように注意してください。

 

3DUnityで向いてる方向に弾を撃つ機能を実装する

弓の配置、矢の作成が終わったので、ここから矢の発射処理を作成していきましょう。

矢の生成、発射処理のスクリプトを書いていこう

まずは矢を生成し正面に発射するところまで書いていきます。追加するのは「AppPlayerController」です。

続きを読む

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

すり抜けの対策

基本はここまでで完了なのですが、矢をたとえば地面に向けて速い速度で撃ったりすると、矢がすり抜けてしまう場合があります。

これは、UnityにおいてRigidbody、Colliderを使用して衝突を行なっていると起こり得る問題です。

詳しく解説するととても複雑な問題なのですが、ざっくり言うと速度が早すぎると当たり判定が発生する処理が間に合わなくなるためです。

ここでは簡易的にできる対策を紹介しておきます。今回は「Arrow」を撃ち出していますので、Inspectorで「Arrow」の「Rigidbody」を見てください。

下の方にある「Collision Detection」を「Continuous Dynamic」に変更しましょう。これは処理の方法をより精密にするための設定です。

じゃあ全部これにすればいいんじゃないか?と思うかもしれませんが、これを設定することで処理負荷が増えますので、どこで使うべきかというのはしっかり考えて設定するようにしましょう。

レイヤーの設定

最後にもう一つ。矢とプレイヤーのレイヤーを設定します。

これはプレイヤーと矢が接触することによる意図しない移動などを防ぐために行います。設定自体はほぼタグと同じなのでとても簡単です。

まず、Hierarchyのいずれかを選択し右上の「Layer」をクリックします。出てきたメニューから一番下の「Add Layer」を選択、するとInspectorにレイヤー一覧が表示されるので、その空いている部分に「Arrow」「Player」という二つのレイヤーを作成しましょう。

 

そして作成したレイヤーをプレハブの「Arrow」とHierarchyの「Player」びそれぞれ設定しましょう。

この時英語のウインドウが表示されます。意味は「このオブジェクトの子のレイヤーも同時に変更しますか?」ということなので「OK」で大丈夫です。

次に「ProjectSetting」を開きます。開いていない場合、Unity上部メニュー「Edit/Project Setting」をクリックしてください。

左側の一覧から「Physics」を選びます。そして一番下のレイヤー名とチェックマークの部分を見てください。この縦と横の名前の重なる部分のチェックマークがそのコライダー同士の衝突の可否を示しています。
チェックマークが入っていると、通常通り衝突、接触をしますが、チェックマークを外しておくとコライダー同士の衝突ができなくなります。これにより特定のレイヤーとはコライダーがないものと衝突するのと同じような状態にすることができます。

なので、「PlayerとArrow」「ArrowとArrow」「PlayerとPlayer」の部分のチェックを外しておきます。

「PlayerとArrow」が今回のメインで、「ArrowとArrow」は飛んでたり刺さってる矢に他の矢が当たらないように、「PlayerとPlayer」は「Player」内のコライダー同士が接触しないように設定しています(現状はなくても問題ありません)。

これで完了。今回はここまでです。

現状カメラで方向を変更できるもののこのままでは狙いを定めにくいので、次回、矢をちゃんと狙いをつけて飛ばせるように照準器・エイム機能を追加して改造していきます。

次回の記事:

3DFPSゲームの作り方5 当たり判定と照準器・エイムを実装しよう
本講座では、UnityとC#を用いて3DFPSゲームを作成していきます。今回はその第5回目です。 前回はFPSゲームの攻撃手段として弓矢を作成し、矢の生成、射出、再装填機能などを実装し、矢を飛ばせるようにしました。 前回の記事 ...


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

コメント

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