箱を積み上げる簡単な落ち物ゲームをUnity6で作成する。第2回目です。
はじめに
Part1は下記です。
今回やること
パート1では箱を生成して自然落下するところまで作成しました。今回は画面をクリックしたら箱が落ちるようにしていきます。
実装開始
まずはゲーム開始で箱が生成されるのを「クリックしたら箱を生成」するように変更します。いくつか方法がありますが、InputSystemを利用していきます。InputSystem_Acitonsをダブルクリックして開いてみます。

初期でPlayerが用意されています。Playerという名前なので、本来はキャラクターを操作するのに利用するのに便利ですが、今回はキャラクターがいないのでそのまま利用していきます。
Attackアクションに「マウス左クリック」、「キーボードのEnter」などが設定されているので、これを使います。

GameManagerスクリプトを下記に変更します。
using UnityEngine; using UnityEngine.InputSystem; public class GameManager : MonoBehaviour { [SerializeField] private GameObject boxPrefab; [SerializeField] private Transform boxPosition; public void DropBox(InputAction.CallbackContext context) { if (context.started) { Instantiate(boxPrefab, boxPosition.position, Quaternion.identity); } } }
次にGameManagerに「AddComponent」から「PlayerInput」を追加します。

PlayerInputのActionsに「InputStstem_Actions」を設定し、Behaviorを「InvokeUnityEvents」に変更します。

PlayerInputの「Events」→「Player」→「Attack」に先ほど追加したGameManagerスクリプトのDropBoxをセットします。

左クリック、キーボードのEnter、画面タップなどで箱が生成されます。「context.started」は押した時なので、押したタイミングで箱が生成されます。下記のように動作すればOKです。

下記がinputsystemの公式マニュアルです。
クリックで箱を落下
現状、箱を生成すると自動で落下します。これは箱にRigidbodyを追加したときに、GravityScale(重力)がセットされているからです。

GravityScaleを0にする、もしくはSimulatedのチェックを外すことで自動で落下しなくなります。今回はSimulatedのチェックを外しておきます。

スクリプトの変更
箱の生成と箱の落下を分けるため、GameManagerスクリプトを下記に変更します。
using UnityEngine; using UnityEngine.InputSystem; public class GameManager : MonoBehaviour { [SerializeField] private GameObject boxPrefab; [SerializeField] private Transform boxPosition; private Rigidbody2D currentBoxRB; private bool isBox = false; void Start() { SpawnBox(); } public void DropBox(InputAction.CallbackContext context) { if (!isBox) return; if (context.started) { isBox = false; currentBoxRB.simulated = true; Invoke("SpawnBox", 1.0f); } } private void SpawnBox() { GameObject currentBox = Instantiate(boxPrefab, boxPosition.position, Quaternion.identity); currentBoxRB = currentBox.GetComponent<Rigidbody2D>(); isBox = true; } }
スクリプトの簡単な解説
- SpawnBoxで箱を生成、simulatedがoffなので落下はしないです。
- 左クリックでsimulatedをONにして箱を落下させます。
- Invokeで1秒後に箱を生成しています。
- isBoxは箱があるときにtrue、箱がない時はDropBoxの処理をしないように制御しています。
箱を左右に動かす
次に箱を生成した後に箱を左右に動かしていきます。新規スクリプトを追加して、名前をBoxにします。

Boxのプレハブにスクリプトを追加します。

箱をX位置が-2から2まで動くようにしていきます。

Boxスクリプトを下記に変更します。
using UnityEngine; public class Box : MonoBehaviour { private float xPos_max = 2.0f; private float xPos_min = -2.0f; private float MoveSpeed = 3.0f; private int direction = 1; private void FixedUpdate() { float posX = transform.position.x + MoveSpeed * Time.fixedDeltaTime * direction; transform.position = new Vector2(posX, transform.position.y); if (transform.position.x >= xPos_max) direction = -1; if (transform.position.x <= xPos_min) direction = 1; } }
指定した位置を往復移動するスクリプトです。下記記事で詳しく書いてます。
ゲーム開始で箱を生成し、横移動。左クリックで箱が落下します。

左クリックしたときに真下に落としたいので次回、修正していきます。