マガジンのアイテムを拾った時に、予備の銃弾の数を増やします。
まず、注射器型のマガジンにレイが当たると手のマークを表示し、マウスクリックやキー入力で拾います。
else if (rayHitDistance <= armLength && hitColliderTag == "Magazine")
{
imgComp.sprite = hand[0];
image.SetActive(true); // 手のマークを出す
if (Input.GetMouseButtonDown(1))
{
itemColl = hit.collider;
item = itemColl.gameObject;
MagazineTest sc_m = item.GetComponent<MagazineTest>();
if (TransferBullets(sc_m))
{
Destroy(item);
}
}
}
拾うとマガジンから予備へ弾を移し替えるメソッドを呼びます。引数にマガジンに付けたスクリプトを渡します。マガジンが空になるとtrueが返ってマガジンが破壊されるようにしました。
// マガジンに付けたスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MagazineTest : MonoBehaviour
{
public int Capacity { get; } = 30;
public int bullets = 30;
}
リロードはステートマシンのスクリプトで行います。
int bullets_load = 30; // 装填されている弾数
int bullets_load_cap = 30; // 装填できる最大
public int bullets_spare = 50; // 予備の弾数
public int bullets_spare_cap = 100; // 予備弾数の最大
// ----
// リロードする
if (Input.GetKeyDown(KeyCode.R))
{
int reload = bullets_load_cap - bullets_load; // リロードしたい弾数
// 十分な予備があるとき
if (bullets_spare >= reload)
{
bullets_load += reload; // 満タンにする
bullets_spare -= reload; // その分予備から引く
}
// ないとき
else {
bullets_load += bullets_spare; // 予備弾数をすべて加える
bullets_spare = 0; // 予備弾数を0にする
}
animator.SetBool("NoAmo", false);
}
予備の銃弾の数には制限があるので、マガジンからは所持できる数だけ銃弾を抜き取ります。
PlayerStateMachine sm_player;
bool TransferBullets(MagazineTest sc_m)
{
int m = sc_m.bullets; // 拾ったマガジンに入っている弾数
// 全て持てるとき
if (sm_player.bullets_spare_cap - sm_player.bullets_spare >= m)
{
sc_m.bullets = 0; // 拾ったマガジンを空にする
sm_player.bullets_spare += m; // 予備弾数にすべて含める
return true;
}
else {
sc_m.bullets -= sm_player.bullets_spare_cap - sm_player.bullets_spare; // マガジンから所持できる数だけ抜き取る
sm_player.bullets_spare = sm_player.bullets_spare_cap; // 予備弾数を最大にする
return false;
}
}
冒頭のGIFでは、予備が50あるときにマガジンを拾うと予備弾数が30増えて80になりマガジンは消えますが、もうひとつ拾うと、20しか増えず、マガジンは消えません。
予備弾数に十分に余裕があればマガジンの残りの弾数が全て移って、マガジンは消えます。