回答編集履歴

1

追記

2021/08/13 01:35

投稿

fiveHundred
fiveHundred

スコア10152

test CHANGED
@@ -13,3 +13,291 @@
13
13
  また、OnTriggerEnter()を使っているということはIs Triggerがオンにしているとは思いますが、その場合ぶつかってもすり抜けてしまいます。
14
14
 
15
15
  (スクリプトで制御しているのかもしれませんが、念のため)
16
+
17
+
18
+
19
+ ---
20
+
21
+
22
+
23
+ 追記:
24
+
25
+
26
+
27
+ 変更箇所が多かったので、修正したコードを記載します。
28
+
29
+
30
+
31
+ ```C#
32
+
33
+ using System;
34
+
35
+ using System.Collections;
36
+
37
+ using System.Collections.Generic;
38
+
39
+ using UnityEngine;
40
+
41
+
42
+
43
+ public class PlayerIdou : MonoBehaviour
44
+
45
+ {
46
+
47
+ public float SpeedX;
48
+
49
+ public static int SpeedY = -65;
50
+
51
+ public float Muki;
52
+
53
+ float screenLeft = -2;//左端の座標x
54
+
55
+ float screenRight = 2;//右端の座標x
56
+
57
+
58
+
59
+ Rigidbody2D rigidbody2DComponent;
60
+
61
+ bool tapLeft = false;
62
+
63
+ bool tapRight = false;
64
+
65
+
66
+
67
+ void Start()
68
+
69
+ {
70
+
71
+ rigidbody2DComponent = GetComponent<Rigidbody2D>();
72
+
73
+ }
74
+
75
+
76
+
77
+ // Update is called once per frame
78
+
79
+ void Update()
80
+
81
+ {
82
+
83
+ if (Input.mousePosition.x >= Screen.width / 2)
84
+
85
+ {
86
+
87
+ if (Input.GetMouseButton(0))
88
+
89
+ {// 右側をタップしたら
90
+
91
+ tapRight = true;
92
+
93
+ }
94
+
95
+ }
96
+
97
+ else
98
+
99
+ {
100
+
101
+ if (Input.GetMouseButton(0))
102
+
103
+ {// 左側をタップしたら
104
+
105
+ tapLeft = true;
106
+
107
+ }
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+ void FixedUpdate()
116
+
117
+ {
118
+
119
+ SpeedX = SpeedX * 0.7f;
120
+
121
+ Muki = Muki * 0.7f;
122
+
123
+ SpeedY += 5;
124
+
125
+
126
+
127
+ if (tapRight)
128
+
129
+ {// 右側をタップしたら
130
+
131
+ SpeedX += 0.1f;
132
+
133
+ Muki -= 1;
134
+
135
+ }
136
+
137
+ tapRight = false;
138
+
139
+
140
+
141
+ if (tapLeft)
142
+
143
+ {// 左側をタップしたら
144
+
145
+ SpeedX -= 0.1f;
146
+
147
+ Muki += 1;
148
+
149
+ }
150
+
151
+ tapLeft = false;
152
+
153
+
154
+
155
+ Vector3 pos = transform.position + new Vector3(SpeedX * 0.5f, 0, 0);
156
+
157
+ rigidbody2DComponent.MoveRotation(Quaternion.Euler(0, 0, Muki * 2));
158
+
159
+ pos.x = Mathf.Clamp(pos.x, screenLeft, screenRight);
160
+
161
+ rigidbody2DComponent.MovePosition(pos);
162
+
163
+ }
164
+
165
+
166
+
167
+ internal static float getSpeedY()
168
+
169
+ {
170
+
171
+ throw new NotImplementedException();
172
+
173
+ }
174
+
175
+
176
+
177
+ public static int GetSpeedY()
178
+
179
+ {
180
+
181
+ return SpeedY;
182
+
183
+ }
184
+
185
+
186
+
187
+ void OnCollisionEnter2D(Collision2D other)
188
+
189
+ {
190
+
191
+ //接触したオブジェクトのタグが"Ground"のとき
192
+
193
+ if (other.gameObject.CompareTag("Ground"))
194
+
195
+ {
196
+
197
+ SpeedY = -65;
198
+
199
+ }
200
+
201
+ }
202
+
203
+ }
204
+
205
+ ```
206
+
207
+
208
+
209
+ ```C#
210
+
211
+ using System.Collections;
212
+
213
+ using System.Collections.Generic;
214
+
215
+ using UnityEngine;
216
+
217
+
218
+
219
+ public class GameGround : MonoBehaviour
220
+
221
+ {
222
+
223
+
224
+
225
+ public PlayerIdou playerIdou;
226
+
227
+ Rigidbody2D rigidbody2DComponent;
228
+
229
+
230
+
231
+ // Start is called before the first frame update
232
+
233
+ void Start()
234
+
235
+ {
236
+
237
+ rigidbody2DComponent = GetComponent<Rigidbody2D>();
238
+
239
+ }
240
+
241
+
242
+
243
+ void FixedUpdate()
244
+
245
+ {
246
+
247
+ float Jump;
248
+
249
+ Jump = PlayerIdou.SpeedY;
250
+
251
+ rigidbody2DComponent.MovePosition(transform.position + new Vector3(0, Jump * 0.01f, 0));
252
+
253
+ }
254
+
255
+ }
256
+
257
+ ```
258
+
259
+
260
+
261
+ また、Box Collider2DとRigidbody2Dを**両方**に付けて、Rigidbody2Dを以下のように設定しました。
262
+
263
+
264
+
265
+ - Body Type: Kinematic
266
+
267
+ - Use Full Kinematic Contacts: ON
268
+
269
+ - Collision Detection: Continuous(上記2つで上手くいかない場合)
270
+
271
+
272
+
273
+ 以下、変更した箇所についての説明です。
274
+
275
+
276
+
277
+ - OnTriggerEnter()からOnCollisionEnter2D()に変更しております。
278
+
279
+ Is Triggerを解除した場合は、OnTriggerEnter2D()では取得できないため、OnCollisionEnter2D()にしています。
280
+
281
+ - 物理判定や移動を行うものについては、Update()ではなくFixedUpdate()を使います。
282
+
283
+ ただし、操作入力の取得は逆にUpdate()でないといけないので、tapLeftやtapRightのように変数を仲介させるようにしましょう。
284
+
285
+ - 移動させる処理もtransformだと貫通することがあるので、Rigidbody2Dを使って移動させます。
286
+
287
+ 移動方法は色々ありますが、今回はMovePosition()やMoveRotation()を使っています。
288
+
289
+ ただし、これらはRigidbody2DがKinematicでないと正しく動作しないため、そのように設定しております。
290
+
291
+ また、オブジェクトの大きさや速度次第では、これでも貫通する可能性があるので、必要に応じてContinuousを設定する必要があります。
292
+
293
+
294
+
295
+ あと、変更はしていませんが、気になった点として以下があります。
296
+
297
+
298
+
299
+ - SpeedYがstaticですが、そうした意味が理解できませんでした。
300
+
301
+ むしろ、staticだと「Playerを2つ以上用意できない」「Playerを破棄した後もSpeedYの値が残ってしまう」という問題があります。
302
+
303
+ GameGroundにplayerIdouを用意してあるのだから、それにPlayerIdouをインスペクターで指定させればいい話だと思いますが、どうでしょう。