プレーヤーの前でボール(Prefab)を保持し、スペースキーを押せば落下。
落としてから1秒後に、またボールがセットされるしくみを、スクリプトで作成します。
関連記事:
取ったオブジェクトを前で持ち続ける
オブジェクトを持ったり置いたりする
保持したボールをプレーヤーと同じ向きで発射
静止中のオブジェクトをクリックで飛ばす
出現してから1秒後に落下する
Invokeを使ってn秒後に関数を実行する
落下スピードをランダムにする
Prefabを並べて一気に発射
オブジェクトの用意
Cubeを作成し、サイズと位置を変更します。
Cubeの前方に、ボールのセットポイントを、子オブジェクトとして作成します。
Cubeを右クリックして、空のオブジェクトを作成。
オブジェクト名をSetPointに変更し、Zを-1にします。
わかりやすいように、アイコンを設定します。
シーンビューの真横から、このように見えています。
続いて、Sphereを作成し、リジッドボディを追加します。
BallDrop.csを作成し、Sphereに追加します。
BallDrop.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallDrop : MonoBehaviour { private Rigidbody rb; private GameObject parentObj; void Start() { rb = gameObject.GetComponent<Rigidbody>(); rb.isKinematic = true; parentObj = GameObject.Find("SetPoint"); transform.SetParent(parentObj.transform); } void Update() { if(Input.GetKeyDown(KeyCode.Space)) { rb.isKinematic = false; transform.parent = null; Destroy(gameObject, 2.0f); } } } |
これは、ボールが生成された際のプログラムです。
SetPointを親オブジェクトとして持つため、生成後は一緒に移動します。
スペースキーが押されると、親子関係を切り離し、キネマティックをOFFにして、ボールを落下させるしくみです。
Sphereをプロジェクトビューにドラッグ&ドロップし、プレハブ化します。
Sphereの元データは削除します。
保持したPrefabを落とせば、新しいPrefabを補充
続いて、プレーヤー側のスクリプトを作成します。
CubeMove.csを作成し、Cubeに追加します。
CubeMove.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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeMove : MonoBehaviour { [SerializeField] GameObject ball; [SerializeField] GameObject setPoint; private float speed = 5.0f; private float time; void Start() { Instantiate(ball, setPoint.transform.position, Quaternion.identity); time = 0; } void Update() { time -= Time.deltaTime; if(Input.GetKeyDown(KeyCode.Space) && time<=0) { Invoke("BallSet", 1.0f); time = 1.0f; } float moveX = Input.GetAxis("Horizontal") * Time.deltaTime * speed; transform.position = new Vector3 ( transform.position.x + moveX, transform.position.y, transform.position.z ); } void BallSet() { Instantiate(ball, setPoint.transform.position, Quaternion.identity); } } |
SetPointのフィールドに、SetPointを入れます。
Ballのフィールドに、Sphereを入れます。
ゲームプレイして、左右キーで移動、スペースキーでボールを落とします。
Invokeによって、スペースキーが押された1秒後に、BallSet()を実行。
SetPoinitの位置にボールが生成されます。
またここでは、連射防止のためにtimeを作っています。
これにより、いくらスペースキーを連打しても、1秒経過しなければ、ボールを落とすことはできません。
関連記事:
取ったオブジェクトを前で持ち続ける
オブジェクトを持ったり置いたりする
保持したボールをプレーヤーと同じ向きで発射
静止中のオブジェクトをクリックで飛ばす
出現してから1秒後に落下する
Invokeを使ってn秒後に関数を実行する
落下スピードをランダムにする
Prefabを並べて一気に発射