箱を積み上げる簡単な落ち物ゲームを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;
}
}
指定した位置を往復移動するスクリプトです。下記記事で詳しく書いてます。
ゲーム開始で箱を生成し、横移動。左クリックで箱が落下します。

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

