回答編集履歴

4

書式の改善

2023/03/14 11:40

投稿

blanket
blanket

スコア295

test CHANGED
@@ -96,3 +96,5 @@
96
96
  }
97
97
  ```
98
98
  修正しました。JoyStickPackというのをダウンロードして、バーチャルパッドでプレイヤーの左右移動が出来ます。移動を受け付けたくない時は、isMoving=true;なので、isMoving=false;で移動出来るように、会話イベント終了時にfalseにしてあげて下さい。
99
+ [Youtubeから](https://www.youtube.com/watch?v=kWxZT6ksm90&t=419s)
100
+ こちらの動画を参考にやってみました。

3

実装方法の修正

2023/03/12 15:58

投稿

blanket
blanket

スコア295

test CHANGED
@@ -2,9 +2,12 @@
2
2
  [RequireComponent(typeof(Rigidbody2D))]
3
3
  public class Test : MonoBehaviour
4
4
  {
5
+ [SerializeField] private FixedJoystick fixedJoystick;
5
6
  private int number = 0; // 最初は移動が出来る
6
7
  Rigidbody2D rb; // Rigidbody2D 型の変数
7
8
  float speed;
9
+ [SerializeField] float currentSpeed;
10
+ float axisH;
8
11
  bool isMoving = false;
9
12
 
10
13
  public enum State
@@ -12,16 +15,7 @@
12
15
  Normal,
13
16
  Talk,
14
17
  }
15
- State state;
18
+ State state = State.Normal;
16
-
17
- public enum DIRECTION
18
- {
19
- STOP,
20
- LEFT,
21
- RIGHT
22
- }
23
- DIRECTION direction = DIRECTION.STOP;
24
-
25
19
 
26
20
  private void Start()
27
21
  {
@@ -37,30 +31,17 @@
37
31
  {
38
32
  state = State.Talk;
39
33
  }
40
-
41
- switch (state)
42
- {
43
- case State.Talk:
44
- TalkEvent();
45
- break;
46
- case State.Normal:
47
- MoveEvent();
48
- break;
49
- default:
50
- break;
51
- }
52
34
  }
53
35
 
54
- private void TalkEvent()
36
+ private IEnumerator TalkEvent()
55
37
  {
56
- number = 1;
57
-
58
38
  // トークイベント
59
39
  isMoving = true;
60
40
 
61
41
  /*
62
42
  会話中は入力を受け付けない
63
43
  */
44
+ yield return new WaitForSeconds(50f);
64
45
 
65
46
  isMoving = false;
66
47
  }
@@ -69,42 +50,26 @@
69
50
  {
70
51
  if (!isMoving)
71
52
  {
72
- number = 0;
73
53
  // 移動
74
- float axisH = Input.GetAxisRaw("Horizontal"); // 水平方向の入力をチェックする
54
+ axisH = fixedJoystick.Horizontal; // 水平方向の入力をチェックする
75
-
76
- if (axisH == 0)
77
- {
78
- direction = DIRECTION.STOP;
55
+ speed = currentSpeed;
79
- }
80
- if (axisH > 0.0f) // 向きの調整
56
+ rb.velocity = new Vector2(axisH, rb.velocity.y) * speed * Time.deltaTime; // 速度を更新する
81
- {
82
- direction = DIRECTION.RIGHT;
83
- }
84
- else if (axisH < 0.0f)
85
- {
86
- direction = DIRECTION.LEFT;
87
- }
88
57
  }
89
58
  }
90
59
 
91
60
  private void FixedUpdate()
92
61
  {
93
- switch(direction)
62
+ switch (state)
94
63
  {
95
- case DIRECTION.STOP:
64
+ case State.Talk:
96
- speed = 0;
65
+ StartCoroutine("TalkEvent");
97
66
  break;
98
- case DIRECTION.RIGHT:
67
+ case State.Normal:
99
- speed = 3;
68
+ MoveEvent();
100
- transform.localScale = new Vector2(1, 1); // 右移動
101
69
  break;
102
- case DIRECTION.LEFT:
103
- speed = -3;
70
+ default:
104
- transform.localScale = new Vector2(-1, 1); // 左移動
105
71
  break;
106
72
  }
107
- rb.velocity = new Vector2(speed, rb.velocity.y); // 速度を更新する
108
73
  }
109
74
 
110
75
  private void OnTriggerEnter2D(Collider2D other)
@@ -112,12 +77,22 @@
112
77
  // もし何らかのTriggerに当たったらトークイベント
113
78
  if (other.gameObject.CompareTag("Enemy"))
114
79
  {
115
- direction = DIRECTION.STOP;
80
+ number = 1;
116
81
  isMoving = true;
82
+ state = State.Talk;
117
83
  Debug.Log("敵キャラクターとの会話");
84
+ }
85
+ }
86
+
87
+ private void OnTriggerExit2D(Collider2D other)
88
+ {
89
+ if (other.gameObject.CompareTag("Enemy"))
90
+ {
91
+ number = 0;
92
+ isMoving = false;
93
+ Debug.Log("会話を終わる");
118
94
  }
119
95
  }
120
96
  }
121
97
  ```
