壁に囲まれた中で、オブジェクトを無限に反射させるしくみを作ってみましょう。
今回の例では、ボールが壁にぶつかるとランダムの方向に跳ね返り続けます。
重力ではなく、スクリプトでボールに力を加えています。
ずっと跳ね返り続けるボール
Cubeで囲いをつくります。
Cubeの名前をこのように変更しました。
Sphereを作成し、中央に配置します。
Sphereにリジッドボディを追加し、重力を使用のチェックを外します。
重力ではなく、スクリプトのほうから力を加えることにします。
物理マテリアルを作成します。
物理マテリアルをSphereに追加します。
物理マテリアルの設定を、以下のようにしました。
BallScript.csを作成し、Sphereに追加します。
BallScript.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallScript : MonoBehaviour { private float power; Rigidbody rb; void Start() { power = 10.0f; rb = GetComponent<Rigidbody>(); rb.AddForce(transform.up * power, ForceMode.Impulse); } void OnCollisionEnter (Collision other) { if(other.gameObject.name == "TopWall") { float randomDir = Random.Range(-power, power); rb.velocity = Vector3.zero; rb.AddForce(randomDir, -power, 0, ForceMode.Impulse); } if(other.gameObject.name == "BottomWall") { float randomDir = Random.Range(-power, power); rb.velocity = Vector3.zero; rb.AddForce(randomDir, power, 0, ForceMode.Impulse); } if(other.gameObject.name == "RightWall") { float randomDir = Random.Range(-power, power); rb.velocity = Vector3.zero; rb.AddForce(-power, randomDir,0, ForceMode.Impulse); } if(other.gameObject.name == "LeftWall") { float randomDir = Random.Range(-power, power); rb.velocity = Vector3.zero; rb.AddForce(power, randomDir,0, ForceMode.Impulse); } } } |
ゲームプレイしてみましょう。
壁に当たるたびに、ボールがランダムの方向に反射します。
それそれの壁にぶつかるたびに、10~-10のランダム方向にボールに力を加えて弾き返しています。