回答編集履歴

10

微修正

2021/03/17 06:38

投稿

退会済みユーザー
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
- (という訳で,LookAtの場合問題無く実行されのは,Rotateは現在の回転状態を起点としてあとどれだけ動かすのかという処理であるのに対してLookAtは現在の状態に関係なくターゲットオブジェクトを見る方向を新たに代入する様な処理為でしょう.)
19
+ (また,LookAtの場合問題無く実行されていたのは,Rotateは現在の回転状態を起点としてあとどれだけ動かすのかという処理であるのに対してLookAtは現在の状態に関係なくターゲットオブジェクトを見る方向を新たに代入する処理である為でしょう.)
20
20
 
21
21
 
22
22
 

9

補足

2021/03/17 06:38

投稿

退会済みユーザー
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

補足

2021/03/17 03:54

投稿

退会済みユーザー
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

誤字

2021/03/17 03:47

投稿

退会済みユーザー
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

完全理解

2021/03/17 03:46

投稿

退会済みユーザー
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
- ~~その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.~~
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= Quaternion.identity;
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 (2, Vector3.up);
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

追記

2021/03/17 03:45

投稿

退会済みユーザー
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
- { var arm=_animator.GetBoneTransform(HumanBodyBones.LeftUpperArm);
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

やはり問題があったので未解決に戻した

2021/03/17 03:26

投稿

退会済みユーザー
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

脱字

2021/03/17 02:37

投稿

退会済みユーザー
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- なので,以下の様に,処理後の回転状態を記憶ておけるように修正した所,意図した動作が達成出来ました.
19
+ なので,以下の様に,処理後の回転状態を記憶ておけるように修正した所,意図した動作が達成出来ました.
20
20
 
21
21
  ```C#
22
22
 

2

微修正

2021/03/17 02:08

投稿

退会済みユーザー
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- public class memo : MonoBehaviour
27
+ public class Bones : MonoBehaviour
28
28
 
29
29
  {
30
30
 

1

誤字

2021/03/17 02:07

投稿

退会済みユーザー
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのyは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.
15
+ その為,追記で述べた「LateUpdate()での変形処理が最初の1フレームしか実行されていない」様に見えたのは,LateUpdate()前に初期位置に戻された状態から毎回処理はされているから変化が無いように見えた様です.
16
16
 
17
17
 
18
18