GameCreator Shooterモジュール編

# はじめに
この記事はGameCreatorのShooterModuleについて紹介する記事です。GameCreatorについては前の記事・[Unity Asset GameCreator 概要編](https://qiita.com/ochashiba/items/0392a4904cbaa4f7930b)をご覧下さい。
ShooterModuleはつい最近追加されたGameCreatorの新しいモジュールです。筆者もまだ触ってみた段階なので色々使い方が間違っている部分もあると思いますがご了承ください。

ShooterModuleは、GameCreatorにTPSやFPSなどのシューティングゲームに必要な機能を追加する拡張モジュールの一つです。武器のショットや弾の設定、また弓やスナイパーライフル、チャージショットの機能も追加出来ます。
ただこちらのアセットは敵のAIは触れられていないので（一応[Combat](https://docs.gamecreator.io/shooter/shooter/examples/example-6-combat)という項目にサンプルがありますが）もし敵のAIを作りたい場合は、別のモジュールとして[Behavior](https://assetstore.unity.com/packages/tools/ai/behavior-141443)があり、そちらを取り入れたほうがよいかなと思います。

# 必要なもの
ShooterModuleはGameCreatorのモジュールです。GameCreatorにはShooterModuleは付属していません。またShooterModule単体では動作しません。
- [GameCreator](https://assetstore.unity.com/packages/templates/systems/game-creator-89443?aid=1100l36uR&utm_source=aff)
- [Shooter Module](https://assetstore.unity.com/packages/templates/systems/shooter-155705?aid=1100l36uR&utm_source=aff)

# 準備
- GameCreatorをインストール
- ShooterModuleをインストール
- ShooterModule Exampleをインストール

ShooterModuleやShooterModule Exampleを入れる場合、Unityの上部メニューから[Game Creator]>[Module Manager]を選択してください。Module Managerのウィンドウが開きます。それぞれの拡張モジュールの部分にEnableボタンがあると思うのでそれを選択するとインストールが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/45ba4b9e-685f-58b0-b820-9435fd1e2e99.png)

# 銃を撃つのに必要なTriggerとActionを追加する
銃を撃つためには、少なくとも以下のTriggerとActionが必要です
- 武器（銃）をプレイヤーが装備する
- 弾を武器（銃）に込める
- ターゲットを狙う（エイムする）
- 武器（銃）から弾を放つ

## 武器（銃）をプレイヤーが装備する
***OnKeyDown***を押してConditionsを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/237859f6-6f43-3a72-ab68-74ccb180aefb.png)

ConditionsにはIsArmedを追加します。
***IsArmed***は銃を装備しているかしていないかを判別するConditionsです。


銃を装備している場合は銃を戻す、銃を装備していない場合は銃を装備する処理を追加します。

1. Conditions IfにIsUnarmedを追加
2. ThenにDrawWeaponアクションを追加し、Revolerを設定
3. ElseにHolsterアクションを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/97208b6c-40b9-8698-5b60-3c538b56a0f2.png)

## 弾を武器（銃）に込める
武器に弾を込めるには、あらかじめ銃をプレイヤーが装備している必要があります。装備していない場合に武器を込めるアクションを実行しても、何も起こりません。武器の装備は1つ前の[武器（銃）をプレイヤーが装備する]項目を参考にしてください。

1. OnKeyDown Actionを作り、Rキーを設定する
2. ***Reload Weapon***というActionを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/9696e3b4-42f7-a10e-5b87-248d71ef9d0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/7787ae11-78b4-5664-a413-e3082dc2a21d.png)


## ターゲットを狙う（エイムする）
武器を装備し、弾を込めました。しかしもう1つやることがあって、それはプレイヤーの状態をエイム状態にしないと弾を撃てません。そのActionは***Weapon Aim***です。

