本講座では、UnityとC#を用いて3DFPSゲームを作成していきます。今回はその第4回目です。
前回はFPSゲームに必須となるプレイヤーのカメラ回転やジャンプ処理を作成しました。
前回の記事 :
今回はFPSゲームにおける武器の作成・配置を行い、攻撃処理を作成していきます。本講座の導入部で書いたように今回は弓矢を使ったFPSを作成します。
もし一般的な銃の方がいい!という方は、むしろその方が簡単ですのでこの記事を参考にしてご自身で作成してみましょう。
では始めていきます。
Unityで作るFPSゲームの武器を作成・配置していこう
UnityにおけるFPSゲームの弓矢作りの流れは、
弓アセットを配置→矢プレハブを作成し弓から生成できるようにする→射出方向に矢を飛ばす→飛ばした矢を除去&再生成可能にする→すりぬけ対策を行う
要約するとこんな感じになります。
インポートしておいた武器アセットを配置
ではまず最初にダウンロードしておいた弓を配置していきましょう。
まずはHierarchyの「Player」の子にある「MainCamera」の子に空オブジェクトを作成し「Weapon」という名前にします。そのままInspectorでTransformのPositionを全て「0」にします。
そして、その「Weapon」の子にProjectウインドウ「Assets/Elven Long Bow」フォルダにある、「Elven Long Bow」をドラック&ドロップで配置します。
その「Elven 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を下記のように設定します。
1 2 3 |
Position( -0.15, -0.1, 1 ) Rotation( 0, 90, -90 ) Scale( 0.05, 0.05, 0.05 ) |
これでカメラの前の少し左に弓がきました。
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」のTransformを下記のように設定してください。
1 2 3 |
Position( 0, 0, 0.18 ) Rotation( -90, 0, 0 ) Scale( 0.1, 0.07, 0.1 ) |
この時矢が真っ白の場合は、「Assets/Elven Long Bow/Materials」フォルダにある「Elven Long Bow」というマテリアル(弓と同じ)を設定しましょう。
ここまで作成すると下記画像のようになります。
ここでは「Arrow」のZ軸の「+」方向、つまり正面が、矢の進行方向になるように設定しています。
次に「ArrowPoint」をドラック&ドロップして「Player/MainCamera/Weapon」の子に移動します。
移動したら「ArrowPoint」のTransoformのPositionがずれているかと思うので、下記のように設定してください。
1 2 3 |
Position( -0.1, 0, 0.85 ) Rotation( 0, 0, 0 ) Scale( 1, 1, 1 ) |
これで、弓のそばに矢が来るようになったかと思います。
次にこの矢に「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において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」内のコライダー同士が接触しないように設定しています(現状はなくても問題ありません)。
これで完了。今回はここまでです。
現状カメラで方向を変更できるもののこのままでは狙いを定めにくいので、次回、矢をちゃんと狙いをつけて飛ばせるように照準器・エイム機能を追加して改造していきます。
次回の記事:
コメント