回答編集履歴
1
放物線を描くパターンを追記
test
CHANGED
@@ -213,3 +213,100 @@
|
|
213
213
|
```
|
214
214
|
|
215
215
|

|
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
|
+

|