箱を積み上げるシンプルな落ち物ゲーム(StackBox)Part2.タッチで箱を落とす|Unityゲーム制作

箱を積み上げる簡単な落ち物ゲームを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;

    }
}

指定した位置を往復移動するスクリプトです。下記記事で詳しく書いてます。

ゲーム開始で箱を生成し、横移動。左クリックで箱が落下します。

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

タイトルとURLをコピーしました