回答編集履歴

4

微修正

2018/12/27 13:21

投稿

negitama
negitama

スコア943

test CHANGED
@@ -182,6 +182,6 @@
182
182
 
183
183
  参考GIF
184
184
 
185
- ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)]
185
+ ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)
186
186
 
187
187
  以上です。

3

参考GIF追加

2018/12/27 13:21

投稿

negitama
negitama

スコア943

test CHANGED
@@ -180,4 +180,8 @@
180
180
 
181
181
  ```
182
182
 
183
+ 参考GIF
184
+
185
+ ![![イメージ説明](464390cf32f5d5df7189e0e82233b1f9.gif)]
186
+
183
187
  以上です。

2

参考画像追加

2018/12/27 13:20

投稿

negitama
negitama

スコア943

test CHANGED
@@ -138,6 +138,8 @@
138
138
 
139
139
  さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
140
140
 
141
+ ![イメージ説明](c84968f343905bb5417030fbffb601b2.jpeg)
142
+
141
143
  内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
142
144
 
143
145
 

1

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

2018/12/27 13:14

投稿

negitama
negitama

スコア943

test CHANGED
@@ -1,23 +1,181 @@
1
- 実際に動かて確認できていせんが、取り急ぎ
1
+ 【回答 1】 ← 取り消しま失礼しました。
2
2
 
3
- 変数 Scroll の値で移量を決めているなら、攻撃中はその値を0にしておけばよいのはなでしょうか
3
+ ~~実際にして確認きてませんが、取り急ぎ~~
4
4
 
5
- ```
5
+ ~~変数 Scroll の値で移動量を決めているなら、攻撃中はその値を0にしておけばよいのではないでしょうか。~~
6
6
 
7
- void ChangeState()
7
+ ~~ void ChangeState()~~
8
+
9
+ ~~ {~~
10
+
11
+ ~~ if (Attack == true)~~
12
+
13
+ ~~ {~~
14
+
15
+ ~~ State = "Attack";~~
16
+
17
+ ~~ Scroll = 0; // 攻撃中は Scroll = 0 にして移動させない~~
18
+
19
+ ~~ }~~
20
+
21
+
22
+
23
+ ---
24
+
25
+ 【回答2】
26
+
27
+ あらためて回答します。さきほどは失礼しました。
28
+
29
+ 考え方は nya3720197 さんの回答と同じで、攻撃中は入力を受け取らないというものです。
30
+
31
+ コードが質問者さんのものではなく自分流になってしまいましたが、ご参考まで。
32
+
33
+
34
+
35
+ メインのスクリプトはこちら。
36
+
37
+ ```C#
38
+
39
+ using System.Collections;
40
+
41
+ using System.Collections.Generic;
42
+
43
+ using UnityEngine;
44
+
45
+
46
+
47
+ public class SkeltonController : MonoBehaviour
48
+
49
+ {
50
+
51
+ [SerializeField] float speed;
52
+
53
+ [SerializeField] Rigidbody rb;
54
+
55
+ [SerializeField] Animator anim;
56
+
57
+
58
+
59
+ private float inputH, inputV;
60
+
61
+ private bool mouseClick = false;
62
+
63
+
64
+
65
+ private void Update ()
8
66
 
9
67
  {
10
68
 
69
+ // 攻撃モーション中なら入力を受け取らない
70
+
71
+ if ( anim.GetBool ( "Attack" ) == true ) return;
72
+
73
+
74
+
75
+ // 各種入力を受け取る
76
+
77
+ inputH = Input.GetAxis ( "Horizontal" );
78
+
79
+ inputV = Input.GetAxis ( "Vertical" );
80
+
81
+ mouseClick = Input.GetMouseButtonDown ( 0 );
82
+
83
+ }
84
+
85
+
86
+
11
- if (Attack == true)
87
+ private void FixedUpdate ()
88
+
89
+ {
90
+
91
+ if ( mouseClick ) // マウス左クリックで攻撃
12
92
 
13
93
  {
14
94
 
15
- State = "Attack";
95
+ anim.SetBool ( "Attack", true );
16
96
 
17
- Scroll = 0; // 攻撃中は Scroll = 0 にして移動させない
97
+ anim.SetBool ( "Walk", false );
98
+
99
+ return;
18
100
 
19
101
  }
20
102
 
21
103
 
22
104
 
105
+ if ( inputH == 0 && inputV == 0 ) // 待機
106
+
107
+ {
108
+
109
+ anim.SetBool ( "Walk", false );
110
+
111
+ }
112
+
113
+ else // 歩き
114
+
115
+ {
116
+
117
+ anim.SetBool ( "Walk", true );
118
+
119
+ var moveVal = new Vector3(inputH, 0f, inputV) * speed;
120
+
121
+ rb.MovePosition ( rb.position + moveVal );
122
+
123
+ }
124
+
125
+ }
126
+
127
+ }
128
+
23
129
  ```
130
+
131
+
132
+
133
+ AnimatorControllerはこのような形で設定してみました。
134
+
135
+ ![イメージ説明](26e01ab2aa2f6c4b0e4173e4bc53397e.jpeg)
136
+
137
+
138
+
139
+ さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
140
+
141
+ 内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
142
+
143
+
144
+
145
+ ```C#
146
+
147
+ using System.Collections;
148
+
149
+ using System.Collections.Generic;
150
+
151
+ using UnityEngine;
152
+
153
+
154
+
155
+ // Animator の Attack モーションにアタッチする StateMachineBehavior
156
+
157
+ public class AttackBehaviour : StateMachineBehaviour
158
+
159
+ {
160
+
161
+ override public void OnStateUpdate ( Animator animator, AnimatorStateInfo stateInfo, int layerIndex )
162
+
163
+ {
164
+
165
+ // 攻撃モーションの最終盤で Attack パラメーターの値を false に戻す
166
+
167
+ if ( stateInfo.normalizedTime > 0.9f )
168
+
169
+ {
170
+
171
+ animator.SetBool ( "Attack", false );
172
+
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+ ```
180
+
181
+ 以上です。