あたも技術ブログ

セットジャパンコーポレーションの社員が運営しています。

【超初心者向け】デザイナーがUnityさわってみた#6



こんにちは。遊園地のコーヒーカップに強い なのはです。

前回はプログラムを作ってボールを転がしてみました


atamo-dev.hatenablog.com

↑前回の記事はコチラ


atamo-dev.hatenablog.com

↑最初から見たい人はコチラ



今回もPCは Windows10でお送りしますー!


色々なゲームに「ゲームオーバー」ってありますよねー。

「うわぁあああ!!またセーブからやりなおしだよ!!」 っていうあの絶望です。

でもあれ、すごく大事なことなんですよ。


ゲームにおいてゲームオーバーはとても重要なルールです。

なぜなら場合によってゲームをやり直されなければ、ゲームを続けることが出来なくなるからです。

今でも稀にありますが、裏世界に行っちゃって出られない!とか。

脱出不可なバグ・解消不能な状態を解消してくれるのがゲームオーバーです。


前回のボール、ゲームスタートして落ちたら二度と戻ってきませんでしたよね。


ゲーム続行にはそのゲームオーバーが、戻ってやり直すことが必要なんです。

というわけで、今回はゲームをリセットをしてみようと思います。

簡単に言うと「最初からやり直す」ことです。


ちなみにですが。

今回もプログラムを書きますよ?といってもコピーペーストですが。

f:id:atamo_dev:20171030113605p:plain

前回のプログラムと比べると少し難しい内容です。

解説は記事の一番下をご覧くださいませー。

すごく短くまとめると「resetCubeにプレイヤー(ボール)が当たるとリセットされる」です。

小難しく余計なことを言うと「resetCubeにプレイヤー(ボール)が当たるとmainというシーンが読み込まれる」です。

resetCube?それ何?と思いましたよね。

あとで作るので待ってください。

先にプログラムを作っちゃいましょう。

前回の復習みたいなものですが、まずプログラムを書くファイルを作ります。

名前は「reset」と付けます。

f:id:atamo_dev:20171030113559p:plain

f:id:atamo_dev:20171030113550p:plain

ファイルが作れたら、ダブルクリックで開いてください。

プログラムを書くツールについては今回もMonoDevelopでお送りします。

コピー&ペーストをするのはこのプログラム。

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using System.Collections.Generic;

public class reset : MonoBehaviour {

    void Start () {
    }
        
    void Update () {
    }
        
    //衝突判定(当たった時に行う処理)
    void OnCollisionEnter(Collision collision) {
        //当たったオブジェクトのタグが「Player」だったら{}の内容が起こる
        if (collision.gameObject.tag == "Player") {
            //シーンを「main」に移す・変える
            SceneManager.LoadScene ("main");
        }
    }
}

最初から書かれているプログラムと間違い探しをしてコピー&ペーストしてくださいね。

もっとも、上から下まで全部やるなら間違い探しなんてしなくていいんですが。

Unity楽しいから勉強したい!っていう人は間違い探ししてください。


完成したらresetは後で使うので少し放置します。

他のものの準備も必要なんです、料理の寝かせるみたいなものじゃないですが。

resetCubeを作ります。

Hierarchyで右クリックして「3D Object→Cube」を選んでください。

f:id:atamo_dev:20171030113542p:plain

f:id:atamo_dev:20171030113536p:plain

f:id:atamo_dev:20171030113943p:plain

オブジェクト(ボールなどの物)を選択しながら作ってしまうと設定がおかしくなるので、何もないところをクリックしてから作成した方がいいです。

※直すのは簡単↓

直したいもの(今回ならさっき作ったCube)をクリックしてドラッグするだけ。

f:id:atamo_dev:20171030113937p:plain

f:id:atamo_dev:20171030113931p:plain

f:id:atamo_dev:20171030113923p:plain

名前がCubeになっていると思うので「resetCube」に変えましょう。

変えたいものを右クリックし「Rename」を選んで入力します。

f:id:atamo_dev:20171030113913p:plain

f:id:atamo_dev:20171030114101p:plain

f:id:atamo_dev:20171030114054p:plain

今更ですが……

Sphereなども変えてしまおうと思います。


あとで障害物などを作る際にデフォルト名だと分かりにくいです。

最初にやらなくてすみません。

f:id:atamo_dev:20171030143642p:plain

Sphere(ボール)=Ball

Cube(ステージ)=Stage

さっき作ったCube=resetCube

以下この名前で説明していきます。


ではresetCubeに戻りましょう。

名前をresetCubeにした理由としては「これに当たるとリセットされるから」です。

当たるとリセットされる?そんなことしたらゲームできないじゃん!と思いますよね。

出来ます。

奈落の底にセットし、ステージに戻れそうにない位置にresetCubeを置きます。

永遠と落ちる前にresetCubeに当たることで最初からやり直すように仕組む、といえばいいでしょうか。

穴に落っこちたおじさん主人公が陸に戻ってくる感じですね。


