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

回答編集履歴

4

微修正

2018/12/27 13:21

投稿

negitama
negitama

スコア943

answer CHANGED
@@ -90,5 +90,5 @@
90
90
  }
91
91
  ```
92
92
  参考GIF
93
- ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)]
93
+ ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)
94
94
  以上です。

3

参考GIF追加

2018/12/27 13:21

投稿

negitama
negitama

スコア943

answer CHANGED
@@ -89,4 +89,6 @@
89
89
  }
90
90
  }
91
91
  ```
92
+ 参考GIF
93
+ ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)]
92
94
  以上です。

2

参考画像追加

2018/12/27 13:20

投稿

negitama
negitama

スコア943

answer CHANGED
@@ -68,6 +68,7 @@
68
68
  ![イメージ説明](26e01ab2aa2f6c4b0e4173e4bc53397e.jpeg)
69
69
 
70
70
  さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
71
+ ![イメージ説明](c84968f343905bb5417030fbffb601b2.jpeg)
71
72
  内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
72
73
 
73
74
  ```C#

1

あらためて回答しました。

2018/12/27 13:14

投稿

negitama
negitama

スコア943

answer CHANGED
@@ -1,12 +1,91 @@
1
+ 【回答 1】 ← 取り消します。失礼しました。
1
- 実際に動かして確認できていませんが、取り急ぎ。
2
+ ~~実際に動かして確認できていませんが、取り急ぎ。~~
2
- 変数 Scroll の値で移動量を決めているなら、攻撃中はその値を0にしておけばよいのではないでしょうか。
3
+ ~~変数 Scroll の値で移動量を決めているなら、攻撃中はその値を0にしておけばよいのではないでしょうか。~~
4
+ ~~ void ChangeState()~~
5
+ ~~ {~~
6
+ ~~ if (Attack == true)~~
7
+ ~~ {~~
8
+ ~~ State = "Attack";~~
9
+ ~~ Scroll = 0; // 攻撃中は Scroll = 0 にして移動させない~~
10
+ ~~ }~~
11
+
12
+ ---
13
+ 【回答2】
14
+ あらためて回答します。さきほどは失礼しました。
15
+ 考え方は nya3720197 さんの回答と同じで、攻撃中は入力を受け取らないというものです。
16
+ コードが質問者さんのものではなく自分流になってしまいましたが、ご参考まで。
17
+
18
+ メインのスクリプトはこちら。
19
+ ```C#
20
+ using System.Collections;
21
+ using System.Collections.Generic;
22
+ using UnityEngine;
23
+
24
+ public class SkeltonController : MonoBehaviour
25
+ {
26
+ [SerializeField] float speed;
27
+ [SerializeField] Rigidbody rb;
28
+ [SerializeField] Animator anim;
29
+
30
+ private float inputH, inputV;
31
+ private bool mouseClick = false;
32
+
33
+ private void Update ()
34
+ {
35
+ // 攻撃モーション中なら入力を受け取らない
36
+ if ( anim.GetBool ( "Attack" ) == true ) return;
37
+
38
+ // 各種入力を受け取る
39
+ inputH = Input.GetAxis ( "Horizontal" );
40
+ inputV = Input.GetAxis ( "Vertical" );
41
+ mouseClick = Input.GetMouseButtonDown ( 0 );
42
+ }
43
+
44
+ private void FixedUpdate ()
45
+ {
46
+ if ( mouseClick ) // マウス左クリックで攻撃
47
+ {
48
+ anim.SetBool ( "Attack", true );
49
+ anim.SetBool ( "Walk", false );
50
+ return;
51
+ }
52
+
53
+ if ( inputH == 0 && inputV == 0 ) // 待機
54
+ {
55
+ anim.SetBool ( "Walk", false );
56
+ }
57
+ else // 歩き
58
+ {
59
+ anim.SetBool ( "Walk", true );
60
+ var moveVal = new Vector3(inputH, 0f, inputV) * speed;
61
+ rb.MovePosition ( rb.position + moveVal );
62
+ }
63
+ }
64
+ }
3
65
  ```
66
+
67
+ AnimatorControllerはこのような形で設定してみました。
68
+ ![イメージ説明](26e01ab2aa2f6c4b0e4173e4bc53397e.jpeg)
69
+
70
+ さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
71
+ 内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
72
+
73
+ ```C#
74
+ using System.Collections;
75
+ using System.Collections.Generic;
4
- void ChangeState()
76
+ using UnityEngine;
77
+
78
+ // Animator の Attack モーションにアタッチする StateMachineBehavior
79
+ public class AttackBehaviour : StateMachineBehaviour
80
+ {
81
+ override public void OnStateUpdate ( Animator animator, AnimatorStateInfo stateInfo, int layerIndex )
5
82
  {
83
+ // 攻撃モーションの最終盤で Attack パラメーターの値を false に戻す
6
- if (Attack == true)
84
+ if ( stateInfo.normalizedTime > 0.9f )
7
85
  {
8
- State = "Attack";
86
+ animator.SetBool ( "Attack", false );
9
- Scroll = 0; // 攻撃中は Scroll = 0 にして移動させない
10
87
  }
11
-
88
+ }
89
+ }
12
- ```
90
+ ```
91
+ 以上です。