回答編集履歴
4
微修正
answer
CHANGED
@@ -90,5 +90,5 @@
|
|
90
90
|
}
|
91
91
|
```
|
92
92
|
参考GIF
|
93
|
-

|
93
|
+

|
94
94
|
以上です。
|
3
参考GIF追加
answer
CHANGED
@@ -89,4 +89,6 @@
|
|
89
89
|
}
|
90
90
|
}
|
91
91
|
```
|
92
|
+
参考GIF
|
93
|
+
]
|
92
94
|
以上です。
|
2
参考画像追加
answer
CHANGED
@@ -68,6 +68,7 @@
|
|
68
68
|

|
69
69
|
|
70
70
|
さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
|
71
|
+

|
71
72
|
内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
|
72
73
|
|
73
74
|
```C#
|
1
あらためて回答しました。
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
|
+

|
69
|
+
|
70
|
+
さらに、Attackモーションの部分にStateMachineBehaviorのスクリプトをアタッチします。
|
71
|
+
内容はこちら。これによって、攻撃モーションの終わり間際に、AnimatorのAttackの値をfalseに戻します。
|
72
|
+
|
73
|
+
```C#
|
74
|
+
using System.Collections;
|
75
|
+
using System.Collections.Generic;
|
4
|
-
|
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 (
|
84
|
+
if ( stateInfo.normalizedTime > 0.9f )
|
7
85
|
{
|
8
|
-
|
86
|
+
animator.SetBool ( "Attack", false );
|
9
|
-
Scroll = 0; // 攻撃中は Scroll = 0 にして移動させない
|
10
87
|
}
|
11
|
-
|
88
|
+
}
|
89
|
+
}
|
12
|
-
```
|
90
|
+
```
|
91
|
+
以上です。
|