1. エイム用のトリガーとして、***OnKeyDown***と***OnKeyUp***の2つのトリガーを追加し、KeyCodeをLeft Shiftに設定する
2. OnKeyDownのトリガーに、Actionを追加し、エイムを開始する処理を追加
3. OnKeyUpのトリガーに、Actionを追加し、エイムを終わる処理を追加

Aimを開始するActionの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/830e949d-022a-582b-bb25-bef5ecda91ed.png)

Aimを終了するActionの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/14ae7a3e-3e14-e207-51cd-d4325892d9d4.png)


## 武器（銃）から弾を放つ
武器を構える、武器に弾が込められている、エイムしている状態が完了すれば、弾を撃つActionが実行できます。弾を撃つActionは***Weapon Shoot***です。

1. OnMouseDownトリガーを追加し、MouseButtonをLeftに設定
2. Weapon ShootのActionを追加し、CharacterをPlayerに変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/d788c747-c7bd-3d84-26ef-55a8ccc2795f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/6d6a755e-491d-8ed8-0deb-8bb76f290457.png)


## 弾の補充
また、弾を撃つ前に、1つ以上の弾をプレイヤーに与える必要があります。
追加するタイミングはシーンの開始時点***OnStart***にトリガーを追加して、Actionは***Give Ammo***を追加します。
Ammoは銃のタイプごとに指定できます。今はBullets（Revolverの弾）を指定しています。Operationには追加型の[Add]とその数値分セットする[Set]があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/deb67889-d2f8-0438-128e-a6c062621227.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/d47fdd73-c046-7472-e2a3-88840ff7ae45.png)

## 残弾数の表示
一応ここまでで弾を撃てますが、確認のために画面上に武器に込められている弾の数と残りの保持している弾の数が表示されてほしいところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/7ade59f8-437d-60e3-87e4-346a298b4177.png)

これは、UnityのCanvasオブジェクトを作り、***Ammo UI***と***Canvas Render Mode***のスクリプトを追加します。
Ammo UIには、Ammo Name（弾の名前）,Ammo In Clip(武器に込められている弾の数),Anmmo In Storage(保持している武器の総数)にそれぞれTextがアタッチされているゲームオブジェクトを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/018970e8-ca5a-3c40-ff56-0d3e270d06fb.png)


## 実行
Unityを再生すると、まず弾が補充されます
次にEキーを押すとリボルバーを装備し
Rキーを押すかマウスを左クリックすると装填中のモーションに入ります。
Left Shiftキーで武器をエイムし、左クリックでリボルバーのトリガーを引きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/47b58a1d-a8b1-752e-922e-b03ad60fbc4b.png)


# カスタマイズ
ここまではShooterモジュールのサンプルを参考にしてとりあえず弾を撃てるように動かしてみました。
アサルトライフルやマシンガンなどといった武器を追加したくなってきます。

使ったリボルバーの設定を確認してみます。ShooterModuleのサンプルから武器（Weapon）と弾(Ammo)の設定を確認します。
### Revolver(武器)
マウスクリックするたびに6発の弾を放つ銃です。自作する場合は[Creator] > [GameCreator] > [Shooter] > [Weapon]から作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/634ecea5-591e-5c56-c120-e9a62063a30a.png)

###  Bullets（弾）
Revolver用の弾です。自作する場合は、[Creator] > [GameCreator] > [Shooter] > [Ammo]から作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/8fe89c12-2468-6bd9-736b-39ba4cc8225b.png)

### カスタマイズした武器と弾の作成
カスタマイズした銃としてマシンガンを作ります。モデルとなるアセットを用意します。今回はフリーなアセット[Machine Guns](https://assetstore.unity.com/packages/3d/props/guns/machine-guns-20611)をプロジェクトにインポートして、これを使ってみます。

1. [Creator] > [GameCreator] > [Shooter] > [Weapon]でマシンガンを作成（machinegun）
2. [Creator] > [GameCreator] > [Shooter] > [Ammo]でマシンガンの弾を作成（machinegunbullet）
3. MachineGunというPrefabを作成する。このPrefabには、Model（Machinegunの3Dモデル）とMuzzle（弾が発射される位置を空のゲームオブジェクトで設定）という子オブジェクトを追加する
4. machinegunの[General]->[Default Ammo]をmachinegunbulletに設定、[3DModel]->[Prefab]をMachineGunに設定
5. machinegunbulletの[General]->[Clip Size]を50に設定

MachineGunのPrefabは以下の通り。Muzzleゲームオブジェクトには、***Weapon Muzzle***を付けて、Radiusを調整しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/800db93d-bc05-cf1c-895a-9ce7626d60eb.png)

