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

質問編集履歴

2

質問5追記

2021/08/21 07:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -139,4 +139,73 @@
139
139
  Destroy(this.gameObject);
140
140
  }
141
141
  }
142
+ ```
143
+
144
+ ### 追記
145
+
146
+ ・質問5で試みた実装。
147
+ ```C#
148
+ IEnumerator myLoopCoroutine;
149
+
150
+ bool loopCoroutineIsRunning = false;
151
+
152
+ void Start (){
153
+ }
154
+
155
+ void Update(){
156
+ if (Input.GetMouseButtonDown(0)){
157
+ // コルーチンを動かす。起動もしくは再開。
158
+ StartLoopCoroutine(2f);
159
+ }
160
+ if (Input.GetMouseButtonDown(1)){
161
+ // コルーチンの停止。
162
+ StopLoopCoroutine();
163
+ }
164
+ }
165
+
166
+ void StartLoopCoroutine(float second){
167
+ Debug.Log("Start coroutine");
168
+ if (loopCoroutineIsRunning){
169
+ Debug.LogError("Stop coroutine first!");
170
+ return;
171
+ }
172
+ if (myLoopCoroutine == null){
173
+ myLoopCoroutine = LoopCoroutine();
174
+ StartCoroutine(myLoopCoroutine);
175
+ Debug.Log("New coroutine is started");
176
+ }
177
+ if (myLoopCoroutine != null){
178
+ StartCoroutine(myLoopCoroutine);
179
+ Debug.Log("Resume paused coroutine");
180
+ }
181
+ loopCoroutineIsRunning = true;
182
+ }
183
+
184
+ void StopLoopCoroutine(){
185
+ Debug.Log("Stop coroutine");
186
+ if (myLoopCoroutine == null){
187
+ Debug.LogError("Start coroutine first!");
188
+ return;
189
+ }
190
+ if (loopCoroutineIsRunning){
191
+ StopCoroutine(myLoopCoroutine);
192
+ }
193
+ loopCoroutineIsRunning = false;
194
+ Debug.Log("Coroutine is completely stopped");
195
+ }
196
+
197
+ IEnumerator LoopCoroutine(){
198
+ while(true){
199
+ yield return MyCoroutine(3f);
200
+ }
201
+ }
202
+
203
+ IEnumerator MyCoroutine(float animationLength){
204
+ Debug.Log("MyCoroutine:開始");
205
+ for (float time = 0.0f; time < animationLength; time += Time.deltaTime){
206
+ Debug.Log(time);
207
+ yield return null;
208
+ }
209
+ Debug.Log("MyCoroutine:終了");
210
+ }
142
211
  ```

1

改行調整

2021/08/21 07:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -57,13 +57,13 @@
57
57
  [リファレンス](https://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.StopCoroutine.html)には、**StopCoroutineに関する、停止・破棄・再開に関する説明**は書かれていませんでした。
58
58
 
59
59
  ・質問3。
60
- 質問1がわからない状態ですが、コルーチンの無限呼び出しに開始・停止・終了処理の操作ができるようにしたいと思い、
60
+ 質問1がわからない状態ですが、コルーチンの無限呼び出しに開始・停止・終了処理の操作ができるようにしたいと
61
- 以下の実装を考えてみました。
61
+ 思い、以下の実装を考えてみました。
62
62
  質問1では、無限に呼び出すコルーチンを汎用的に引数でセットしたいと考えていましたが、
63
63
  コルーチンの多重起動防止のnullチェックを考えると、そのフラグをフィールドで持たせるしかなさそうなので、
64
64
  汎用的に無限に呼び出すコルーチンをセットすることは不可能になりそうと考えました(仮に可能であれば教えていただきたいです)。
65
- これより、目的を妥協し、特定のコルーチンの無限呼び出しの開始・停止・終了ができるように以下のように組みました。
65
+ これより、目的を妥協し、特定のコルーチンの無限呼び出しの開始・停止・終了ができるように以下のように
66
- ただ、ゲームを再生してみると、
66
+ 組みまし。ただ、ゲームを再生してみると、
67
67
  ①左クリックで「開始」のログが出ることを確認する。
68
68
  ②右クリックで、「終了」のログが出る前に停止する。
69
69
  ③再び、左クリックすると、「開始」のログが出力される。