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の左のボタンをオンにした状態で、シーン上でコライダーを変形できます。

コライダーの各面についている点を引っ張るとコライダーを引き伸ばして拡大できます。

前の記事と同じ様に、バーとレーンにレイヤーを付けて、互いに衝突しないように設定します。また、この時に作ったピンをセットするためのスクリプトにバーのアニメーションを制御するコードを追加しました。

  1. IEnumerator SetPin()
  2. {
  3. barAnimator.SetTrigger("barTrig"); // バーが降りる
  4. yield return new WaitForSeconds(0.5f);
  5.  
  6. pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が降りる
  7.  
  8. yield return new WaitForSeconds(1.5f);
  9.  
  10. text.text = "";
  11.  
  12. foreach (GameObject pin in pins)
  13. {
  14. if (pin.transform.rotation.x * pin.transform.rotation.x < q && pin.transform.rotation.z * pin.transform.rotation.z < q)
  15. {
  16. pin.transform.parent = pinsetter.transform; // 立っているピンを天井の子オブジェクトにする。
  17. }
  18. }
  19.  
  20. pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が上がる
  21.  
  22. yield return new WaitForSeconds(1f);
  23. barAnimator.SetTrigger("barTrig"); // バーがピンを排除
  24. yield return new WaitForSeconds(1f);
  25.  
  26. pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が降りる
  27.  
  28. yield return new WaitForSeconds(1.5f);
  29.  
  30. foreach (GameObject pin in pins)
  31. {
  32. if (pin.transform.rotation.x * pin.transform.rotation.x < q && pin.transform.rotation.z * pin.transform.rotation.z < q)
  33. {
  34. pin.transform.parent = null; // 立っているピンと天井の親子関係を解く
  35. pin.GetComponent<Rigidbody>().isKinematic = false;
  36. }
  37. }
  38. barAnimator.SetTrigger("barTrig"); // バーが上がる
  39.  
  40. pinsetterAnimator.SetTrigger("Pinsetter"); // 天井が上がる
  41. yield return new WaitForSeconds(1.1f);
  42. setpin = false;
  43. }

このままではなぜかピンがうまく取り除かれません。

これは2通りの方法で解決できました。まずはピンを払いのけるアニメーションのSamplesを下げて、アニメーションをゆっくりにすると、冒頭のようにピンがうまく排除されます。

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

コメントを残す

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