MachineGunのWeaponの設定は下記の通りにしてます。一部Revolverの設定値と同じものを使ってます（本来はそれ用のアニメーションを用意できればよかったのですが、なかったのでRevolverのアニメーションステートを使いまわしてます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/40645be2-5799-69ad-6158-611ddf5297db.png)
弾の設定。いっぱい撃ちたいので[Clip Size]を50に設定してます。[Aiming]の[Crosshair]は今回なくても大丈夫です。(Noneに設定しても大丈夫だと思います)
また、マズルフラッシュ（弾を撃った時に銃口から出るエフェクト）を[Shooting]>[Prefab Muzzle Flash]に、撃った後の煙のエフェクトを[Shooting]>[Prefab Impact Effect]に設定できます。今回はRevolverと同じものを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/90c2646c-c6a1-b54e-4ea8-4462c814daf2.png)

## カスタムトリガーの作成
マウスをクリックしたら一定間隔ごとにActionを実行するトリガーを追加したいところですが
GameCreatorにはそのようなトリガーが用意されていないようなので、自前でカスタマイズしたトリガーを作り
そこからShootWeaponアクションを呼び出すようにしてみます。

カスタムトリガーの詳しい作り方や解説は[公式ドキュメント-CustomTriggers](https://docs.gamecreator.io/game-creator/systems/game-creator-api/custom-triggers)をご覧ください。
[Create]>[GameCreator]>[Developer]>[C# Igniter]を選択すると、Igniterクラスが作られます。Igniterがやることは何をトリガーにしてActionを実行するかを`ExecuteTrigge`で呼び出すだけです。下記に示した`IgniterMouseHoldingLeft.cs`はマウスの左クリックで`TimeOut`間隔に弾を撃ち出すサンプルです。

```C#:IgniterMouseHoldingLeft.cs
namespace GameCreator.Core
{
	using System.Collections;
	using System.Collections.Generic;
	using UnityEngine;

    [AddComponentMenu("")]
    public class IgniterMouseHolding : Igniter 
	{
#if UNITY_EDITOR
        public new static string NAME = "My Igniters/Igniter MouseHolding";
#endif
        public float TimeOut;
        private float mDeltatime = 0.0f;

        private void Update()
        {
            mDeltatime += Time.deltaTime;

            if (Input.GetMouseButton(0)) {
                if (mDeltatime > TimeOut) {
                    this.ExecuteTrigger(gameObject);
                }
            }

            if (mDeltatime >= TimeOut) {
                mDeltatime = 0.0f;
            }
        }
	}
}
```

カスタムトリガーをゲームオブジェクトに設定するのは、普段のTriggerと同じです。先ほどのコード上でstatic変数の`Name`に設定した名前がそのままカスタムトリガーの名前になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/fbf8df50-1a58-78fa-16e3-6c20dc228d5e.png)
TimeOutを0.1に設定します。またActionには***Weapon Shoot***があるActionを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/4a8d8280-a614-c60f-c2b8-e090864f03e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517786/6bdf10d9-be5c-322b-3315-3dfa56ca7678.png)

# 最後に
この記事を書いている最中に、Youtubeに[公式の解説動画](https://www.youtube.com/watch?v=c2HJKxVhHh8&feature=youtu.be)が上がってました。こっちでは杖から魔法を出す方法について取り扱ってますが、各propertyについても解説してくれているので参考になります。