teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/02/25 08:28

投稿

YAmaGNZ
YAmaGNZ

スコア10654

answer CHANGED
@@ -1,1 +1,71 @@
1
- コルーチンが起動中ならStopCoroutineで止めてからStartCoroutineしてはどうでしょう?
1
+ コルーチンが起動中ならStopCoroutineで止めてからStartCoroutineしてはどうでしょう?
2
+
3
+ ### 追記
4
+ 動作させたわけではないので、下記スクリプトが正常に動作しないかもしれませんが、こんな感じでしょうか。
5
+
6
+ スクリプトがどのようなオブジェクトにアタッチされているのか分からないので、適切なのか判断できませんが、とりあえず「マップから出た」というのを「OnTriggerExit2D」で判断できるものとしています。
7
+ ```C#
8
+
9
+ public GameObject text;
10
+ public Text placeText;
11
+ public bool Enter;
12
+ public string placeName;
13
+
14
+ Coroutine co;
15
+
16
+ private void OnTriggerEnter2D(Collider2D col)
17
+ {
18
+ if(col.tag == "Player")
19
+ {
20
+ if (Enter == true)
21
+ {
22
+ co = StartCoroutine(PlaceNameCo());
23
+ }
24
+ }
25
+ }
26
+ private void OnTriggerExit2D(Collider2D col)
27
+ {
28
+ if(col.tag == "Player")
29
+ {
30
+ if (Enter == true) //Enterが何を示すのもなのか分からなかったのでそのままにしてあります。
31
+ {
32
+ if (co != null)
33
+ {
34
+ StopCoroutine(co);
35
+ co = null;
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ private IEnumerator PlaceNameCo()
42
+ {
43
+ text.SetActive(true);
44
+ placeText.text = placeName;
45
+ yield return new WaitForSeconds(4f);
46
+ text.SetActive(false);
47
+ co = null;
48
+ }
49
+ ```
50
+
51
+ また別の案ですが、コルーチンの起動に関しては今まで通りとしてコルーチンにて
52
+ ```C#
53
+ private IEnumerator PlaceNameCo()
54
+ {
55
+ text.SetActive(true);
56
+ placeText.text = placeName;
57
+ if(int i = 0;i < 40 ; i++)
58
+ {
59
+ yield return new WaitForSeconds(0.1f);
60
+ if (placeText.text != placeName)
61
+ {
62
+ yield break;
63
+ }
64
+ }
65
+ text.SetActive(false);
66
+ co = null;
67
+ }
68
+ ```
69
+ といった感じでWaitするのを短時間でループするようにして、テキストが自分のマップ名ではなくなったらコルーチンを終了するようにすればどうでしょう?
70
+
71
+ ただ、私もUnityはほぼ知らないと言っていいので、もっと適切な書き方があるのではないかと思います。