弾数を制限して、弾を発射するたびに一つ減らしていき、0になったら撃てなくします。前の記事のスクリプトに少し加えるだけでできます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerStateMachine1 : StateMachineBehaviour
{
[SerializeField] GameObject bullet;
public Transform player;
bool attackable = true;
public AudioSource audioSource;
public AudioClip audioClip;
public Text text_2;
int bullets = 30; // 弾数
//OnStateEnter is called before OnStateEnter is called on any state inside this state machine
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.IsTag("Attackable"))
{
attackable = true;
}
}
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
text_2.text = bullets + "";
if (Input.GetMouseButton(0) && attackable && bullets > 0)
{
animator.SetTrigger("Attack");
attackable = false; // 攻撃不可能にする
if (animator.GetInteger("Weapon") == 5) // 武器が銃のとき
{
audioSource.clip = audioClip;
audioSource.Play();
var b = Instantiate(bullet, player.position + player.forward, player.rotation); // 銃弾を生成
Rigidbody r = b.GetComponent<Rigidbody>(); // 銃弾のRigidbody
r.AddForce(Vector3.Lerp(player.forward, player.up, 0.02f) * 38f, ForceMode.Impulse); // 銃弾を発射
bullets--;
// 弾が0以下のとき
if (bullets <= 0)
{
animator.SetBool("NoAmo", true);
}
}
}
// リロードする
if (Input.GetKeyDown(KeyCode.R))
{
bullets = 30;
animator.SetBool("NoAmo", false);
}
}
// OnStateExit is called before OnStateExit is called on any state inside this state machine
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
// 攻撃可能なステートを出たら攻撃不可能にする
if (stateInfo.IsTag("Attackable"))
{
attackable = false;
}
}
// OnStateMove is called before OnStateMove is called on any state inside this state machine
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateIK is called before OnStateIK is called on any state inside this state machine
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateMachineEnter is called when entering a state machine via its Entry Node
//override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
//{
//
//}
// OnStateMachineExit is called when exiting a state machine via its Exit Node
//override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
//{
//
//}
}
攻撃するときの条件に弾数を加えました。このときは銃以外の武器は一旦無視しました。
弾が0以下になるとブール型のパラメーターをtrueにします。弾が発射されてすぐに銃を構えるステートに戻った後に、これがtrueのときはもう撃てないときのステートに遷移します。
Rキーでリロードすると弾数が回復して、パラメーターをfalseにすることで構えるステートに戻ります。
もう撃てないステートでは1フレームしか無い静止したモーションが再生されますが、Transition Durationが0より大きいので、前後のモーションとブレンドされて自然に遷移します。