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

回答編集履歴

3

引用が正しくなかったので修正

2017/08/07 10:35

投稿

fiveHundred
fiveHundred

スコア10520

answer CHANGED
@@ -34,6 +34,7 @@
34
34
  解決済みとのことですが、少々問題になりそうな点があったので、追記します。
35
35
 
36
36
  > Update()内に直接書いている時点で~
37
+
37
38
  と言いましたが、これは関数化するべきというわけではありません。
38
39
  (明らかに誤解を招く表現で申し訳ないです…)
39
40
  これは、「```Animator.Play()```は1回呼べば十分なのに、なぜ```Update()```で毎回呼んでいるんだ…」ということです。

2

追記2

2017/08/07 10:35

投稿

fiveHundred
fiveHundred

スコア10520

answer CHANGED
@@ -21,9 +21,67 @@
21
21
  正直、```Update()```内に直接書いている時点で、プログラミングをあまり理解していないとしか思えないです。
22
22
  まずは基本的なことから、プログラミングを理解しましょう。
23
23
 
24
- ```Animator.Play()```を使って、アニメーションをオブジェクト別に制御することは出来ます。
24
+ ``Animator.Play()``を使って、アニメーションをオブジェクト別に制御することは出来ます。
25
25
  制御の方法については、すごくざっくり言うと、「○○だったとき、Playする」といった感じです。
26
26
  実装に必要な知識を挙げてみると、以下の通りです(過不足はあると思いますが)。
27
27
  ・if文(ものすごく当たり前ですが)
28
28
  ・「○○だったとき」の○○を取得する方法
29
- ・他のオブジェクトにあるComponentを取得・操作する方法
29
+ ・他のオブジェクトにあるComponentを取得・操作する方法
30
+
31
+ ---
32
+
33
+ 追記2:
34
+ 解決済みとのことですが、少々問題になりそうな点があったので、追記します。
35
+
36
+ > Update()内に直接書いている時点で~
37
+ と言いましたが、これは関数化するべきというわけではありません。
38
+ (明らかに誤解を招く表現で申し訳ないです…)
39
+ これは、「```Animator.Play()```は1回呼べば十分なのに、なぜ```Update()```で毎回呼んでいるんだ…」ということです。
40
+ もし、仮に```Update()```に書くのであれば、このようにif文と組み合わせて書くべきでしょう
41
+ ```C#
42
+ void Update() {
43
+ if (再生したい条件) {
44
+ gameObject.GetComponent<Animator>().Play("ステート名");
45
+ }
46
+ }
47
+ ```
48
+
49
+ また、待機用と再生用の別々のAnimationControllerを用意するよりも、1つのAnimationControllerに待機用のStateと再生用のStateを用意するほうがよいです。
50
+ 以下、サンプルソースとAnimationControllerの設定です。
51
+ ```C#
52
+ using System.Collections;
53
+ using System.Collections.Generic;
54
+ using UnityEngine;
55
+
56
+ public class AnimationPlayer : MonoBehaviour
57
+ {
58
+ bool alreadyPlaying = false; // 再生済みならtrue
59
+
60
+ void Update()
61
+ {
62
+ Animator animator = gameObject.GetComponent<Animator>();
63
+ AnimatorStateInfo animInfo = animator.GetCurrentAnimatorStateInfo(0);
64
+ if (!alreadyPlaying)
65
+ {
66
+ if (!animator.GetBool("playFlag"))
67
+ {
68
+ animator.SetBool("playFlag", true); // 再生
69
+ }
70
+ else if (!(animInfo.normalizedTime < 1.0f))
71
+ {
72
+ animator.SetBool("playFlag", false); //再生が終了し、待機状態に戻す
73
+ alreadyPlaying = true;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ ```
79
+
80
+ AnimationController
81
+ ![全体](31b8fd0c127f163dbb39d46e192ee946.png)
82
+
83
+ wait→play間の矢印
84
+ ![wait→play](fdd3df95990296e7f94901ab879033d5.png)
85
+
86
+ play→wait間の矢印
87
+ ![play→wait](db09ff4a0d000d74c1df9a315bfb0d51.png)

1

追記

2017/08/07 10:34

投稿

fiveHundred
fiveHundred

スコア10520

answer CHANGED
@@ -11,4 +11,19 @@
11
11
  よって、アニメーションの終わりになっているかどうかを検知してから、次の```GetComponent<Animator>().Play();```を実行する、といったことをする必要があります。
12
12
 
13
13
  アニメーションの終わりになっているかどうかについては、以下のページが参考になると思います。
14
- [http://tsubakit1.hateblo.jp/entry/2016/02/11/021743](http://tsubakit1.hateblo.jp/entry/2016/02/11/021743)
14
+ [http://tsubakit1.hateblo.jp/entry/2016/02/11/021743](http://tsubakit1.hateblo.jp/entry/2016/02/11/021743)
15
+
16
+ ---
17
+
18
+ 追記:
19
+ ``void Update()``内に書かれた処理は、アタッチされた全てのオブジェクトごとに、毎フレーム実行されます。
20
+ よって、アタッチされた全てのオブジェクトで同時に再生されてしまうのは当たり前です。
21
+ 正直、```Update()```内に直接書いている時点で、プログラミングをあまり理解していないとしか思えないです。
22
+ まずは基本的なことから、プログラミングを理解しましょう。
23
+
24
+ ```Animator.Play()```を使って、アニメーションをオブジェクト別に制御することは出来ます。
25
+ 制御の方法については、すごくざっくり言うと、「○○だったとき、Playする」といった感じです。
26
+ 実装に必要な知識を挙げてみると、以下の通りです(過不足はあると思いますが)。
27
+ ・if文(ものすごく当たり前ですが)
28
+ ・「○○だったとき」の○○を取得する方法
29
+ ・他のオブジェクトにあるComponentを取得・操作する方法