質問編集履歴

6

文章を修正

2023/05/27 08:37

投稿

amagami
amagami

スコア14

test CHANGED
@@ -1 +1 @@
1
- [Unity3D] 3Dアクションムの作成 斜め移動のモーションブレンドする方法が知りたい
1
+ [Unity3D]モンハン、ゼルダの伝説等の3DアクションRPGのキャラクター移動を実装したい
test CHANGED
@@ -1,12 +1,13 @@
1
1
  ##### 質問内容
2
- モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作作成で斜めに移動る際に横回転アニメーションをブレンドして推移る動きを再現したい。
2
+ モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作作成したいのですがほとんど実装出来たので
3
-
4
- ##### 現状
5
- ほとんど実装できているのですスティックを最大に倒してちょっずつ左や右に倒すとある角度でカクって角度が変わったり
3
+ キャラクターを移動しなら少しずつ左右にスティックを倒して回転させるなんかカクっ移動したり移動モーション歩き多めのモーションブレンドに変わったりと色々おかしい原因がわかりません。
6
- 円を描くように回っているとキャラクターの向きが一瞬だけおかしい位置になったりします。
7
4
 
8
5
  #### 知りたいこと
6
+ 上記の`質問内容部`の現象を踏まえて3DアクションRPGのキャラクターの動きはどうやって実装するのか知りたい
7
+
8
+
9
+ ##### コード内容
9
- 上記`現状`部ような現象の原因が知りたい
10
+ 3DアクションRPGキャラクタ移動処理
10
11
 
11
12
  ##### 参考サイト
12
13
  参考サイト: https://gametukurikata.com/animationanimator/blendtree2
@@ -21,11 +22,12 @@
21
22
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-05-26/58ff9504-3be5-41b0-8751-25c1cd872238.png)
22
23
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-05-26/8ab34ebd-212e-4473-a71c-ef160985bbf1.png)
23
24
  ##### プレイヤースクリプト
25
+
24
26
  ※`cameraControl.getForward()`関数はカメラから見てのアナログスティックの進行方向ベクトルです
25
27
 
