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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1586閲覧

Textをアニメーション後に非アクティブ状態にする

YDK

総合スコア63

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/01 15:51

音ゲーを作っていて判定ラインのところでPerfect,Missの2つをアニメーションで表示しています。
コルーチンを使って指定時間後に非アクティブ状態にしているのですが、デバッグを実行してもその行には行かずに
終わってしまいます。コルーチンを使って中でアニメーションを呼び出しているのですが、最初のアクティブ状態に
する処理とアニメーションを開始する処理は通るのですがそれ以降の処理がなぜか通りません。
enabledをtrueにしたりfalseにしたりを中身に書いたりしたのですが、yield return new WaitForSeconds
の次の行が実行されません。なぜ実行されないのか等、具体的なことがあれば教えてください。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Notes : MonoBehaviour 7{ 8 private GameController _gameController; 9 [SerializeField] private int laneNum; 10 public static bool _inLine = false; 11 private KeyCode _laneKey; 12 private Animator[] _pAnim = new Animator[8]; 13 private Animator[] _mAnim = new Animator[8]; 14 15 void Start() 16 { 17 _gameController = GameObject.Find("GameController").GetComponent<GameController>(); 18 _laneKey = GameUtil.GetKeyCodeByLineNum(laneNum); 19 20 for (int i = 0; i < _pAnim.Length; i++) 21 { 22 _pAnim[i] = _gameController.perfectText[i].GetComponent<Animator>(); 23 } 24 for (int i = 0; i < _mAnim.Length; i++) 25 { 26 _mAnim[i] = _gameController.missText[i].GetComponent<Animator>(); 27 } 28 } 29 30 void Update() 31 { 32 this.transform.position += Vector3.down * 10 * Time.deltaTime; 33 34 if (this.transform.position.y < -3.8f) 35 { 36 StartCoroutine(MissAnimation(laneNum)); 37 } 38 39 if (this.transform.position.y < -5.0f) 40 { 41 this.gameObject.SetActive(false); 42 GameController._combo = 0; 43 _gameController.comboText.gameObject.SetActive(false); 44 } 45 46 if (_inLine) 47 { 48 TapNotes(_laneKey); 49 } 50 } 51 52 private void OnTriggerEnter2D(Collider2D collision) 53 { 54 _inLine = true; 55 StartCoroutine(PerfectAnimation(laneNum)); 56 this.gameObject.SetActive(false); 57 _gameController.GetUIText(laneNum); 58 } 59 60 private void OnTriggerExit2D(Collider2D collision) 61 { 62 _inLine = false; 63 } 64 65 private void TapNotes(KeyCode key) 66 { 67 if (Input.GetKeyDown(key)) 68 { 69 //StartCoroutine(PerfectAnimation(laneNum)); 70 //_gameController.GetUIText(laneNum); 71 //this.gameObject.SetActive(false); 72 } 73 } 74 75 private IEnumerator PerfectAnimation(int num) 76 { 77 _gameController.perfectText[num].gameObject.SetActive(true); 78 _pAnim[num].Play("Perfect", 0, 0.0f); 79 yield return new WaitForSeconds(0.3f); 80 _gameController.perfectText[num].gameObject.SetActive(false); 81 } 82 83 private IEnumerator MissAnimation(int num) 84 { 85 //_mAnim[num].enabled = true; 86 _gameController.missText[num].gameObject.SetActive(true); 87 _mAnim[num].Play("Miss", 0, 0.0f); 88 yield return new WaitForSeconds(0.3f); 89 //_mAnim[num].enabled = false; 90 _gameController.missText[num].gameObject.SetActive(false); 91 } 92}

該当のソースコードを載せておきます。
今はDebug中でOnTriggerEnter2Dの中でPerfectAnimation()を読んでいます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://docs.unity3d.com/ja/2019.4/Manual/Coroutines.html

Note: You can stop a Coroutine with StopCoroutine and StopAllCoroutines. A coroutines also stops when the GameObject it is attached to is disabled with SetActive(false). Calling Destroy(example) (where example is a MonoBehaviour instance) immediately triggers OnDisable and the coroutine is processed, effectively stopping it. Finally, OnDestroy is invoked at the end of the frame.

SetActive(false)するとコルーチンは止まります。なのでboolやenumで状態管理してPerfect, Miss判定後は判定前処理をスキップするように修正すればよさそうです。

投稿2020/10/01 19:05

shiena

総合スコア1827

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YDK

2020/10/02 04:41

すみません。判定前処理をスキップすることについてあまりよく理解していないのですが、 具体的にどのようにすればいいのでしょうか。
shiena

2020/10/02 04:51

ゲームの全体像が分からないので想像ですが、 1. ノーツ表示からの移動 2. PerfectかMiss判定 3. 指定時間経過後、ノーツ非表示 のフローがあり、1の部分を判定前処理と表現していました。 たとえばPerfect/Miss判定後にノーツを動かしたくないならUpdateでposition変更をスキップするなどです。特にスキップするものがなければ読み飛ばしてください。
YDK

2020/10/02 07:25

ノーツを非表示にするとコルーチンが止まるってことですか? テキストであるPerfect, Missを非表示にしたからコルーチンが止まるのだと思ってました。 よく考えればクラスをアタッチしてるのはNotesなので、勘違いしてました。 positionを変更することで消えたように見せるってことですよね。 ありがとうございます。このやり方でやってみます。
shiena

2020/10/02 07:47

> ノーツを非表示にするとコルーチンが止まるってことですか? 正確にはコルーチンを実行したgameObjectに対してSetActive(false)すると止まります。 なので_gameController.perfectText[num].gameObjectや_gameController.missText[num].gameObjectをSetActive(false)してもコルーチンは止まりません。 表示を消すのならMeshRendererなどをenabled = falseするとスクリプトは動いたままの状態にできます。
YDK

2020/10/02 12:44

色々試したんですが、アニメーションでα値を変えて実装しました。 色々と回答してくださってありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問