FunnyGeek

Home > This page

Unityというゲームエディタで3Dブロック崩しを作った

ゴール設定

どうやらスマホやパソコンのゲームアプリを作るには「Unity」というエディタを使うらしいので、どんなツールなのか知りたいので簡単なゲームを作ってみる。まずはチュートリアルの通りに、たこ焼きをマウスカーソルでクリックするプチゲーム。なるほど、こんなに簡単に2Dゲームが作れることは分かった。

Unity and VisualStudioCode

事前準備

3Dゲームを作るには3つのツールを使いこなさないとダメらしい。それぞれインストールする。

  1. Unity ゲームを作るエディタ
  2. Blender 3Dオブジェクトを作るエディア
  3. スクリプトを書くVisual Studio Code

練習1.まずはキャラクタを作る

Blenderという3Dオブジェクトを作る。何年か前のWindowsで3Dを描くアプリを2~3万円で購入した時代と違い、今は無料でダウンロードして使えるのだ。ゲームアプリを販売したらその数%を支払うビジネスモデルとの事(個人用や練習なら無料)。練習なので「球体」を6個くっつけて雪だるまを作る。球体なので簡単なのだが、Belenderの操作が直観的では無くて、ショートカットを駆使して操作しなければならず覚えるのが大変。何とか顔の画像を貼り付けて、FunnySnowmanっぽくなった。骨みたいなオブジェクトもあり、走るアニメなんかも作ることができた。

Unity and VisualStudioCode

練習2.ゲームエディタを使う

ゲームの土台になる「Scene」を作って、ピンボールの枠を四角オブジェクトで組み立てる。崩されるブロックオブジェクトを作って配置してみた。せっかくなので3D雪だるまも置いてみた。ボールを跳ね返す棒(バー)っていうのかな、長方形のバーを配置して、長方形オブジェクトがキーボードの[←][→]キーで左右に動くようにVC#のスクリプトを書く。

Unity

練習3.プログラムを書く

長方形オブジェクト(バー)が左右に動くVC#のスクリプトがこれ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using TMPro; // Rich Text
using UnityEngine.SceneManagement; // for Restart

public class Controller : MonoBehaviour
{
    public float fltAccel;
    public GameObject Ball;
    [SerializeField] public TextMeshProUGUI txtRestQty = null;
    [SerializeField] public TextMeshProUGUI txtStartAndFinish = null;
    [SerializeField] public TextMeshProUGUI txtBallQty = null;
    private Rigidbody rb;
    private float diff;
    private bool keep = false;
    private int intBall = 0;

    // 初期設定
    void Start() 
    {
        rb = GetComponent();
        intBall = 10;
        txtStartAndFinish.text = "Start, press [z]";
    }

    // メインループ。この関数を繰り返す。
    void Update()
    {
        rb.AddForce( transform.right * Input.GetAxisRaw("Horizontal") * fltAccel * 2, ForceMode.Impulse );

        if ( Input.GetKeyDown(KeyCode.Space) )
        {
            if ( keep == false )
            {
                keep = true;
                rb.AddForce( transform.forward * 3 * fltAccel, ForceMode.Impulse  );
                StartCoroutine( DelayMethod(0.2f, () =>
                {
                    rb.AddForce( transform.forward * -3 * fltAccel, ForceMode.Impulse  );
                    keep = false;
                }));
            }
        }

        // バーがボールに当たったら反動で少し後ろに動き、その後、元のY座標に戻る。
        if ( rb.position.z < -14.0f)
        {
            diff = rb.position.z + 14.0f;
            rb.position = transform.position - new Vector3(0,0,diff);
        }

        if ( Input.GetKeyDown(KeyCode.E) )
        {
            Instantiate(Ball, rb.position, Quaternion.identity);
            txtStartAndFinish.text = "";
        }

        // [Z]キーが押されたら新しいボールを投入する。
        if ( Input.GetKeyDown(KeyCode.Z) )
        {
            if ( intBall > 0)
            {
                Instantiate(Ball, rb.position, Quaternion.identity);
                intBall--;
            }

            if ( Enemy.intCount <= 48 ) {
                txtStartAndFinish.text = "";
            }
        }

        // 再スタートは[S]キー。点数の初期化、ボールの数を初期化する。
        if ( Input.GetKeyDown(KeyCode.S) )
        {
            SceneManager.LoadScene (0);
            Enemy.intCount = 0;
        }

        txtRestQty.text = "Rest " + Enemy.intCount.ToString() + " pcs";
        txtBallQty.text = "Ball " + intBall.ToString() + " pcs";

        if ( Enemy.intCount <= 0 )
        {
            txtStartAndFinish.text = "You Win !!";
        }

    }

    private IEnumerator DelayMethod( float waitTime, Action action )
    {
        yield return new WaitForSeconds( waitTime );
        action();
    }


}
  

まとめ

オリジナルのプチゲームが完成した。重力が働き、重さを感じるピンボールになった。どうせならと[スペース]キーを押したら、バーを前に押し出してボールに勢いを付けて押し出すことができるようになったら面白いゲームになった。[Z]キーを押すと同時に何個もボールを投入できる。なかなか面白い。プログラムを読んだらバレちゃうんだけど[E]キーを押すと無限にボールを何個も投入できる。本来はデバッグ用なんだけど面白いから残しておいた。

Unity

さあ、完成したゲームをここのUnityハブで遊べるので試してみて欲しい。こんな素敵なゲームを1~2日で作れちゃうのだ。3Dブロック崩し

▲上に戻る