26
28
  ```cs
29
+ using System.Collections;
27
30
  using UnityEngine;
28
- using System.Collections;
29
31
 
30
32
  namespace Player
31
33
  {
@@ -47,50 +49,35 @@
47
49
 
48
50
  public GameObject effect;
49
51
 
52
+ [SerializeField,Range(0.0f,1.0f) ] private float speed;
53
+ [SerializeField,Range(0.0f,360.0f) ] private float rotate;
54
+ [SerializeField,Range(0.0f,360.0f) ] private float rotateSpeed = 500;
55
+
56
+
50
57
  // Update is called once per frame
51
58
  void Update()
52
59
  {
53
60
 
54
- if(control.getButton_A() == true)
55
- {
56
- animator.SetTrigger("MagicAttack");
57
- }
58
-
59
- if(control.getButton_B() == true)
60
- {
61
-
62
- }
63
-
64
-
65
- Debug.Log(Quaternion.LookRotation(cameraControl.getForward()).eulerAngles.y);
61
+ animator.SetFloat("MoveSensitivity",cameraControl.getForward().magnitude);
66
62
 
67
63
 
68
-
69
- animator.SetFloat("MoveSensitivity", cameraControl.getForward().magnitude);
70
-
71
- if(cameraControl.getForward().magnitude > 0.0)
72
- {
73
- Debug.Log("回転量: " + Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
64
+ Debug.Log("cameraControl.getForward().normalized.magnitude " + cameraControl.getForward().normalized.magnitude);
65
+ Debug.Log("Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y " + Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
74
66
 
75
67
 
76
- transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(transform.eulerAngles.x, Quaternion.LookRotation(cameraControl.getForward()).eulerAngles.y, transform.eulerAngles.z), 1000 * Time.deltaTime);
77
-
78
-
79
- if(Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y > 180)
80
- {
81
- animator.SetFloat("MoveTurnSensitivity", Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y - 180.0f);
82
-
83
- }
84
- else
85
- {
86
- animator.SetFloat("MoveTurnSensitivity", Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
87
- }
88
-
68
+ if(cameraControl.getForward().magnitude > 0)
69
+ {
70
+ transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(transform.eulerAngles.x, Quaternion.LookRotation(cameraControl.getForward().normalized).eulerAngles.y, transform.eulerAngles.z), rotateSpeed * Time.deltaTime);
71
+ }
72
+ if(Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y > 180)
73
+ {
74
+ animator.SetFloat("MoveTurnSensitivity",Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y - 360);
89
75
  }
90
76
  else
91
77
  {
92
- //animator.SetFloat("MoveTurnSensitivity",0);
78
+ animator.SetFloat("MoveTurnSensitivity", Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
93
79
  }
80
+
94
81
  }
95
82
  }
96
83
  }

5

文章とタイトルを修正

2023/05/26 13:22

投稿

amagami
amagami

スコア14

test CHANGED
@@ -1 +1 @@
1
- [Unity3D] 3Dアクションゲームの作成斜めに向いて移動させるモーションブレンド推移を作成したい
1
+ [Unity3D] 3Dアクションゲームの作成 斜め移動モーションブレンドする方法が知りたい
test CHANGED
@@ -1,30 +1,33 @@
1
1
  ##### 質問内容
2
- モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作の作成で斜めに移動する際や前進んでいて後ろ側に振り向いて進む動作のモーション推移の実装方法がわかりません
2
+ モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作の作成で斜めに移動する際に横回転アニメーションをブレンドして推移する動きを再現したい
3
3
 
4
- ##### 知りたいこと
4
+ ##### 現状
5
- キャラクターの向を反転させアニメーション用いキャラターに斜め移動のモーションを実装しい。
5
+ ほとんど実装でていのですが、スティック最大に倒しちょっとずつ左や右に倒すとある角度でカって角度が変わっ
6
- `わかっている`部関数の値を何処使えばいいのか知たい
6
+ 円を描くように回っているとキャラクター向きが一瞬だけおかしい位置なったします。
7
- ##### わかっていること
8
- `Vector3.Angle(cameraControl.getForward(), prevVector)`を使って傾きを取得してそれをモーション値のどこかで使うはずなのですがそれがわかりません。
9
- ただモーション推移を実装することなら実現しましたが斜め移動等の微妙な動作の実装方法がわかりません
10
7
 
8
+ #### 知りたいこと
9
+ 上記の`現状`部のような現象の原因が知りたい
11
10
 
12
11
  ##### 参考サイト
12
+ 参考サイト: https://gametukurikata.com/animationanimator/blendtree2
13
+ run : https://www.mixamo.com/#/?page=1&query=fast+run&type=Motion%2CMotionPack
14
+ idle: https://www.mixamo.com/#/?page=1&query=idle&type=Motion%2CMotionPack
15
+ right turn : https://www.mixamo.com/#/?page=1&query=right+turn&type=Motion%2CMotionPack
13
- モーションサイト(180度回転モーション): https://www.mixamo.com/#/?page=1&query=turn&type=Motion%2CMotionPack
16
+ left turn : https://www.mixamo.com/#/?page=1&query=turn&type=Motion%2CMotionPack
17
+ walk : https://www.mixamo.com/#/?page=1&query=walk&type=Motion%2CMotionPack
18
+ turn : https://www.mixamo.com/#/?page=1&query=turn&type=Motion%2CMotionPack
14
19
 
15
- ##### 実現したいこと
16
- モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作の作成で斜め前に移動する際や前に進んでいて後ろ側に振り向いて進む動作のモーション推移
17
-
18
- ##### 調査したこと
20
+ ##### アニメーター
21
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-05-26/58ff9504-3be5-41b0-8751-25c1cd872238.png)
22
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-05-26/8ab34ebd-212e-4473-a71c-ef160985bbf1.png)
23
+ ##### プレイヤースクリプト
19
- 前の移動ベクトルから移動ベクトルの間の角度を取得してそれを向き反転モーションの値に使うこと移動量の分移動させることができるはずで
24
+ ※`cameraControl.getForward()`関数はカメラから見てアナログスティックの進行方向ベクトルです
20
-
21
-
22
25
 
23
26
  ```cs
27
+ using UnityEngine;
24
28
  using System.Collections;
25
- using UnityEngine;
26
29
 
