Unityでコイン落としゲームを作ってみたら意外に簡単だった…。(手順も公開)
Unityエンジンを使って、今までいくつかミニゲームを作ってきましたが、定番とも言える「コイン落としゲーム」をまだ作っていなかったので挑戦してみました。
例のごとく、忘れないように手順をログ的に明記しておきます。
素材集めから!
まずは、ゲームで使う素材などをAsset Storeからゲットしていきます!
普通のコインはUnityのCylinderで代用していますが、スペシャルコインはこちらを使いました。
【Clock】
時計のアイテムが欲しかったので、こちらで…。
ちなみに、片側にしか時計面が無いので、今回は2枚貼りあわせて使ってます。
クリスマス近いし…、ということで色々アイテムをゲット!
舞台のテクスチャー関連です。
バックの背景用に、メインカメラにこのSkyboxを貼り付けました。
コインの音や、ミュージックなどなどは、こちらから!
これで、だいたいの素材はOKです。これだけ集めても「無料」というのは素晴らしいですね…。
筐体を作る!
早速、コイン落としの筐体を作ります。
と言っても、Cubeを組み合わせるだけですが…。
①Cubeを少し大きく引き伸ばして、ゲットしたテクスチャを貼り付けてます。
②無くても良いのですが、コインがここに落ちたらポイントになることを明確にするため…。
③プッシャーです。
前後に動く必要があるので、以前のようなアニメーション機能で作成しようと思ったのですが、そうするとコインが落ちた時に上手く緩衝してくれないので、スクリプトで動かすことに。
で、助けてもらった動画がこちら!
ちょうど、プッシャーを動かす部分をスクリプトでやってくれていたので、マルっと真似てます。
var offs = Vector3 ( 0, 0, Mathf.Sin ( Time.time ) );
rigidbody.MovePosition ( origin + offs );
}
プッシャーにはrigidbodyを付けて、MovePositionで動かしてます。
今回「Mathf.Sin」という方法がとても勉強になりました。ちょうどいい感じに、周期的な動きをしてくれるのでいろいろ使えそう。
あとは、落ちたコインのインスタンスを回収するゾーンを作ります。
①は、単純に落ちたオブジェクトを消すというだけです。
function OnTriggerEnter ( col : Collider ) {
GameObject.Destroy ( col.gameObject );
}
で、②に落ちたオブジェクトの種類に応じて、色々特典を付与する感じです。
とりあえず、オブジェクトそれぞれに「タグ」を付けて、判別できるようにしてます。
スクリプトも一緒に貼り付けます。
function OnTriggerEnter ( col : Collider ){
if ( !score.gameover ) {
if ( col.tag == "Coin") {
audio.PlayOneShot ( shot );
score.coin += 1;
}else if ( col.tag == "Gold") {
audio.PlayOneShot ( shot );
score.coin += 5;
}else if ( col.tag == "Clock") {
audio.PlayOneShot ( shot );
time.time += 10;
}else if ( col.tag == "star") {
audio.PlayOneShot ( shot );
score.coin += 30;
}else if ( col.tag == "present") {
audio.PlayOneShot ( shot );
score.coin += 100;
time.time += 30;
}
}
}
static変数の「score.coin」でコイン枚数を増やし、「time.time」で制限時間を増やしてます。(あと、コインが落ちた時のサウンドも同時に鳴らしてます)
あとから気付いたのですが、アイテム数がもう少し増えればSwitch分の方が良いかもね。
コインを落とす!
コインの落とし方ですが、色々考えたものの…、上空からランダムに落ちるようにしました。(一番、手っ取り早い…)
空のゲームオブジェクトを上空に用意して、そこからキーボードのスペースキーを押す度にコインがランダムな位置に落ちる…という感じ。
スクリプトは以下。(同じような構文が続くので途中まで…)
function Update () {
if ( !score.gameover ) {
if ( Input.GetKeyDown ( "space")) {
var r : int = Random.Range ( 0, 60 );
offs = Vector3 ( Random.Range ( -2, 3 ), 0, 0 );
if ( r <= 35 ) {
Instantiate ( bullet, transform.position + offs, transform.rotation );
audio.PlayOneShot ( drop );
score.coin -= 1;
}else if ( r <= 47 ) {
Instantiate ( bullet1, transform.position + offs, transform.rotation );
audio.PlayOneShot ( drop );
}else if ( r <= 50 ) {
Instantiate ( bullet2, transform.position + offs, transform.rotation );
audio.PlayOneShot ( drop );
}
↓以下続く…
X軸上に、Randomを使ってバラバラにコインを落とすようにしてます。
あとは、生成された乱数によって、何のオブジェクトを出現させるかを割り振ってるだけです…。
スコア関連の表示!
ゲーム画面の作成です。
GUITextを配置して、スコアと制限時間、インフォメーションを作成。
ちなみに、以前にご紹介した方法でサクッとフォントを変えてます。
あと、今回初めてGUITextureを使ってみました。
単純にPC上で作った画像を、簡単に貼り付けられるので便利です。(今回は、png形式の透過情報が入った画像を使ってます)
コインの初期配置!
これでだいたい完成なのですが、ゲームが始まって筐体上にまったくコインが無いと寂しいので、あらかじめコインを配置しておきます。
若干、コインを浮かせるように配置しているので、ゲームが始まると同時に「ドン!」とコインたちが一斉に筐体へ落ちる演出を作ってます。
完成!
これで、コイン落としゲームは完成です!
【ゲームはコチラから遊べます!(PC環境推奨)】
それにしても…、Unityを使うとこういう感じのゲームは、本当に簡単に出来てしまいますねぇ。
ありがたいです。(ちなみに、今回は製作時間5時間ほど…)
さて、次は何を作ろうか…。
コイン落としゲームの参考になった書籍