どうやらスマホやパソコンのゲームアプリを作るには「Unity」というエディタを使うらしいので、どんなツールなのか知りたいので簡単なゲームを作ってみる。まずはチュートリアルの通りに、たこ焼きをマウスカーソルでクリックするプチゲーム。なるほど、こんなに簡単に2Dゲームが作れることは分かった。
3Dゲームを作るには3つのツールを使いこなさないとダメらしい。それぞれインストールする。
Blenderという3Dオブジェクトを作る。何年か前のWindowsで3Dを描くアプリを2~3万円で購入した時代と違い、今は無料でダウンロードして使えるのだ。ゲームアプリを販売したらその数%を支払うビジネスモデルとの事(個人用や練習なら無料)。練習なので「球体」を6個くっつけて雪だるまを作る。球体なので簡単なのだが、Belenderの操作が直観的では無くて、ショートカットを駆使して操作しなければならず覚えるのが大変。何とか顔の画像を貼り付けて、FunnySnowmanっぽくなった。骨みたいなオブジェクトもあり、走るアニメなんかも作ることができた。
ゲームの土台になる「Scene」を作って、ピンボールの枠を四角オブジェクトで組み立てる。崩されるブロックオブジェクトを作って配置してみた。せっかくなので3D雪だるまも置いてみた。ボールを跳ね返す棒(バー)っていうのかな、長方形のバーを配置して、長方形オブジェクトがキーボードの[←][→]キーで左右に動くようにVC#のスクリプトを書く。
長方形オブジェクト(バー)が左右に動く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ハブで遊べるので試してみて欲しい。こんな素敵なゲームを1~2日で作れちゃうのだ。3Dブロック崩し