質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

Unity 指定したアニメーションの終了判定をしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 142

creatorsGame

score 18

今FPSゲームを作っていて、銃を構えたり弾を発射したりリロードしたりできるようにしたのですが、リロードアニメーションが終了していなくても弾が補充されてしまうので困っています。
なので、指定したアニメーションかステートの終了を検知をする方法を教えてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Weapon : MonoBehaviour
{
    public float fireRate = 15f;
    public int maxAmmo = 10;
    public int AmmoCount = 0;
    public float Damage = 10f;
    public float range = 100f;
    public float RandomShoot = 10f;
    private float RandomShootHold;
    public Camera fpscam;
    public float aimFOV = 30f;
    public float normarFOV = 80f;
    public enum ShootMode { FULLAUTO, SEMIAUTO }
    [SerializeField]
    ShootMode shootMode = ShootMode.FULLAUTO;

    private float nextTimeToFire = 0f;
    [SerializeField]
    private Transform muzzle;
    [SerializeField]
    GameObject bulletHole;
    public LayerMask canBeShot;
    public bool aim = false;


    public AudioClip ShootSound;
    AudioSource audioSource;
    public AudioClip ReloadSound;

    public GameObject[] muzzelFlash;
    private GameObject holdFlash;
    public Animator targetAnimator;


    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
        AmmoCount = maxAmmo;

    }
    private void Update()
    {
        /*if (targetAnimator.GetCurrentAnimatorStateInfo(1).IsName("Reload") && targetAnimator.IsInTransition(1))
        {
        }*/
            //Aim
            if (Input.GetButton("Fire2"))
            {
                aim = true;
                targetAnimator.SetBool("Aim", true);
                fpscam.fieldOfView = aimFOV;
            }
            else
            {
                aim = false;
                targetAnimator.SetBool("Aim", false);
                fpscam.fieldOfView = normarFOV;
            }
            //AimShoot
            if (aim && GetInput() && Time.time >= nextTimeToFire)
            {
                if (AmmoCount > 0)
                {
                    AmmoCount--;
                    nextTimeToFire = Time.time + 1f / fireRate;
                    Shot();
                    targetAnimator.SetTrigger("AimShoot");
                    RandomShootHold = RandomShoot / 10f;
                }
                else if (AmmoCount <= 0)
                {
                    ReloadF();
                }
            }
            //Shoot
            if (!Input.GetButton("Fire2") && GetInput() && Time.time >= nextTimeToFire)
            {
                if (AmmoCount > 0)
                {
                    AmmoCount--;
                    nextTimeToFire = Time.time + 1f / fireRate;
                    Shot();
                    targetAnimator.SetTrigger("Shoot");
                    RandomShootHold = RandomShoot;
                }
                else if (AmmoCount <= 0)
                {
                    ReloadF();
                }
            }
            if (AmmoCount < maxAmmo)
            {
                if (Input.GetButtonDown("Reload"))
                {
                    ReloadF();
                }
            } 
    }
        private void ReloadF()
        {
            AmmoCount = maxAmmo;
            targetAnimator.SetTrigger("Reload");
            audioSource.PlayOneShot(ReloadSound);
        }

        private void Shot()
        {
            RaycastHit hit;
            Vector3 positon = new Vector3(Random.Range(0,RandomShootHold), Random.Range(0, RandomShootHold),Random.Range(0, RandomShootHold));
            if (Physics.Raycast(fpscam.transform.position+positon, fpscam.transform.forward, out hit, range, canBeShot))
            {
                HP hp = hit.transform.GetComponent<HP>();
                GameObject newHole = Instantiate(bulletHole, hit.point + hit.normal * 0.001f, Quaternion.identity) as GameObject;
                newHole.transform.LookAt(hit.point + hit.normal);
                Destroy(newHole, 5f);
                if (hp != null)
                {
                    hp.TakeDamage(Damage);
                }
            }
            //muzzleFlash
            int randomNumberForMuzzelFlash = Random.Range(0, muzzelFlash.Length);
            holdFlash = Instantiate(muzzelFlash[randomNumberForMuzzelFlash], muzzle.transform.position /*- muzzelPosition*/, muzzle.transform.rotation * Quaternion.Euler(0, 0, 90)) as GameObject;
            holdFlash.transform.parent = muzzle.transform;
            audioSource.PlayOneShot(ShootSound);
        }

        private bool GetInput()
        {
            switch (shootMode)
            {
                case ShootMode.FULLAUTO:
                    return Input.GetMouseButton(0);
                case ShootMode.SEMIAUTO:
                    return Input.GetMouseButtonDown(0);
            }
            return false;
        }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

AnimationEventsを使用することで簡単に実現できるかと思います

https://qiita.com/aimy-07/items/58e77d3396ded286affc

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/09 11:12 編集

    すみません。AnimationEventsを使わない方法はありますか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る