teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/01/07 09:53

投稿

PinoMatcha
PinoMatcha

スコア368

answer CHANGED
@@ -9,4 +9,111 @@
9
9
  print("スペースを押した");
10
10
  // StartCoroutine(CarJump());
11
11
  }
12
- ```
12
+ ```
13
+ ### 追記: コルーチンでのジャンプ処理
14
+ 一応コピペしてから改造したので仕様が大きく変わってるとは思いませんが、もし違っていたら適宜修正をお願いします。
15
+ ```C#
16
+ using System.Collections;
17
+ using UnityEngine;
18
+
19
+ public class JumpTest : MonoBehaviour
20
+ {
21
+
22
+ // 車のモデル(子オブジェクト)
23
+ // 型をTransformに変更
24
+ [SerializeField] private Transform model_t;
25
+
26
+ [SerializeField] private float jumpHeight = 0.4f;
27
+ [SerializeField] private float jumpSpeed = 5.0f;
28
+
29
+ // スペースを連打するとコルーチンが何回も走るので防止用
30
+ private bool jumping = false;
31
+
32
+ void Update() {
33
+ if (Input.GetKeyDown(KeyCode.Space) && jumping == false) {
34
+ print("スペースを押した (jumping == false)");
35
+ StartCoroutine(CarJump());
36
+ }
37
+ }
38
+
39
+ /// <summary>
40
+ /// 車をジャンプする
41
+ /// </summary>
42
+ /* private IEnumerator CarJump() {
43
+ print("ジャンプ");
44
+ var CarJumpPos = 0;
45
+ var CarJumpMax = 10;
46
+ var CarJumpPower = 2;
47
+
48
+ while (CarJumpPos < CarJumpMax) {
49
+ CarJumpPos += CarJumpPower;
50
+ modelPos =
51
+ new Vector3(modelPos.x, modelPos.y + CarJumpPos, modelPos.z);
52
+ print("ジャンプしている");
53
+ yield return null;
54
+ }
55
+
56
+ while (CarJumpPos >= 0) {
57
+ CarJumpPos -= CarJumpPower;
58
+ modelPos -= new Vector3(modelPos.x, modelPos.y - CarJumpPos, modelPos.z);
59
+ }
60
+ }*/
61
+
62
+ private IEnumerator CarJump () {
63
+
64
+ // モデルがセットされていなければ、エラー吐いてコルーチンが止まってしまうので終了
65
+ if (model_t == null) yield break;
66
+
67
+ print("ジャンプ開始");
68
+ jumping = true;
69
+
70
+ // 子オブジェクト(車のモデル)のローカル座標(y)が親に対して必ずゼロとは限らないので一応格納。
71
+ float yOffset = model_t.localPosition.y;
72
+ // オフセットにジャンプの高さを足したものをジャンプの最終地点とする。
73
+ float localizedJumpHeight = yOffset + jumpHeight;
74
+
75
+ // 目標の高さより低ければ、ポジションを上げていく。
76
+ while (model_t.localPosition.y < localizedJumpHeight) {
77
+ // *** yだけいじる *** //
78
+ // ▼ model_t.localPosition.y = 1 のように直接はいじれないので変数に一度格納。
79
+ Vector3 localPos = model_t.localPosition;
80
+ localPos.y += jumpSpeed * Time.deltaTime; // yに足していく
81
+ localPos.y = Mathf.Clamp(localPos.y, yOffset, localizedJumpHeight); // yが最低値と最大値からはみ出ないようにClamp
82
+ model_t.localPosition = localPos; // 代入
83
+ // ******************* //
84
+
85
+ yield return null; // ループの場合、この記述がないとフリーズする
86
+ }
87
+
88
+ // 一応、最大値で代入しておく(たぶんなくてもいい)
89
+ model_t.localPosition = new Vector3(model_t.localPosition.x, localizedJumpHeight, model_t.localPosition.z);
90
+
91
+ // オフセット(始めの位置)より高ければポジションを下げる。
92
+ while (model_t.localPosition.y > yOffset) {
93
+ // *** yだけいじる *** //
94
+ Vector3 localPos = model_t.localPosition;
95
+ localPos.y -= jumpSpeed * Time.deltaTime; // yから引いていく
96
+ localPos.y = Mathf.Clamp(localPos.y, yOffset, localizedJumpHeight);
97
+ model_t.localPosition = localPos;
98
+ // ******************* //
99
+
100
+ yield return null;
101
+ }
102
+
103
+ // こっちも一応最低値で代入しておく(たぶんなくてもいい)
104
+ model_t.localPosition = new Vector3(model_t.localPosition.x, yOffset, model_t.localPosition.z);
105
+
106
+ print("ジャンプ終了");
107
+ jumping = false;
108
+
109
+ // コルーチン終了
110
+ yield break;
111
+ }
112
+ }
113
+ ```
114
+ ### 余談
115
+ 大きなお世話かもしれませんが、コードをコピペした時、手を加えていないにも関わらずエラーが出ていました。
116
+ 上のコードはそのエラーを修正したのち、改造したものになります。
117
+
118
+ 原因は {} の数が合っていないという小さいものでしたが、エラーはエラーです。
119
+ スクリプトの記述について、今一度ご確認ください。