GunController 안에 AmmoSystem Class 를 따로 구현했다.
canReload
는 남은 탄약이 있고, 현재 장전된 탄약이 탄창 용량보다 작으면 true
public class AmmoSystem
{
public int magAmmo;
public int magCapacity;
public int remainAmmo;
public bool canReload { get => this.remainAmmo > 0 && this.magAmmo < this.magCapacity; }
public AmmoSystem(int magCapacity, int totalAmmo)
{
this.magAmmo = magCapacity;
this.magCapacity = magCapacity;
this.remainAmmo = totalAmmo - magAmmo;
}
public void Reload()
{
int addAmmo = this.magCapacity - this.magAmmo;
if (this.remainAmmo < addAmmo)
{
addAmmo = this.remainAmmo;
this.remainAmmo = 0;
}
else
{
this.remainAmmo -= addAmmo;
}
this.magAmmo += addAmmo;
}
}
public class GunController : MonoBehaviour
{
...
public int magCapacity = 30;
public int totalAmmo = 60;
public AmmoSystem ammoSystem;
private void Start()
{
...
ammoSystem = new AmmoSystem(magCapacity, totalAmmo);
}
private void FireWeapon()
{
if (ammoSystem.magAmmo <= 0) return;
ammoSystem.magAmmo--;
...
}
public void OnReload()
{
ammoSystem.Reload();
}
}
public class RobotInputHandler : MonoBehaviour
{
...
public InputAction reloadAction;
private void Start()
{
...
reloadAction.Enable();
...
reloadAction.performed += context =>
{
if (!gunController.ammoSystem.canReload) return;
reloadEvent.Invoke();
}
}
}
public class RobotAnimationController : MonoBehaviour
{
public void OnReload()
{
animator.SetBool("isReload", true);
}
}
Input 처리 코드를 작성해 주었다.
Reload 애니메이션을 제어하기 위해 animator 에 ReloadController
를 부착했다.
isReload
값을 false
로 설정한다.aimReload
변수)GunController
클래스의 OnReload
함수를 실행시킨다.public class ReloadController : StateMachineBehaviour
{
private bool aimReload = false;
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
aimReload = animator.GetBool("isAim");
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (!aimReload && animator.GetBool("isAim"))
{
animator.SetBool("isReload", false);
}
if (stateInfo.normalizedTime > 1)
{
animator.transform.GetComponentInChildren<GunController>().OnReload();
animator.SetBool("isReload", false);
}
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.SetBool("isReload", false);
}
}
재장전 성공
재정전 중단 (Interrupted)
조준 중 재장전
걸으면서, 앉아서, 서서, 뛰면서 Reload 애니메이션이 재생되도록 하기 위해서
Animation Mask 설정을 해 주었다.
본 상단만 애니메이션을 적용시키기 위해 위와 같이 설정했다.
뛰면서 장전
앉아서 장전
조준하면서 (걸으며) 장전