【バイオハザード風のゲームを作ってみよう。その15】

今回も下記をやっていきます。
youtu.be

今回はリロードシステムを拡張し、アイテムボックスから装備している銃にリロードできるようにします。

・下記を追加します。

public class WeaponItem : Item //EP4追加 M1911にアタッチ.
{
    [Header("Weapon Animation")]
    public  AnimatorOverrideController weponAnimatior; //今ある Animator Controllerの拡張を可能にするアセット

    [Header("Weapon Damage")]
    public int damage = 20; //EP13追加

    [Header("Ammo")]
    public int remainingAmmo = 0; //EP14追加
    public int maxAmmo = 12;      //EP15追加
    public AmmoType ammoType;    //EP15追加
}

・武器のタイプを下記で設定します。

public class Enums : MonoBehaviour //EP15追加
{
   
}

public enum AmmoType
{
    pistal,
    shotgun
}

スクリプトを追加していきます。

public class InputManager : MonoBehaviour
{
 private void HandReloadInput()
    {
        //We do not want to be able to reload while being damaged, shooting, quick turning etc
        if (playerManager.isPreformingAction)
            return;

        //
        if (reloadInput)
        {
            reloadInput = false;

            //残弾数がmaxの場合、リロードは行わない
            if (playerManager.playerEquipmentManager.weapon.remainingAmmo == playerManager.playerEquipmentManager.weapon.maxAmmo) //EP15追加
            {
                Debug.Log("AMMO ALREADY FULL");
                return;
            }

            //Check to see if we have ammo in our inventory for this weapon, if we do not rerturn EP15追加
            if(playerManager.playerInventroyManager.currentAmmoInventory != null)
            {
                if (playerManager.playerInventroyManager.currentAmmoInventory.ammoType==playerManager.playerEquipmentManager.weapon.ammoType)
                {
                    //残弾数が0の場合リロードを行わない
                    if (playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining == 0)
                        return;

                    int amountOfAmmoToReload=0;
                    //変数に銃の最大弾数ー現在装填されている弾数に代入
                    amountOfAmmoToReload = playerManager.playerEquipmentManager.weapon.maxAmmo - playerManager.playerEquipmentManager.weapon.remainingAmmo;

                    //If we have MORE ammo remaining than we need to drop into our weapon, we subtract the amount needed from our TOTAL amount
                    //In our players inventory
                    //ボックスの弾数が装填したい弾数よりも多い場合
                    if (playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining >= amountOfAmmoToReload)
                    {
                        //装備中の銃に装備可能な最大弾数を装填
                        playerManager.playerEquipmentManager.weapon.remainingAmmo += amountOfAmmoToReload;
                        //ボックス弾数から装填した弾数を引く
                        playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining =
                            playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining - amountOfAmmoToReload;
                    }

                    //If we have LESS ammo remaining than we needed to drop into our weapon, then we just subtract what ever is remaining and drop it into
                    //our players weapom
                    //ボックスの弾数が装填したい弾数よりもすくない場合
                    else
                    {
                        //ボックスにある分だけ装備中の銃に装填
                        playerManager.playerEquipmentManager.weapon.remainingAmmo = playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining;
                        //ボックス中の弾数を0にする
                        playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining = 0;
                    }
                    //ハンドIKのウェイトを0にする
                    playerManager.animatorManager.ClearHandIKWeights();
                    //アニメーション"Pistol Reload"を実行
                    playerManager.animatorManager.PlayAnimation("Pistol Reload", true);
                    //装備中の銃の弾数を画面に表示
                    playerManager.playerUIManager.currentAmmoCountText.text = playerManager.playerEquipmentManager.weapon.remainingAmmo.ToString();
                    //ボックス中の弾数を画面に表示
                    playerManager.playerUIManager.reservedAmmoCountText.text = playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining.ToString();
                }
            }
        }
    }
public class PlayerInventroyManager : MonoBehaviour //EP15追加 プレイヤーにアタッチ
{
    //THIS IS TEMP.
    //THIS WILL CHANGE DRAMATICALLY WHEN WE INTRODUCE RE STYLED INVENTORY SYSTEM
    public BoxOfAmmoItem currentAmmoInventory;
}
public class BoxOfAmmoItem : Item
{
    public AmmoType ammoType;           //補充する対象の銃タイプ
    public int ammoRemaining = 50;      //ボックス中の残弾数
    public int boxOfAmmoCapacity = 50;  //ボックスに保管可能な最大弾数
}
public class PlayerEquipmentManager : MonoBehaviour //EP4追加.playerにアタッチ
{

 void LoadCurrentWepon()
    {
        //LOAD THE WEPON ONTO PLAYERS HANDS
        weaponLoaderSlot.LoadWeaponModel(weapon);

        //CHANGE OUR PLAYERS MOVEMENT/IDLE ANIMSTIONS TO THE WEPONS MOVEMENT/IDLE ANIMATIONS
        playerManager.animatorManager.animator.runtimeAnimatorController = weapon.weponAnimatior;

        weaponAnimator = weaponLoaderSlot.currentWeaponModel.GetComponentInChildren<WeaponAnimatorManager>(); //EP7追加

        //EP5追加
        //右手/左手の武器の子オブジェクトRightHandIk/LeftHandIkを取得。
        rightHandIk = weaponLoaderSlot.currentWeaponModel.GetComponentInChildren<RightHandIkTarget>();
        leftHandIk = weaponLoaderSlot.currentWeaponModel.GetComponentInChildren<LeftHandIkTarget>();
        playerManager.animatorManager.AssignHandIK(rightHandIk ,leftHandIk); //EP14変更
        playerManager.playerUIManager.currentAmmoCountText.text = weapon.remainingAmmo.ToString(); //EP14追加

        //Check for ammo that supports this weapon in our Inventory EP15追加
        if (playerManager.playerInventroyManager.currentAmmoInventory != null)
        {
            if (playerManager.playerInventroyManager.currentAmmoInventory.ammoType == weapon.ammoType)
            {
                //武器装備直後のボックス中の弾数を画面に表示
                playerManager.playerUIManager.reservedAmmoCountText.text = playerManager.playerInventroyManager.currentAmmoInventory.ammoRemaining.ToString();
            }
        }
    }
}

プレイ動画です。
youtu.be

今回は以上です。