立っているピンを持ち上げている間に、倒れたピンを払いのけます。
まずBlenderでレーンに合わせてバーのようなものを作ってUnityに持ってきました。
バーが上がるアニメーションと、そこから下がって前面に来るアニメーションと、倒れたピンを払いのけるために前後に動くアニメーションを作りました。
アニメーターコントローラーで各ステートを順につなぎ、Parameterの「+」ボタンからトリガーパラメータを一つ作ります。
前面にあってレーンがふさがっている状態がデフォルトで、ゲームが始まるとバーが上がり、その後は「barTrig」パラメータがセットされるたびに、下る→払いのけて戻る→上がる→下る…というアニメーションに遷移するように設定しました。
各矢印のインスペクタでは、Has Exit Timeのチェックを外し、Transition Durationを0にして、ConditionsにbarTrigパラメータを追加します。
アニメーションはデフォルトでループ再生されるようになっているので、バーが回り続けてしまいます。
各ステートをダブルクリックしてアニメーションを開いて、Loop Timeのチェックを外すと一度だけ再生されるようになります。
バーにはRigidbodyとBoxコライダーを付けました。RigidbodyではUse Gravityをオフ、Is Kinematicをオンにして、Collision Detectionを「Continuous Dynamic」にします。
コライダーは隙間を埋めるように少し大きくします。
Edit Colliderの左のボタンをオンにした状態で、シーン上でコライダーを変形できます。
コライダーの各面についている点を引っ張るとコライダーを引き伸ばして拡大できます。
前の記事と同じ様に、バーとレーンにレイヤーを付けて、互いに衝突しないように設定します。また、この時に作ったピンをセットするためのスクリプトにバーのアニメーションを制御するコードを追加しました。
- IEnumerator SetPin()
- {
- barAnimator.SetTrigger("barTrig"); // バーが降りる
- yield return new WaitForSeconds(0.5f);
-
- pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が降りる
-
- yield return new WaitForSeconds(1.5f);
-
- text.text = "";
-
- foreach (GameObject pin in pins)
- {
- if (pin.transform.rotation.x * pin.transform.rotation.x < q && pin.transform.rotation.z * pin.transform.rotation.z < q)
- {
- pin.transform.parent = pinsetter.transform; // 立っているピンを天井の子オブジェクトにする。
- }
- }
-
- pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が上がる
-
- yield return new WaitForSeconds(1f);
- barAnimator.SetTrigger("barTrig"); // バーがピンを排除
- yield return new WaitForSeconds(1f);
-
- pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が降りる
-
- yield return new WaitForSeconds(1.5f);
-
- foreach (GameObject pin in pins)
- {
- if (pin.transform.rotation.x * pin.transform.rotation.x < q && pin.transform.rotation.z * pin.transform.rotation.z < q)
- {
- pin.transform.parent = null; // 立っているピンと天井の親子関係を解く
- pin.GetComponent<Rigidbody>().isKinematic = false;
- }
- }
- barAnimator.SetTrigger("barTrig"); // バーが上がる
-
- pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が上がる
- yield return new WaitForSeconds(1.1f);
- setpin = false;
- }
このままではなぜかピンがうまく取り除かれません。
これは2通りの方法で解決できました。まずはピンを払いのけるアニメーションのSamplesを下げて、アニメーションをゆっくりにすると、冒頭のようにピンがうまく排除されます。
また、コライダーを手前に拡大してピンに対して厚みを作ると、アニメーションが早いままでもうまくいきました。