Unityでボーリングゲームを作る #5 倒れたピンを払いのける

投稿者: | 2020-01-30


立っているピンを持ち上げている間に、倒れたピンを払いのけます。

まず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を下げて、アニメーションをゆっくりにすると、冒頭のようにピンがうまく排除されます。

また、コライダーを手前に拡大してピンに対して厚みを作ると、アニメーションが早いままでもうまくいきました。

コメントを残す

メールアドレスが公開されることはありません。