【Unity】弾数を制限する

投稿者: | 2020-08-04

弾数を制限して、弾を発射するたびに一つ減らしていき、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より大きいので、前後のモーションとブレンドされて自然に遷移します。

コメントを残す

メールアドレスが公開されることはありません。