質問編集履歴
4
ご教授頂きスクリプトを書き換えたので反映しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -40,9 +40,11 @@
|
|
40
40
|
|
41
41
|
|
42
42
|
|
43
|
+
※1月22日修正:ご教授頂き、エラーが出ていた箇所などを訂正したものに変えました。
|
44
|
+
|
43
45
|
①[こちら様](http://tsubakit1.hateblo.jp/entry/20140713/1405183951)
|
44
46
|
|
45
|
-
問題:
|
47
|
+
問題:キャラにぶつかっても車は止まりませんが、キャラは弾き飛ばされません。
|
46
48
|
|
47
49
|
|
48
50
|
|
@@ -78,8 +80,6 @@
|
|
78
80
|
|
79
81
|
private SpriteRenderer sr = null;
|
80
82
|
|
81
|
-
private string charaTag = "chara";//キャラタグ(プレイヤーキャラ、CPUキャラ共通)
|
82
|
-
|
83
83
|
|
84
84
|
|
85
85
|
void Start()
|
@@ -90,19 +90,21 @@
|
|
90
90
|
|
91
91
|
sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
float x = Random.Range(-1f,1f);//生成時、移動方向を左右ランダムに取得
|
96
|
-
|
97
|
-
rb.velocity = new Vector2(x * Speed, 0);
|
98
|
-
|
99
|
-
}
|
93
|
+
}
|
94
|
+
|
100
|
-
|
95
|
+
void LateUpdate()//普通のUpdateでいいのかLateあるいはFixedの方がいいのかよくわかってません。
|
96
|
+
|
101
|
-
|
97
|
+
{
|
98
|
+
|
102
|
-
|
99
|
+
//float x = Random.Range(-1f, 1f);
|
100
|
+
|
101
|
+
rb.velocity = new Vector2(Speed, 0);/*車がキャラにぶつかっても止まらないようにStart内からUpdate内に書き換えましたが、
|
102
|
+
|
103
|
+
上のfloat xをアクティブにすると車が左右にブレ続け移動しないという挙動不審になります。*/
|
104
|
+
|
105
|
+
}
|
106
|
+
|
103
|
-
void OnCollisionEnter2D(Collision2D coll)
|
107
|
+
void OnCollisionEnter2D(Collision2D coll)//@
|
104
|
-
|
105
|
-
|
106
108
|
|
107
109
|
{
|
108
110
|
|
@@ -110,25 +112,17 @@
|
|
110
112
|
|
111
113
|
/*コピペしたところ";が必要です"とメッセージが出たのでつけました。*/
|
112
114
|
|
113
|
-
|
114
|
-
|
115
115
|
foreach (var col in colliders)
|
116
116
|
|
117
|
-
|
118
|
-
|
119
117
|
{
|
120
118
|
|
121
|
-
if (GetComponent<Rigidbody2D>() != null)/*元の記述では”col.collider.rigidbody2D”でしたが、
|
122
|
-
|
123
|
-
|
119
|
+
if (col.rigidbody != null)//★ご教授頂き、"GetComponent<Rigidbody2D>()"を"col.rigidbody"に書き換えました。
|
124
|
-
|
125
|
-
と出たので書き換えました。*/
|
126
120
|
|
127
121
|
{
|
128
122
|
|
129
123
|
var diff = col.transform.position - transform.position;
|
130
124
|
|
131
|
-
|
125
|
+
col.rigidbody.AddForce(diff * 5f, ForceMode2D.Impulse);//★同上、書き換えました。
|
132
126
|
|
133
127
|
}
|
134
128
|
|
@@ -136,234 +130,260 @@
|
|
136
130
|
|
137
131
|
}
|
138
132
|
|
133
|
+
}//出処:テラシュール様 結果:キャラは車に押されますが、弾き飛ばされません。
|
134
|
+
|
135
|
+
```
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
②[こちら様](https://codegenius.org/open/courses/23/sections/188)
|
140
|
+
|
141
|
+
問題:こちらは元来Rigidbody用のものをご教授頂きRigodbody2Dに書き換えました。
|
142
|
+
|
143
|
+
ですが①同様、キャラにぶつかっても車は止まりませんが、キャラは弾き飛ばされません。
|
144
|
+
|
145
|
+
```C#
|
146
|
+
|
147
|
+
using System.Collections;
|
148
|
+
|
149
|
+
using System.Collections.Generic;
|
150
|
+
|
151
|
+
using UnityEngine;
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
public class kuruma04 : MonoBehaviour
|
156
|
+
|
157
|
+
{
|
158
|
+
|
159
|
+
public float Speed;//移動速度
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
public float radius = 10.0f;
|
164
|
+
|
165
|
+
public float power = 100.0f;
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
private bool nonVisibleAct;//映ってなくても動いてる
|
170
|
+
|
171
|
+
Rigidbody2D rb = null;
|
172
|
+
|
173
|
+
private SpriteRenderer sr = null;
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
void Start()
|
178
|
+
|
179
|
+
{
|
180
|
+
|
181
|
+
rb = GetComponent<Rigidbody2D>();//車プレハブのインスタンスを取得
|
182
|
+
|
183
|
+
sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断
|
184
|
+
|
185
|
+
}
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
void LateUpdate()//普通のUpdateでいいのかLateあるいはFixedの方がいいのかよくわかってません。
|
190
|
+
|
191
|
+
{
|
192
|
+
|
193
|
+
//float x = Random.Range(-1f, 1f);
|
194
|
+
|
195
|
+
rb.velocity = new Vector2(Speed, 0);/*車がキャラにぶつかっても止まらないようにStart内からUpdate内に書き換えましたが、
|
196
|
+
|
197
|
+
上のfloat xをアクティブにすると車が左右にブレ続け移動しないという挙動不審になります。*/
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
void OnCollision2D(Collision _other)/*ここの"OnCollisionEnter2D"が、Unity側で"This message parameter has to be of type:Collision2D"と出ます。
|
204
|
+
|
205
|
+
エラーが出たままでもシーン自体は動くのですが、書き換えました。*/
|
206
|
+
|
207
|
+
{
|
208
|
+
|
209
|
+
if (_other.gameObject.tag == "chara")
|
210
|
+
|
211
|
+
{
|
212
|
+
|
213
|
+
// 力を発生させる場所
|
214
|
+
|
215
|
+
Vector2 explosionPos = gameObject.transform.position;//元はVector3ですが書き換えました。
|
216
|
+
|
217
|
+
// 中心点から設定した半径の中にあるcolliderの配列を取得する。
|
218
|
+
|
219
|
+
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
|
220
|
+
|
221
|
+
foreach (Collider hit in colliders)
|
222
|
+
|
223
|
+
{
|
224
|
+
|
225
|
+
// 力を及ぼしたいオブジェクトにRigidbodyが付いていることが必要(ポイント)
|
226
|
+
|
227
|
+
Rigidbody2D hitrb = hit.GetComponent<Rigidbody2D>();/*元はRigidbodyですが書き換えました。
|
228
|
+
|
229
|
+
こちらでは「衝突したオブジェクトのインスタンス(rigidbody2D)を取得」命令の必要がある。
|
230
|
+
|
231
|
+
クラスで宣言している車プレハブの変数rbと競合していたのでhitrbとしました。*/
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
if (hitrb != null)
|
236
|
+
|
237
|
+
{
|
238
|
+
|
239
|
+
_other.rigidbody.AddExplosionForce(power, explosionPos, 5.0f);/*"rb"だと赤線が引かれ、
|
240
|
+
|
241
|
+
「'Collision' に 'rb' の定義が含まれておらず、型 'Collision' の最初の引数を受け付けるアクセス可能な拡張メソッド 'rb' が見つかりませんでした。
|
242
|
+
|
243
|
+
using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。」と出るので、
|
244
|
+
|
245
|
+
"rigidbody"に書き換えたところエラーは消えました。rigidbody2Dだと書き換え前と同じエラーが出ます。
|
246
|
+
|
247
|
+
ただしやはり、キャラは弾き飛ばされません。*/
|
248
|
+
|
249
|
+
// 取得したRigidbodyに力を加える
|
250
|
+
|
251
|
+
// 3つの引数(加える力の強さ、力の中心点、力を及ぼす半径)
|
252
|
+
|
253
|
+
}
|
254
|
+
|
255
|
+
}
|
256
|
+
|
257
|
+
}
|
258
|
+
|
259
|
+
}
|
260
|
+
|
261
|
+
}//出処 質問ページの②のサイト様 結果:キャラは車に押されますが、弾き飛ばされません。
|
262
|
+
|
263
|
+
/*自分用メモ:「次のメソッドまたはプロパティ間で呼び出しが不適切です」→当該スクリプト内、あるいは所属するソリューション内で、
|
264
|
+
|
265
|
+
引数などがダブっててVS側が「どっちを呼び出せばいいのかわからない」となっている。*/
|
266
|
+
|
267
|
+
```
|
268
|
+
|
269
|
+
③[こちら様(英語サイト)](https://stackoverflow.com/questions/34250868/unity-addexplosionforce-to-2d)
|
270
|
+
|
271
|
+
問題:上記2つ同様、キャラにぶつかっても車は止まりませんが、キャラは弾き飛ばされません。
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
```C#
|
276
|
+
|
277
|
+
using System.Collections;
|
278
|
+
|
279
|
+
using System.Collections.Generic;
|
280
|
+
|
281
|
+
using UnityEngine;
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
public class kuruma06 : MonoBehaviour
|
286
|
+
|
287
|
+
{
|
288
|
+
|
289
|
+
Rigidbody2D rb;
|
290
|
+
|
291
|
+
public float Speed;
|
292
|
+
|
293
|
+
private SpriteRenderer sr = null;
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
void Start()
|
298
|
+
|
299
|
+
{
|
300
|
+
|
301
|
+
rb = GetComponent<Rigidbody2D>();
|
302
|
+
|
303
|
+
sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断
|
304
|
+
|
305
|
+
}
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
void LateUpdate()//普通のUpdateでいいのかLateあるいはFixedの方がいいのかよくわかってません。
|
310
|
+
|
311
|
+
{
|
312
|
+
|
313
|
+
//float x = Random.Range(-1f, 1f);
|
314
|
+
|
315
|
+
rb.velocity = new Vector2(Speed, 0);/*車がキャラにぶつかっても止まらないようにStart内からUpdate内に書き換えましたが、
|
316
|
+
|
317
|
+
上のfloat xをアクティブにすると車が左右にブレ続け移動しないという挙動不審になります。*/
|
318
|
+
|
319
|
+
}
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
public float explosionStrength = 500;
|
324
|
+
|
325
|
+
void OnCollisionEnter2D(Collision2D _other)//@
|
326
|
+
|
327
|
+
{
|
328
|
+
|
329
|
+
_other.rigidbody.AddExplosionForce(explosionStrength, this.transform.position,5);
|
330
|
+
|
331
|
+
}
|
332
|
+
|
333
|
+
//自分用メモ:「現在のコンテキストに〜という名前は存在しません」→〜の記述位置から見て遠い、あるいはそもそもスクリプト内で定義されておらず、〜を参照できない。
|
334
|
+
|
139
335
|
}
|
140
336
|
|
141
337
|
|
142
338
|
|
339
|
+
public static class Rigidbody2DExt
|
340
|
+
|
341
|
+
{
|
342
|
+
|
343
|
+
public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force)
|
344
|
+
|
345
|
+
{
|
346
|
+
|
347
|
+
var explosionDir = rb.position - explosionPosition;
|
348
|
+
|
349
|
+
var explosionDistance = explosionDir.magnitude;
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
// Normalize without computing magnitude again
|
354
|
+
|
355
|
+
if (upwardsModifier == 0)
|
356
|
+
|
357
|
+
explosionDir /= explosionDistance;
|
358
|
+
|
359
|
+
else
|
360
|
+
|
361
|
+
{
|
362
|
+
|
363
|
+
// From Rigidbody.AddExplosionForce doc:
|
364
|
+
|
365
|
+
// If you pass a non-zero value for the upwardsModifier parameter, the direction
|
366
|
+
|
367
|
+
// will be modified by subtracting that value from the Y component of the centre point.
|
368
|
+
|
369
|
+
explosionDir.y += upwardsModifier;
|
370
|
+
|
371
|
+
explosionDir.Normalize();
|
372
|
+
|
373
|
+
}
|
374
|
+
|
375
|
+
rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
|
376
|
+
|
377
|
+
}
|
378
|
+
|
379
|
+
}
|
380
|
+
|
381
|
+
//出処:英語サイト 結果:キャラは車に押されますが、弾き飛ばされません。
|
382
|
+
|
143
383
|
```
|
144
384
|
|
145
385
|
|
146
386
|
|
147
|
-
②[こちら様](https://codegenius.org/open/courses/23/sections/188)
|
148
|
-
|
149
|
-
問題:こちらは元来Rigidbody用のものを手探りでRigodbody2Dに書き換えたのですが、
|
150
|
-
|
151
|
-
一番下の//★の行でVSにて赤線が引かれ、書き換え方がわからず動作できません。
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
```C#
|
156
|
-
|
157
|
-
using System.Collections;
|
158
|
-
|
159
|
-
using System.Collections.Generic;
|
160
|
-
|
161
|
-
using UnityEngine;
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
public class kuruma04 : MonoBehaviour
|
166
|
-
|
167
|
-
{
|
168
|
-
|
169
|
-
public float Speed;//移動速度
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
public float radius = 10.0f;
|
174
|
-
|
175
|
-
public float power = 100.0f;
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
private bool nonVisibleAct;//映ってなくても動いてる
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
Rigidbody2D rb = null;
|
184
|
-
|
185
|
-
private SpriteRenderer sr = null;
|
186
|
-
|
187
|
-
private string charaTag = "chara";//キャラタグ(プレイヤーキャラ、CPUキャラ共通)
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
void Start()
|
192
|
-
|
193
|
-
{
|
194
|
-
|
195
|
-
rb = GetComponent<Rigidbody2D>();
|
196
|
-
|
197
|
-
sr = GetComponent<SpriteRenderer>();//自身が画面に映っているか判断
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
float x = Random.Range(-1f,1f);//生成時、移動方向を左右ランダムに取得
|
202
|
-
|
203
|
-
rb.velocity = new Vector2(x * Speed, 0);
|
204
|
-
|
205
|
-
}
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
void OnCollisionEnter2D(Collision other)
|
210
|
-
|
211
|
-
{
|
212
|
-
|
213
|
-
if (other.gameObject.tag == "chara")
|
214
|
-
|
215
|
-
{
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
// 力を発生させる場所
|
220
|
-
|
221
|
-
Vector2 explosionPos = gameObject.transform.position;//元はVector3ですが書き換えました。
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
// 中心点から設定した半径の中にあるcolliderの配列を取得する。
|
226
|
-
|
227
|
-
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
foreach (Collider hit in colliders)
|
232
|
-
|
233
|
-
{
|
234
|
-
|
235
|
-
// 力を及ぼしたいオブジェクトにRigidbodyが付いていることが必要(ポイント)
|
236
|
-
|
237
|
-
Rigidbody2D rb = hit.GetComponent<Rigidbody2D>();//元はRigidbodyですが書き換えました。
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
if (rb != null)
|
242
|
-
|
243
|
-
{
|
244
|
-
|
245
|
-
// 取得したRigidbodyに力を加える
|
246
|
-
|
247
|
-
// 3つの引数(加える力の強さ、力の中心点、力を及ぼす半径)
|
248
|
-
|
249
|
-
rb.AddExplosionForce(power, explosionPos, 5.0f);//★ここの"AddExplosionForce"に赤線が引かれ、2Dへの書き換えがわからず動作できません。
|
250
|
-
|
251
|
-
}
|
252
|
-
|
253
|
-
}
|
254
|
-
|
255
|
-
}
|
256
|
-
|
257
|
-
}
|
258
|
-
|
259
|
-
}
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
```
|
264
|
-
|
265
|
-
③[こちら様(英語サイト)](https://stackoverflow.com/questions/34250868/unity-addexplosionforce-to-2d)
|
266
|
-
|
267
|
-
問題1:★★で囲った"AddExplosionForce"にVSにて赤線が引かれ、
|
268
|
-
|
269
|
-
「(拡張子) void Rigidbody2D.AddExplosionForce(float explosionForce, Vector2 explosionPosition, float explosionRadius, [float upwardsModifier = 0], [ForceMode2D mode = ForceMode2D.Force]) (+ 1 オーバーロード)
|
270
|
-
|
271
|
-
次のメソッドまたはプロパティ間で呼び出しが不適切です: 'kuruma05.AddExplosionForce(Rigidbody2D, float, Vector2, float, float, ForceMode2D)' と 'Rigidbody2DExt.AddExplosionForce(Rigidbody2D, float, Vector2, float, float, ForceMode2D)'」
|
272
|
-
|
273
|
-
とメッセージが出ます。
|
274
|
-
|
275
|
-
以下のスクリプトはkuruma05.csから複製して書き換えたkuruma06.csなのですが、クラス名も変えているのに、
|
276
|
-
|
277
|
-
なぜメッセージ内でkuruma05が出るのかもわかりません。
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
問題2:★★の前の"rigidbody"を"rigidbody2D"に書き換えると、★★のエラーは消えるのですが、
|
282
|
-
|
283
|
-
今度は書き換えた"rigidbody2D"に赤線が引かれ、
|
284
|
-
|
285
|
-
「'Collision2D' に 'rigidbody2D' の定義が含まれておらず、型 'Collision2D' の最初の引数を受け付けるアクセス可能な拡張メソッド 'rigidbody2D' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。」
|
286
|
-
|
287
|
-
とメッセージが出ます。
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
```C#
|
292
|
-
|
293
|
-
using System.Collections;
|
294
|
-
|
295
|
-
using System.Collections.Generic;
|
296
|
-
|
297
|
-
using UnityEngine;
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
public class kuruma06 : MonoBehaviour
|
302
|
-
|
303
|
-
{
|
304
|
-
|
305
|
-
public float explosionStrength = 100;
|
306
|
-
|
307
|
-
void OnCollisionEnter2D(Collision2D _other)
|
308
|
-
|
309
|
-
{
|
310
|
-
|
311
|
-
if (_other.collider.gameObject.name == "Bouncy object")
|
312
|
-
|
313
|
-
_other.rigidbody.★AddExplosionForce★(explosionStrength, this.transform.position, 5);
|
314
|
-
|
315
|
-
}
|
316
|
-
|
317
|
-
}
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
public static class Rigidbody2DExt
|
322
|
-
|
323
|
-
{
|
324
|
-
|
325
|
-
public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force)
|
326
|
-
|
327
|
-
{
|
328
|
-
|
329
|
-
var explosionDir = rb.position - explosionPosition;
|
330
|
-
|
331
|
-
var explosionDistance = explosionDir.magnitude;
|
332
|
-
|
333
|
-
// Normalize without computing magnitude again
|
334
|
-
|
335
|
-
if (upwardsModifier == 0)
|
336
|
-
|
337
|
-
explosionDir /= explosionDistance;
|
338
|
-
|
339
|
-
else
|
340
|
-
|
341
|
-
{
|
342
|
-
|
343
|
-
// From Rigidbody.AddExplosionForce doc:
|
344
|
-
|
345
|
-
// If you pass a non-zero value for the upwardsModifier parameter, the direction
|
346
|
-
|
347
|
-
// will be modified by subtracting that value from the Y component of the centre point.
|
348
|
-
|
349
|
-
explosionDir.y += upwardsModifier;
|
350
|
-
|
351
|
-
explosionDir.Normalize();
|
352
|
-
|
353
|
-
}
|
354
|
-
|
355
|
-
rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
|
356
|
-
|
357
|
-
}
|
358
|
-
|
359
|
-
}
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
```
|
364
|
-
|
365
|
-
|
366
|
-
|
367
387
|
###キャラの移動について
|
368
388
|
|
369
389
|
現在、プレイヤーキャラ、CPUともにVelocityで動かしておりますが、
|
3
頂いたアドバイスを実行して出るエラーを質問欄に反映しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -264,11 +264,27 @@
|
|
264
264
|
|
265
265
|
③[こちら様(英語サイト)](https://stackoverflow.com/questions/34250868/unity-addexplosionforce-to-2d)
|
266
266
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
267
|
+
問題1:★★で囲った"AddExplosionForce"にVSにて赤線が引かれ、
|
268
|
+
|
269
|
+
「(拡張子) void Rigidbody2D.AddExplosionForce(float explosionForce, Vector2 explosionPosition, float explosionRadius, [float upwardsModifier = 0], [ForceMode2D mode = ForceMode2D.Force]) (+ 1 オーバーロード)
|
270
|
+
|
271
|
+
次のメソッドまたはプロパティ間で呼び出しが不適切です: 'kuruma05.AddExplosionForce(Rigidbody2D, float, Vector2, float, float, ForceMode2D)' と 'Rigidbody2DExt.AddExplosionForce(Rigidbody2D, float, Vector2, float, float, ForceMode2D)'」
|
272
|
+
|
273
|
+
とメッセージが出ます。
|
274
|
+
|
275
|
+
以下のスクリプトはkuruma05.csから複製して書き換えたkuruma06.csなのですが、クラス名も変えているのに、
|
276
|
+
|
277
|
+
なぜメッセージ内でkuruma05が出るのかもわかりません。
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
問題2:★★の前の"rigidbody"を"rigidbody2D"に書き換えると、★★のエラーは消えるのですが、
|
282
|
+
|
283
|
+
今度は書き換えた"rigidbody2D"に赤線が引かれ、
|
284
|
+
|
285
|
+
「'Collision2D' に 'rigidbody2D' の定義が含まれておらず、型 'Collision2D' の最初の引数を受け付けるアクセス可能な拡張メソッド 'rigidbody2D' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。」
|
286
|
+
|
287
|
+
とメッセージが出ます。
|
272
288
|
|
273
289
|
|
274
290
|
|
@@ -282,11 +298,29 @@
|
|
282
298
|
|
283
299
|
|
284
300
|
|
285
|
-
public
|
301
|
+
public class kuruma06 : MonoBehaviour
|
286
302
|
|
287
303
|
{
|
288
304
|
|
289
|
-
|
305
|
+
public float explosionStrength = 100;
|
306
|
+
|
307
|
+
void OnCollisionEnter2D(Collision2D _other)
|
308
|
+
|
309
|
+
{
|
310
|
+
|
311
|
+
if (_other.collider.gameObject.name == "Bouncy object")
|
312
|
+
|
313
|
+
_other.rigidbody.★AddExplosionForce★(explosionStrength, this.transform.position, 5);
|
314
|
+
|
315
|
+
}
|
316
|
+
|
317
|
+
}
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
public static class Rigidbody2DExt
|
322
|
+
|
323
|
+
{
|
290
324
|
|
291
325
|
public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force)
|
292
326
|
|
@@ -296,11 +330,9 @@
|
|
296
330
|
|
297
331
|
var explosionDistance = explosionDir.magnitude;
|
298
332
|
|
299
|
-
|
300
|
-
|
301
333
|
// Normalize without computing magnitude again
|
302
334
|
|
303
|
-
if (upwardsModifier == 0)
|
335
|
+
if (upwardsModifier == 0)
|
304
336
|
|
305
337
|
explosionDir /= explosionDistance;
|
306
338
|
|
@@ -320,8 +352,6 @@
|
|
320
352
|
|
321
353
|
}
|
322
354
|
|
323
|
-
|
324
|
-
|
325
355
|
rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
|
326
356
|
|
327
357
|
}
|
2
試したスクリプトが増えたので、質問欄の前提に増やしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
|
38
38
|
|
39
|
-
車のプレハブにつけるスクリプトを、
|
39
|
+
車のプレハブにつけるスクリプトを、3箇所のサイト様のコードを試しましたが、それぞれ問題が生じます。
|
40
40
|
|
41
41
|
|
42
42
|
|
@@ -262,6 +262,76 @@
|
|
262
262
|
|
263
263
|
```
|
264
264
|
|
265
|
+
③[こちら様(英語サイト)](https://stackoverflow.com/questions/34250868/unity-addexplosionforce-to-2d)
|
266
|
+
|
267
|
+
スクリプト中ほど//の☆の行に黄色線が引かれるのと、車のプレハブにつけようとすると、
|
268
|
+
|
269
|
+
Unity側で「Can't add script behaviour kuruma05. The script class can't be abstract!」
|
270
|
+
|
271
|
+
と出ます。要するに「MonoBehabiourがなくて、Unityでは使えません」という意味であっているでしょうか?
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
```C#
|
276
|
+
|
277
|
+
using System.Collections;
|
278
|
+
|
279
|
+
using System.Collections.Generic;
|
280
|
+
|
281
|
+
using UnityEngine;
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
public static class kuruma05//☆":MonoBehaviour"を書いたままだとクラス名に赤線が引かれます。
|
286
|
+
|
287
|
+
{
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
public static void AddExplosionForce(this Rigidbody2D rb, float explosionForce, Vector2 explosionPosition, float explosionRadius, float upwardsModifier = 0.0F, ForceMode2D mode = ForceMode2D.Force)
|
292
|
+
|
293
|
+
{
|
294
|
+
|
295
|
+
var explosionDir = rb.position - explosionPosition;
|
296
|
+
|
297
|
+
var explosionDistance = explosionDir.magnitude;
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
// Normalize without computing magnitude again
|
302
|
+
|
303
|
+
if (upwardsModifier == 0)/*☆ここに黄色線が引かれ、"Fix floating point number comparing. Compare a difference with epsilon."と出ます。*/
|
304
|
+
|
305
|
+
explosionDir /= explosionDistance;
|
306
|
+
|
307
|
+
else
|
308
|
+
|
309
|
+
{
|
310
|
+
|
311
|
+
// From Rigidbody.AddExplosionForce doc:
|
312
|
+
|
313
|
+
// If you pass a non-zero value for the upwardsModifier parameter, the direction
|
314
|
+
|
315
|
+
// will be modified by subtracting that value from the Y component of the centre point.
|
316
|
+
|
317
|
+
explosionDir.y += upwardsModifier;
|
318
|
+
|
319
|
+
explosionDir.Normalize();
|
320
|
+
|
321
|
+
}
|
322
|
+
|
323
|
+
|
324
|
+
|
325
|
+
rb.AddForce(Mathf.Lerp(0, explosionForce, (1 - explosionDistance)) * explosionDir, mode);
|
326
|
+
|
327
|
+
}
|
328
|
+
|
329
|
+
}
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
```
|
334
|
+
|
265
335
|
|
266
336
|
|
267
337
|
###キャラの移動について
|
1
ここまでできていることの欄に漏れがあったので足しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -298,10 +298,12 @@
|
|
298
298
|
|
299
299
|
・カメラのプレイヤー追従(y軸のみ)
|
300
300
|
|
301
|
-
・障害物のランダム座標生成
|
302
|
-
|
303
301
|
・CPUキャラの自走(y軸下に向けて進むだけですが)
|
304
302
|
|
303
|
+
・オブジェクトのランダム座標生成、及びランダムな方向への移動
|
304
|
+
|
305
|
+
・加速アイテム実装
|
306
|
+
|
305
307
|
|
306
308
|
|
307
309
|
ここまで同じゲームで質問させて頂き、解決に至るご教授を頂いておりますので、
|