27
- namespace Assets.script.player
30
+ namespace Player
28
31
  {
29
32
  public class PlayerAnimation : MonoBehaviour
30
33
  {
@@ -42,6 +45,8 @@
42
45
 
43
46
  private Vector3 prevVector;
44
47
 
48
+ public GameObject effect;
49
+
45
50
  // Update is called once per frame
46
51
  void Update()
47
52
  {
@@ -56,19 +61,39 @@
56
61
 
57
62
  }
58
63
 
64
+
65
+ Debug.Log(Quaternion.LookRotation(cameraControl.getForward()).eulerAngles.y);
59
66
 
60
- if(Vector3.Angle(cameraControl.getForward(), prevVector) > 0)
61
- {
62
- Debug.Log(Vector3.Angle(cameraControl.getForward(), prevVector));
67
+
68
+
69
+ animator.SetFloat("MoveSensitivity", cameraControl.getForward().magnitude);
70
+
71
+ if(cameraControl.getForward().magnitude > 0.0)
72
+ {
73
+ Debug.Log("回転量: " + Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
74
+
75
+
76
+ transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(transform.eulerAngles.x, Quaternion.LookRotation(cameraControl.getForward()).eulerAngles.y, transform.eulerAngles.z), 1000 * Time.deltaTime);
77
+
78
+
79
+ if(Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y > 180)
80
+ {
81
+ animator.SetFloat("MoveTurnSensitivity", Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y - 180.0f);
82
+
83
+ }
84
+ else
85
+ {
86
+ animator.SetFloat("MoveTurnSensitivity", Quaternion.FromToRotation(transform.forward, cameraControl.getForward()).eulerAngles.y);
87
+ }
88
+
63
89
  }
64
-
65
-
66
- animator.SetFloat("MoveSensitivity_X", Vector3.Angle(cameraControl.getForward(), prevVector));
90
+ else
67
-
91
+ {
68
- animator.SetFloat("MoveSensitivity",cameraControl.getForward().magnitude);
92
+ //animator.SetFloat("MoveTurnSensitivity",0);
69
-
70
- prevVector = cameraControl.getForward();
93
+ }
71
94
  }
72
95
  }
73
96
  }
74
97
  ```
98
+
99
+

4

文章を修正

2023/05/25 13:03

投稿

amagami
amagami

スコア14

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,12 @@
14
14
 
15
15
  ##### 実現したいこと
16
16
  モンスターハンターやゼルダの伝説等の3Dアクションゲームのキャラクター動作の作成で斜め前に移動する際や前に進んでいて後ろ側に振り向いて進む動作のモーション推移
17
+
17
- #####
18
+ ##### 調査したこと
19
+ 前の移動ベクトルから今の移動ベクトルの間の角度を取得してそれを向き反転モーションの値に使うことで移動量の分移動させることができるはずです。
20
+
21
+
22
+
18
23
  ```cs
19
24
  using System.Collections;
20
25
  using UnityEngine;

3

文章を修正

2023/05/25 11:55

投稿

amagami
amagami

スコア14

test CHANGED
@@ -1 +1 @@
1
- [Unity3D] 3Dアクションゲームの作成で斜めに向いて移動させるモーション推移を作成したい
1
+ [Unity3D] 3Dアクションゲームの作成で斜めに向いて移動させるモーションブレンド推移を作成したい
test CHANGED
File without changes

2

文章を修正

2023/05/25 11:46

投稿

amagami
amagami

スコア14

test CHANGED
File without changes
test CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  ##### 知りたいこと
5
5
  キャラクターの向きを反転させるアニメーションを用いてキャラクターに斜め移動のモーションを実装したい。
6
-
6
+ `わかっていること`部の関数の値を何処に使えばいいのか知りたい
7
7
  ##### わかっていること
8
8
  `Vector3.Angle(cameraControl.getForward(), prevVector)`を使って傾きを取得してそれをモーション値のどこかで使うはずなのですがそれがわかりません。
9
9
  ただモーション推移を実装することなら実現しましたが斜め移動等の微妙な動作の実装方法がわかりません

1

文章を修正

2023/05/25 11:33

投稿

amagami
amagami

スコア14

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  ##### わかっていること
8
8
  `Vector3.Angle(cameraControl.getForward(), prevVector)`を使って傾きを取得してそれをモーション値のどこかで使うはずなのですがそれがわかりません。
9
+ ただモーション推移を実装することなら実現しましたが斜め移動等の微妙な動作の実装方法がわかりません
10
+
9
11
 
10
12
  ##### 参考サイト
11
13
  モーションサイト(180度回転モーション): https://www.mixamo.com/#/?page=1&query=turn&type=Motion%2CMotionPack