回答編集履歴
10
微修正
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
自己解決しました.
|
2
2
|
|
3
|
-
- AnimatorによるアニメーションはUpdate()後に処理されるので,上書きされない為にLateUpdate()を利用する必要があるというのは正し
|
3
|
+
- AnimatorによるアニメーションはUpdate()後に処理されるので,上書きされない為にLateUpdate()を利用する必要があるというのは正しい
|
4
4
|
|
5
|
-
- 問題は,**Animatorは毎フレーム,そのアニメーション処理を行う際に最初にオブジェクトを初期状態の姿勢にリセットしている**事
|
5
|
+
- 問題は,**Animatorは毎フレーム,そのアニメーション処理を行う際に最初にオブジェクトを初期状態の姿勢にリセットしている**事
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -12,11 +12,11 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされているが,変化が無いように見えた
|
15
|
+
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされているが,前フレームでの回転分が失われる為に変化が1フレーム分しか無いように見えていたのだと思われます.
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
(
|
19
|
+
(また,LookAtの場合は問題無く実行されていたのは,Rotateは現在の回転状態を起点としてあとどれだけ動かすのかという処理であるのに対して,LookAtは現在の状態に関係なくターゲットオブジェクトを見る方向を新たに代入する処理である為でしょう.)
|
20
20
|
|
21
21
|
|
22
22
|
|
9
補足
test
CHANGED
@@ -13,6 +13,10 @@
|
|
13
13
|
|
14
14
|
|
15
15
|
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされているが,変化が無いように見えた様です.
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
(という訳で,LookAtの場合問題無く実行されるのは,Rotateは現在の回転状態を起点としてあとどれだけ動かすのか,という処理であるのに対してLookAtは現在の状態には関係なくターゲットオブジェクトを見る方向を新たに代入する様な処理の為でしょう.)
|
16
20
|
|
17
21
|
|
18
22
|
|
8
補足
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
Transform arm;
|
38
38
|
|
39
|
-
Quaternion r;
|
39
|
+
Quaternion r;//スタート時点からの累積回転量
|
40
40
|
|
41
41
|
|
42
42
|
|
7
誤字
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされている
|
15
|
+
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされているが,変化が無いように見えた様です.
|
16
16
|
|
17
17
|
|
18
18
|
|
6
完全理解
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
自己解決しました.
|
2
2
|
|
3
3
|
- AnimatorによるアニメーションはUpdate()後に処理されるので,上書きされない為にLateUpdate()を利用する必要があるというのは正しかった様です.
|
4
4
|
|
5
|
-
- 問題は,**Animatorは毎フレーム,そのアニメーション処理を行う
|
5
|
+
- 問題は,**Animatorは毎フレーム,そのアニメーション処理を行う際に最初にオブジェクトを初期状態の姿勢にリセットしている**事でした.
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -12,69 +12,11 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
|
15
|
+
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態からAnimator処理を行っているので,毎回処理はされているから変化が無いように見えた様です.
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
~~なので,以下の様に,処理後の回転状態を記憶しておけるように修正した所,意図した動作が達成出来ました.~~
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
**Animatorが初期状態にリセットしようがしまいが,LateUpdate()はその後に呼ばれるはずだが…?**
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
```C#
|
28
|
-
|
29
|
-
using UnityEngine;
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
public class Bones : MonoBehaviour
|
34
|
-
|
35
|
-
{
|
36
|
-
|
37
|
-
[SerializeField] Animator _animator;
|
38
|
-
|
39
|
-
Quaternion previous;
|
40
|
-
|
41
|
-
Transform arm;
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
void Start()
|
46
|
-
|
47
|
-
{
|
48
|
-
|
49
|
-
arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
|
50
|
-
|
51
|
-
previous=arm.rotation;
|
52
|
-
|
53
|
-
}
|
54
|
-
|
55
|
-
void LateUpdate()
|
56
|
-
|
57
|
-
{
|
58
|
-
|
59
|
-
arm.rotation=previous;//前回の回転状態を読み込む
|
60
|
-
|
61
|
-
arm.Rotate(new Vector3(3.14f,0,0),Space.Self);
|
62
|
-
|
63
|
-
previous=arm.rotation;//前回の回転状態を記憶しておく
|
64
|
-
|
65
|
-
}
|
66
|
-
|
67
|
-
}
|
68
|
-
|
69
|
-
```
|
70
|
-
|
71
|
-
ちなみに上の修正コードだと,腕は回り続けますが,Animatorを完全に無視した様な挙動で腕が初期位置に持ち上がった状態で回り続ける為,やはり上手く行っていないです.
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
#### 追記
|
76
|
-
|
77
|
-
上記のサイトを参考に
|
19
|
+
なので,上記のサイトを参考に,スタート時点からの累積回転量を記憶しておく様にする事で解決しました.
|
78
20
|
|
79
21
|
|
80
22
|
|
@@ -94,7 +36,7 @@
|
|
94
36
|
|
95
37
|
Transform arm;
|
96
38
|
|
97
|
-
Quaternion r
|
39
|
+
Quaternion r;
|
98
40
|
|
99
41
|
|
100
42
|
|
@@ -104,17 +46,17 @@
|
|
104
46
|
|
105
47
|
arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
|
106
48
|
|
49
|
+
r= Quaternion.identity;
|
50
|
+
|
107
51
|
}
|
108
52
|
|
109
53
|
void LateUpdate()
|
110
54
|
|
111
55
|
{
|
112
56
|
|
113
|
-
r = r* Quaternion.AngleAxis (
|
57
|
+
r = r* Quaternion.AngleAxis (3.14f, new Vector3(1.0f,0,0));
|
114
58
|
|
115
59
|
arm.rotation =arm.rotation* r;
|
116
|
-
|
117
|
-
|
118
60
|
|
119
61
|
}
|
120
62
|
|
5
追記
test
CHANGED
@@ -38,17 +38,29 @@
|
|
38
38
|
|
39
39
|
Quaternion previous;
|
40
40
|
|
41
|
-
|
41
|
+
Transform arm;
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
void Start()
|
46
|
+
|
47
|
+
{
|
48
|
+
|
49
|
+
arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
|
50
|
+
|
51
|
+
previous=arm.rotation;
|
52
|
+
|
53
|
+
}
|
42
54
|
|
43
55
|
void LateUpdate()
|
44
56
|
|
45
|
-
{
|
57
|
+
{
|
46
58
|
|
47
|
-
arm.rotation=previous;//前回の
|
59
|
+
arm.rotation=previous;//前回の回転状態を読み込む
|
48
60
|
|
49
|
-
arm.Rotate(new Vector3(3.14f,0,0));
|
61
|
+
arm.Rotate(new Vector3(3.14f,0,0),Space.Self);
|
50
62
|
|
51
|
-
previous=arm.rotation;//前回の
|
63
|
+
previous=arm.rotation;//前回の回転状態を記憶しておく
|
52
64
|
|
53
65
|
}
|
54
66
|
|
@@ -56,4 +68,56 @@
|
|
56
68
|
|
57
69
|
```
|
58
70
|
|
59
|
-
ちなみに上の修正コードだと,腕は回り続けますが,Animatorを完全に無視した様な挙動でやはり上手く行っていないです.
|
71
|
+
ちなみに上の修正コードだと,腕は回り続けますが,Animatorを完全に無視した様な挙動で腕が初期位置に持ち上がった状態で回り続ける為,やはり上手く行っていないです.
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
#### 追記
|
76
|
+
|
77
|
+
上記のサイトを参考に少し修正した所,やりたい事をやるという意味ではとりあえず解決しました.
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
```C#
|
82
|
+
|
83
|
+
using UnityEngine;
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
public class Bones : MonoBehaviour
|
88
|
+
|
89
|
+
{
|
90
|
+
|
91
|
+
[SerializeField] Animator _animator;
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
Transform arm;
|
96
|
+
|
97
|
+
Quaternion r= Quaternion.identity;
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
void Start()
|
102
|
+
|
103
|
+
{
|
104
|
+
|
105
|
+
arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
|
106
|
+
|
107
|
+
}
|
108
|
+
|
109
|
+
void LateUpdate()
|
110
|
+
|
111
|
+
{
|
112
|
+
|
113
|
+
r = r* Quaternion.AngleAxis (2, Vector3.up);
|
114
|
+
|
115
|
+
arm.rotation =arm.rotation* r;
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
}
|
120
|
+
|
121
|
+
}
|
122
|
+
|
123
|
+
```
|
4
やはり問題があったので未解決に戻した
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
自己解決しました.
|
1
|
+
~~自己解決しました.~~
|
2
2
|
|
3
3
|
- AnimatorによるアニメーションはUpdate()後に処理されるので,上書きされない為にLateUpdate()を利用する必要があるというのは正しかった様です.
|
4
4
|
|
@@ -12,11 +12,17 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.
|
15
|
+
~~その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.~~
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
なので,以下の様に,処理後の回転状態を記憶しておけるように修正した所,意図した動作が達成出来ました.
|
19
|
+
~~なので,以下の様に,処理後の回転状態を記憶しておけるように修正した所,意図した動作が達成出来ました.~~
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
**Animatorが初期状態にリセットしようがしまいが,LateUpdate()はその後に呼ばれるはずだが…?**
|
24
|
+
|
25
|
+
|
20
26
|
|
21
27
|
```C#
|
22
28
|
|
@@ -49,3 +55,5 @@
|
|
49
55
|
}
|
50
56
|
|
51
57
|
```
|
58
|
+
|
59
|
+
ちなみに上の修正コードだと,腕は回り続けますが,Animatorを完全に無視した様な挙動でやはり上手く行っていないです.
|
3
脱字
test
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
なので,以下の様に,処理後の回転状態を記憶ておけるように修正した所,意図した動作が達成出来ました.
|
19
|
+
なので,以下の様に,処理後の回転状態を記憶しておけるように修正した所,意図した動作が達成出来ました.
|
20
20
|
|
21
21
|
```C#
|
22
22
|
|
2
微修正
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
public class
|
27
|
+
public class Bones : MonoBehaviour
|
28
28
|
|
29
29
|
{
|
30
30
|
|
1
誤字
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたの
|
15
|
+
その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.
|
16
16
|
|
17
17
|
|
18
18
|
|