UnityでFPSをつくる その7-1 [ 銃の発射 ]

2020年6月22日

今回は銃の発射を実装していきます。
まずは、標的となるEnemyオブジェクトを作ります。
新たにCubeを作り、「Enemy」とリネームして下図のように配置してください。

No.255

次にTagから「Add Tag」を選択します。

No.256

「List is Empty」の「+」を選択。

No.257

New Tag Nameに「Enemy」と入力して「Save」を押します。

No.258

これでEnemyタグがリストに追加されました。
HierarchyウィンドウのEnemyをクリックしてTagを「Enemy」に変更してください。

No.259

Enemyに耐久力(HP)を持たせます、新規に「EnemyHP」スクリプトを作り、以下のコードをコピペしてください。

今回は銃を1回発射するとEnemyに1のダメージを与える仕様にしています。
上記のコードにより、Enemyオブジェクトは3回被弾すると消滅します。

このスクリプトの注意点は27行目の箇所です。

No.260

演算子が「==」でなく「<=」なのは、プレイヤーの攻撃が「1」より大きいダメージを与える場合に対応する為です。

No.261

EnemyHPスクリプトをEnemyオブジェクトにアタッチしたら、次はPlayerの攻撃を実装します。
新規に「SightDisplay」スクリプトを作り、以下のコードをコピペしてください。

このスクリプトをMainCameraにアタッチして、Sight(Image変数)にCanvasのImageを指定します。

No.262

PlayerオブジェクトにPlayerタグを指定して、ゲームを実行してみましょう。

No.263
No.264

Enemyにカーソルが合うと赤くなることが確認できました。
この状態からマウスの左ボタンを3回クリックするとEnemyが消えます。

No.265

1回クリックするごとにEnemyのHPが1ずつ減っていくのが確認できます。

No.266

スクリプトの説明をしていきます。

No.267
No.268

カーソルの制御をする為に、5行目と10行目でUnityEngine.UIに含まれるImageクラスの変数を宣言しています。

ゲームを実行した際、Sceneビューには黄色い線が映っていますが、これは「Ray(レイ)」と呼ばれるもので、この線に当たったオブジェクトの情報を取得することができます。

No.269

そのRayを使うために必要な要素の設定を12、14行目で行っています。

No.270

27行目ではRayの起点と方向を決めています。

No.271

起点はカメラの原点から0.01だけ前方の位置、方向はカメラの前方を指定しています。

No.272

カメラの原点がPlayerオブジェクトと重なっている為、Player自身の情報を取得しないよう前方にズラしています。
上下左右でなく前方にズラしているのは、カーソル位置と合わせる為です。
現在、カーソルはスクリーンの中央に配置しています。カメラの中心もスクリーンの中央に位置するので、Z方向以外で位置を調整してしまうとカーソルの位置も中央からズラすことになります。

No.273

それでは一般的なFPSの定石から外れた見づらいゲームになってしまうので、ここでは避けています。

29行目は初期状態で透明なレイに対して、編集の際に分かり易いよう黄色く色を付けて見えるようにしています。

No.274

31行目で要素を設定したレイを実際に飛ばし、ヒットしたオブジェクトの情報を取得しています。

No.275

第2引数で使われている「out」ですが、これは引数を参照渡しする際に使います。
今まで引数を渡す際は値渡しでした。値渡しは値をコピーして渡します。
参照渡しは値の参照(メモリ上に確保された値があるアドレス)を渡します。

No.276

outを付けて参照渡しをすることにより、関数側で呼び出し元の引数の内容を変更できるので、関数の結果を変数に代入する為に戻り値を使う必要がなくなります
その為、今回のPhysics.Raycastのように判定はboolで返しつつ同時に関数の結果も取得するような、2つ以上の値を返す場面で使われます。

長くなってきたので続きは次回にします。おつかれさまでした!

FPS

Posted by kenji