122
- 修正しました。移動を受け付けたくない時は、isMoving=true;なので、isMoving=false;
98
+ 修正しました。JoyStickPackというのをダウンロードして、バーチャルパッドでプレイヤーの左右移動が出来ます。移動を受け付けたくない時は、isMoving=true;なので、isMoving=false;で移動出来るように、会話イベント終了時にfalseにしてあげて下さい。
123
- で移動出来るように、会話イベント終了時にfalseにしてあげて下さい。

2

詳細なコードの説明追加

2023/03/12 11:05

投稿

blanket
blanket

スコア295

test CHANGED
@@ -119,4 +119,5 @@
119
119
  }
120
120
  }
121
121
  ```
122
- 修正しました。
122
+ 修正しました。移動を受け付けたくない時は、isMoving=true;なので、isMoving=false;
123
+ で移動出来るように、会話イベント終了時にfalseにしてあげて下さい。

1

回答の修正

2023/03/12 09:52

投稿

blanket
blanket

スコア295

test CHANGED
@@ -1,48 +1,122 @@
1
1
  ```C#
2
+ [RequireComponent(typeof(Rigidbody2D))]
3
+ public class Test : MonoBehaviour
4
+ {
2
- private int number = 0; // 最初は移動が出来る
5
+ private int number = 0; // 最初は移動が出来る
6
+ Rigidbody2D rb; // Rigidbody2D 型の変数
7
+ float speed;
8
+ bool isMoving = false;
3
9
 
4
- private void Update()
10
+ public enum State
5
- {
6
- switch (state)
7
11
  {
8
- case State.talk:
9
- TalkEvent();
10
- break;
12
+ Normal,
11
- case State.normal:
12
- MoveEvent();
13
- break;
13
+ Talk,
14
- default:
15
- break;
16
14
  }
17
- }
15
+ State state;
18
16
 
19
- private void TalkEvent()
17
+ public enum DIRECTION
20
- {
18
+ {
19
+ STOP,
20
+ LEFT,
21
+ RIGHT
22
+ }
21
- number = 1;
23
+ DIRECTION direction = DIRECTION.STOP;
22
24
 
23
- // もし会話イベントが終了したら
24
- number = 0;
25
- }
26
25
 
27
- private void MoveEvent()
26
+ private void Start()
28
- {
29
- number = 0;
30
- if (Input.GetKeyDown(KeyCode.A))
31
27
  {
28
+ rb = GetComponent<Rigidbody2D>();
32
29
  }
33
- if (Input.GetKeyDown(KeyCode.D))
30
+ private void Update()
34
31
  {
32
+ if (number == 0)
33
+ {
34
+ state = State.Normal;
35
+ }
36
+ if (number == 1)
37
+ {
38
+ state = State.Talk;
39
+ }
40
+
41
+ switch (state)
42
+ {
43
+ case State.Talk:
44
+ TalkEvent();
45
+ break;
46
+ case State.Normal:
47
+ MoveEvent();
48
+ break;
49
+ default:
50
+ break;
51
+ }
35
52
  }
36
- }
37
53
 
38
- private void OnTriggerEnter2D(Collider2D other)
54
+ private void TalkEvent()
39
- {
40
- // もし何らかのTriggerに当たったら
41
- トークイベント
42
- if (other.gameObject.CompareTag(""))
43
55
  {
56
+ number = 1;
57
+
58
+ // トークイベント
59
+ isMoving = true;
60
+
61
+ /*
62
+ 会話中は入力を受け付けない
63
+ */
64
+
65
+ isMoving = false;
66
+ }
67
+
68
+ private void MoveEvent()
69
+ {
70
+ if (!isMoving)
71
+ {
72
+ number = 0;
73
+ // 移動
74
+ float axisH = Input.GetAxisRaw("Horizontal"); // 水平方向の入力をチェックする
75
+
76
+ if (axisH == 0)
77
+ {
78
+ direction = DIRECTION.STOP;
79
+ }
80
+ if (axisH > 0.0f) // 向きの調整
81
+ {
82
+ direction = DIRECTION.RIGHT;
83
+ }
84
+ else if (axisH < 0.0f)
85
+ {
86
+ direction = DIRECTION.LEFT;
87
+ }
88
+ }
89
+ }
90
+
91
+ private void FixedUpdate()
92
+ {
44
- state = State.talk;
93
+ switch(direction)
94
+ {
95
+ case DIRECTION.STOP:
96
+ speed = 0;
97
+ break;
98
+ case DIRECTION.RIGHT:
99
+ speed = 3;
100
+ transform.localScale = new Vector2(1, 1); // 右移動
101
+ break;
102
+ case DIRECTION.LEFT:
103
+ speed = -3;
104
+ transform.localScale = new Vector2(-1, 1); // 左移動
105
+ break;
106
+ }
107
+ rb.velocity = new Vector2(speed, rb.velocity.y); // 速度を更新する
108
+ }
109
+
110
+ private void OnTriggerEnter2D(Collider2D other)
111
+ {
112
+ // もし何らかのTriggerに当たったらトークイベント
113
+ if (other.gameObject.CompareTag("Enemy"))
114
+ {
115
+ direction = DIRECTION.STOP;
116
+ isMoving = true;
117
+ Debug.Log("敵キャラクターとの会話");
118
+ }
45
119
  }
46
120
  }
47
121
  ```
48
- このような実装はどうでょう
122
+ 修正ました