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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

受付中

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

creatorsGame
creatorsGame

総合スコア18

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0リアクション

0クリップ

8992閲覧

投稿2020/03/08 10:04

編集2020/03/08 10:05

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

c#

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ページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。