Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity5】障害物をくぐり抜けろ!StartCoroutine, WaitForSeconds【フラッピーバード風3】

Unity5.0.0f4 Personal(2015年5月)

f:id:hiyotama:20150513125236p:plain

 

前回の続きです〜

 

今回は、定期的にひよこ前方に障害物を作る機能を作り、ぶつからないようにくぐり抜けるようにしましょう〜

 

【目標】前方に障害物を作成する!

 

【課題1】障害物のPrefabを作成する 

まずは障害物のPrefabを作成しましょう〜Prefabの作り方については下記エッセンスをご参照下さい〜

 

Prefabの元となる画像はこちらをお使い下さい〜

 

f:id:hiyotama:20150506124123p:plain

木です

 

こちらの画像をダウンロードし、ProjectビューへImportして下さい〜

 

f:id:hiyotama:20150506124412p:plain

ドラッグ&ドロップ!

 

 今回Sprite画像は分割しないで使ってもらって大丈夫です〜treeのSpriteオブジェクトを2つ作りましょう〜名前はtree1とtree2にします〜

 

f:id:hiyotama:20150506173507p:plain

ドラッグ&ドロップ!*2

 

そしたら空のGameObject(名前:tree)を作成し、その中にtree1とtree2を入れます〜

 

f:id:hiyotama:20150506175016p:plain

空オブジェクト作成

 

f:id:hiyotama:20150506174226p:plain

tree(空オブジェクト)の中にtree1、tree2を配置

 

次にtree1とtree2のSorting Layerの設定を行います〜背景よりは前面に出ていて、地面よりは後ろがいいので、BackGroundとGroundの間に、TreeというSorting Layerを作成しましょう〜

 

f:id:hiyotama:20150506180402p:plain

BackGroundとGroundの間

 

更にtree1、tree2にBoxCollider2Dを付け、Transform情報を修正しましょう〜下に各オブジェクトのInspector情報を載せておきます〜

 

f:id:hiyotama:20150506174831p:plain

treeのInspector

 

f:id:hiyotama:20150506180607p:plain

tree1のInspector

 

f:id:hiyotama:20150506180658p:plain

tree2のInspector

 

ゲーム画面を見てみましょう〜

 

f:id:hiyotama:20150506180722p:plain

木の間をひよこがくぐり抜けるイメージ

 

それでは今作成したtreeオブジェクトは一旦Prefab化しておきます〜

  

f:id:hiyotama:20150506181254p:plain

Prefab化したら元のオブジェクトはDelete

 

【課題2】障害物Prefabをスクリプトで生成する

さて、障害物のPrefab化まで終わりました〜

 

続いては障害物Prefabを生成し、障害物がひよこに自動的にせまってくる機能を実現する、MapScriptを作成します〜

 

自動的に迫ってくる処理を実現するために、movingObjという空オブジェクトをひとつ作成しましょう〜

 

f:id:hiyotama:20150506182240p:plain

空オブジェクト(movingObj)作成

 

それではこのmovingObjに、以下のソースを貼り付けましょう〜

 

 

treePrefabとmovingObjと、2つのpublic変数があるので指定しておきます〜

 

f:id:hiyotama:20150506183041p:plain

ドラッグ&ドロップ!

 

それではスクリプトの解説に入ります〜

 

まずはStartメソッド内でStartCoroutineというメソッドが実行され、更に別のメソッド(MoveMap、SetTree)を呼び出しております〜

StartCoroutineで呼び出されるメソッドの戻り値は、「IEnumerator」という型を使うルールになっております〜

普通にメソッドを呼び出すのではなくコルーチンという機能を使ってメソッドを呼び出す利点は、「◯秒経ってから実行」という処理を実装できる点です〜

 

さて、それではコルーチンが呼び出すメソッドのうち、まずはMoveMapメソッドを見ていきましょう〜

最初にwhile文を使っているので条件を満たすまで繰り返し処理を行いますが、条件部分が「true」となっているため、無限ループとなっております〜

中を見てみましょう〜最初にX軸が12(画面外)、Y軸が3~-1.5のランダムで位置情報を取得しております〜

次に、Instantiateメソッドにより、先ほどの位置情報にTreePrefabを作成しております〜

次に、作成されたTreePrefabは、movingObjを親オブジェクトに設定しております〜「transform.parent」で親オブジェクトを指定することができます〜

 

次が大事です!

「yield return new WaitForSeconds (1.5f)」と書かれていますが、yieldは中断を表します〜つまりこれは、1.5秒待ってから次の処理に移るという意味です〜

SetTreeメソッドは無限ループなので、1.5秒おきにY軸方向にランダムに、TreePrefabを作成しているということですね〜

yieldを使った記述は、コルーチンの中でしかできません!時間差処理を行いたい時はこのように実装すると覚えておくと、いいと思います〜

 

次にMoveMapメソッドについてです〜こちらも冒頭でwhile(true)と書かれているため、無限ループです〜

まず最初に、movingObjの位置情報を取得しています〜そして、movingObjのXの位置を、1秒かけて-4しております〜(Time.deltaTimeは1秒かけて〜という意味)

これはゲーム画面でいうと、1秒かけて右から左に4移動しているということです〜

つまり、movingObjを親オブジェクトとしているTreePrefabも一緒に、1秒かけて右から左に4移動するということです!

最後の「yield return 0」は、中断は無しということで、次のフレームからすぐに再開するという意味です!中断しなくても一応書いておかないといけないんです〜

 

それではゲームを動かしてみましょう!

 

f:id:hiyotama:20150506203625p:plain

ゲーム画面

 

迫り来る丸太の間を、ひよこがくぐり抜けています〜だいぶゲームらしくなってきました〜

 

今回はここまでです〜

ありがとうございました〜

 

【Unity開発5】下準備【フラッピーバード風:1】

【Unity開発5】プレイヤーピヨを動かしたい!【フラッピーバード風:2】

【Unity開発5】前方に障害物を作り、くぐり抜けたい!【フラッピーバード風3】

【Unity開発5】ゲームにスコア機能を付けたい!【フラッピーバード風4】

【Unity開発5】タイトルとゲームオーバーを作りたい!【フラッピーバード風5】