回答編集履歴

1

放物線を描くパターンを追記

2022/07/23 23:08

投稿

Bongo
Bongo

スコア10816

test CHANGED
@@ -213,3 +213,100 @@
213
213
  ```
214
214
 
215
215
  ![図2](https://ddjkaamml8q8x.cloudfront.net/questions/2022-07-24/6a6c979c-aa6b-4faa-99a4-914e7c745efb.gif)
216
+
217
+ ## 追記
218
+
219
+ すみません、「速度をコントロールする方法がわからない」とおっしゃる意味を誤解してしまったかもしれません。
220
+ もう1パターン、下記のような形を作ってみましたがいかがでしょうか。
221
+
222
+ ```C#
223
+ using UnityEngine;
224
+
225
+ public class Throw3 : MonoBehaviour
226
+ {
227
+ //投げる水平スピード
228
+ public float speed = 10;
229
+
230
+ //射出角度
231
+ [Range(0.0f, 90.0f)] public float throwingAngle = 60.0f;
232
+
233
+ //地上にいるときのY座標
234
+ public float baseHeight = 1.0f;
235
+
236
+ //投げるフラグ
237
+ bool Throwing;
238
+
239
+ Vector3 FromPoint;
240
+ Vector3 ToPoint;
241
+ float Travel;
242
+
243
+ void Update()
244
+ {
245
+ _Throw();
246
+ }
247
+
248
+ void _Throw()
249
+ {
250
+ //左クリック時のマウス座標を取得
251
+ if (Input.GetMouseButtonDown(0))
252
+ {
253
+ //マウスポインタの位置を指すレイを作成
254
+ var mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
255
+
256
+ //地上を表す平面を作成
257
+ var basePlane = new Plane(Vector3.up, -baseHeight);
258
+ if (basePlane.Raycast(mouseRay, out var enter))
259
+ {
260
+ //レイと平面の交差があれば、その地点を目的地とする
261
+ ToPoint = mouseRay.GetPoint(enter);
262
+
263
+ //現在の位置を地上の高さに合わせ、その地点を出発地とする
264
+ FromPoint = transform.position;
265
+ FromPoint.y = baseHeight;
266
+
267
+ //移動量を0.0にリセットしておく
268
+ Travel = 0.0f;
269
+ Throwing = true;
270
+
271
+ print($"{FromPoint} -> {ToPoint}");
272
+ }
273
+ }
274
+
275
+ if (Throwing)
276
+ {
277
+ //出発地からの水平移動量を求め...
278
+ Travel += speed * Time.deltaTime;
279
+
280
+ //出発地と目的地の距離を求め...
281
+ var distance = Vector3.Distance(FromPoint, ToPoint);
282
+
283
+ //進行割合を求め...
284
+ var t = Travel / distance;
285
+
286
+ if (t < 1.0f)
287
+ {
288
+ //tが0.5(つまり中間地点)からどれだけ離れているかを求める
289
+ //中間地点で0.0、出発地や目的地で1.0となるような値にする
290
+ var d = Mathf.Abs(t - 0.5f) * 2.0f;
291
+
292
+ //現在の水平位置を決め...
293
+ var p = Vector3.Lerp(FromPoint, ToPoint, t);
294
+
295
+ //高さを二次関数の曲線に沿って調整し...
296
+ p.y += Mathf.Tan(Mathf.Deg2Rad * this.throwingAngle) * 0.25f * distance * (1.0f - (d * d));
297
+
298
+ //位置を設定する
299
+ transform.position = p;
300
+ }
301
+ else
302
+ {
303
+ //tが1.0に到達したら移動終了とする
304
+ transform.position = ToPoint;
305
+ Throwing = false;
306
+ }
307
+ }
308
+ }
309
+ }
310
+ ```
311
+
312
+ ![図3](https://ddjkaamml8q8x.cloudfront.net/questions/2022-07-24/a137e5f1-4fc1-47b4-9966-908132f6d0c0.gif)