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

回答編集履歴

2

追記

2017/03/06 12:16

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -62,4 +62,50 @@
62
62
  // ..
63
63
 
64
64
  return Action.None;
65
- ```
65
+ ```
66
+
67
+ #追記
68
+
69
+ コルーチンの呼び出し方がわからない、という意味でしょうか。
70
+ 僕に書けるのはリファレンスから想像して書くぐらいですが
71
+
72
+ マニュアル通りだと、あるアニメーションの排他制御は以下のような形になると思います。
73
+
74
+ ```C#
75
+ public class Sample : MonoBehaviour
76
+ {
77
+ private Animation animation;
78
+ private bool isRunning;
79
+
80
+ void Start()
81
+ {
82
+ animation = GetComponent<Animation>();
83
+ }
84
+
85
+ void Update()
86
+ {
87
+ if (Input.GetKey(KeyCode.Space))
88
+ {
89
+ StartCoroutine(Concurrent());
90
+ }
91
+ }
92
+
93
+ private IEnumerable Concurrent()
94
+ {
95
+ if (isRunning) yield break;
96
+
97
+ isRunning = true;
98
+
99
+ animation.Play("Sample1");
100
+
101
+ yield return new WaitUntil(() => !animation.IsPlaying("Sample1"));
102
+
103
+ isRunning = false;
104
+ }
105
+ }
106
+ ```
107
+
108
+ yield return で次にいつアクションを実行するのかを制御するようですから、例えば1秒かけて動作させるとかそういった条件を合わせて書いておくといいでしょう。
109
+
110
+ Updateメソッドは毎フレーム呼ばれますが、Concurrentが1度実行状態に入るとアニメーションが終わるまでは`yield return new WaitUntil`を超えることができません。
111
+ そして、アニメーションが終わった後にフラグがfalseになる、という想定です。

1

よりサンプルを具体的にしました

2017/03/06 12:16

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,5 @@
1
1
  ※僕はUnityやってないし、ゲームプログラマーでもないから参考程度に
2
2
 
3
-
4
3
  現在のアクションの実行状態を何等かの形で管理しましょう。
5
4
  複数通りの管理方法があると思います。
6
5
 
@@ -12,9 +11,11 @@
12
11
  if (IsDoingSomething) yield break;
13
12
  IsDoingSomething = true;
14
13
 
15
- // 戻ってくる条件を返す。例えばアニメーション中とか、地面に着地するまでとか。
14
+ animation.Play("DoSomething");
16
- yield return ?
17
15
 
16
+ // 戻ってくる条件を返す。例えばアニメーションが終わるまで、とか。
17
+ yield return new WaitUntil(() => !animation.IsPlaying("DoSomething"));
18
+
18
19
  IsDoingSomething = false;
19
20
  }
20
21
  ```