鉄砲足軽を作る

合戦のあり方を変えた火縄銃。
今回は、そんな火縄銃を操る鉄砲足軽を作ります。
合戦において、彼らはどのように戦ったのでしょうか。

鉄砲が合戦に導入された初期段階では鉄砲による死傷者は記録されておらず、威嚇程度の効果しかなかったようです。
しかし、1558年以降になると矢と並んで鉄砲による死傷者が増え始め、やがて槍よりも鉄砲による死傷が多くなっていきました*1


発砲してから次弾の発射準備が完了するまでの時間は約40秒、早合を使った場合は約20秒かかります。

プログラム

弾を撃つ

火縄銃を撃つアニメーションができたところで、実際に弾を打てるようにしましょう。
まずは弾のオブジェクト[Bullet]を作ります。
f:id:tatsuyann:20190118220105p:plain
弾をまっすぐ前進させるため、[Bullet]にスクリプト[Bullet.cs]を追加し以下のコードを書きます。

int speed = 100;

void Update () {
    // 弾を前進させる
    transform.position += transform.forward * Time.deltaTime * speed;
}

そして[Bullet]のポジションを全て0にしてからプレハブ化し、[Hierarchy]から削除します。
次に、弾がちゃんと銃口から発射されるようにします。銃口の位置に空オブジェクト[muzzle]を作り、[Gun]の子オブジェクトにします。
f:id:tatsuyann:20190118224337p:plain
Gunman.csを編集し、[muzzle]から弾が出るようにします。ただし、ボタンを押してから構えて狙うアニメーションが約3.5秒あるので、実際に弾が出るのはボタンを押してから3.5秒後にしたいです。そこで、発砲の処理をShootingActionメソッドに書き、それをInvokeメソッドで3.6秒待ってから実行するようにしました。

public GameObject bullet;
public GameObject muzzle;

void Update () {
    if (Input.GetButton("Fire1")) {
	gunanimator.SetBool("is_fire", true);
	Invoke("ShootingAction", 3.6f);
    } else {
	gunanimator.SetBool("is_fire", false);
    }
}

void ShootingAction() {
    Instantiate(bullet, muzzle.transform.position, transform.rotation);
}

弾を消滅させる

弾は撃っているとどんどん溜まってきて処理が重くなるので、不要になった弾は消す必要があります。
ここでは、地面に当たった時と有効射程に達した時に消滅するようにします。
ちなみに火縄銃の最大射程は700mほどですが、有効射程は100m程のようです*2
よって、ゲーム内でも弾が100m程進んだ時点で消滅させることにします。

エフェクト

火縄銃を撃った時に、煙が出るようにします。

*1:東郷隆 (2017)『雑兵足軽たちの戦い』講談社文庫.

*2:渡邊大門 (2016)「合戦を制した戦国最強武器の真実」,『歴史人』2016年10月号,p86,KKベストセラーズ