【バイオハザード風のゲームを作ってみよう。その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
今回は以上です。