Y座標をStage(ステージ)より、うんと下げます。

InspectorのScaleのYの部分の数字をいっぱい下げると早いです。

f:id:atamo_dev:20171030114044p:plain

f:id:atamo_dev:20171030114038p:plain

次に、うんと大きくします。

f:id:atamo_dev:20171030114247p:plain

ボールがどこに落ちても大丈夫なように、めちゃくちゃ大きくします。

これでBall(ボール)は奈落まで落ちませんね。

でも、こんなに大きいとカメラに写ってしまうんじゃないかってことですよね。

ならば透明な四角にしましょう。

Inspectorの「Mesh Render」という項目のチェックを外すだけです。

f:id:atamo_dev:20171030114236p:plain

f:id:atamo_dev:20171030114230p:plain

透明だと当たらないんじゃない?と思いますよね。

resetCubeは透明だけど触れる存在なので大丈夫ですよ!


では、それを試すためにもプログラムを与えてみましょう。

前回同様、選んでドラッグするだけです。

HierarchyでresetCubeを選び、さっき作ったプログラムresetをInspectorにドラッグしてください。

f:id:atamo_dev:20171030114222p:plain

f:id:atamo_dev:20171030114213p:plain

f:id:atamo_dev:20171030114413p:plain

f:id:atamo_dev:20171030114402p:plain

では、スマホを傾けてボールを落としてみましょう。

ステージ落下後、透明な何かにキャッチされます。

何もないところで転がってます。

成功です。

……え?ステージに戻れない?

次の設定をしたらすぐに戻れるので安心してくださいね。


さっきプログラムを作る時に 「resetCubeにプレイヤー(ボール)が当たるとリセットされる」と言いましたよね。


今は「resetCubeにBallが当たっている」状態です。


プレイヤー(ボール)とした意味ですが。

プレイヤーという設定をされたボールということです。

学校の1組2組みたいな感じ。

ボールにプレイヤーという設定をしたらリセットに一歩近づきます。

ただし一歩です。

まだ足りないですね。

あのプログラムの最後にはこう書いてあります。


「(resetCubeにBallが当たったら)mainというシーンを読み込む」


シーン?main?何?となってますよね?

こちらも複雑に思えますが分かったら簡単です。

よくゲームで町出た時、場面が変わりますよね?

町を出たら高原や草原だったりしますよね。

あれがシーン、いわゆる場面です。

町というシーンから、高原や草原というシーンに変わっているわけです。

町を出るという条件でシーンが変わっているんです。

それを使います。

プレイヤー(ボール)がresetCubeに当たるという条件でmainにシーンに変わる。


それを作るためにまず「main」というシーンを作ります。

デフォルトで「1」というシーンがありますが、名前がダサいので却下します。

一番上のバーから「File→Save Scene as...」を選び、なんていう名前のシーンにするか聞かれるので「main」と付けてください。

※保存する場所は指定されるので変えないでください。

f:id:atamo_dev:20171030114352p:plain

f:id:atamo_dev:20171030114343p:plain

f:id:atamo_dev:20171030114337p:plain

シーン、mainが完成します。

f:id:atamo_dev:20171030114530p:plain

ちなみに今編集しているシーンが何かはここに書いてあります。

f:id:atamo_dev:20171030114517p:plain

あとはBall(ボール)にプレイヤーという設定を与えるだけです。

Ballを選択し、Inspectorを見ます。

相変わらず英語しかないですが。

上の方にTagというのがありますよね。

今は「Untagged(タグないよ)」と書いてあります。

これをPlayerに変えます。

Ball(ボール)を選択してInspectorのタグをPlayerに変えます。

f:id:atamo_dev:20171030114511p:plain

f:id:atamo_dev:20171030114504p:plain

f:id:atamo_dev:20171030114458p:plain

これで設定が出来ました!

今度こそ落下したらやり直せますよ!

長かった……。

お付き合いいただきありがとうございます。

これで出来た。

ゲームのベースが。

あとは面白みを増やすだけです。

いかに面白い玉転がしにするか……。


その前に。

シーンを読み込むと何だか暗くなるのを直す方法

今更過ぎますが。

保存の方法(シーン&プロジェクト)

を次回書いていこうと思います。

面白みを増す大改造はそのあとですね!



おまけ。

プログラムの解説です。

間違い探しをした人なら分かるかも知れませんが……。

「Void OnCollisionEnter(Collision collision){}」という塊が増えていましたよね。

前回に「void Update () {}」に書かれたことは繰り返し行われること「void Start () {}」に書かれたことは最初の一回しか行われないことと書きました。

「Void OnCollisionEnter(Collision collision){}」は訳すると「当たり判定を出す」です。 当たり判定を出すから{}の中に当たったら起こしたいことを書いてという感じです。

あと、上の方に一項目増えていましたよね? 「using UnityEngine.SceneManagement;」ですね。 これはシーンの機能を使う時には必要なおまじないの一種です。 シーンの機能を使わないならいりません。