前回までで、とりあえずゲームとして公開するための体裁は整った。今回は、優先度・中の内容を実装して、ゲームとしての完成度を高めて行きたいと思う。2日目の日記で、優先度・中としてあげた項目は以下の通り。前回の日記同様、参考にさせて頂いたページと、実装のポイントだけ簡単に解説したいと思う。
・タイトル画面をつくる。BGMも鳴らす。
・ゲームを開始すると、BGMが鳴る。
・食べ物と接触すると、効果音が鳴る。
・敵ドラゴンを攻撃して、妨害できる。
・スコアがオンラインランキングに登録できる。
・敵ドラゴンが食べ物に向かって歩いたり、走ったりする。
・リトライができる。
敵ドラゴンへの攻撃と、敵ドラゴンが食べ物に向かって動く処理は少し手間がかかりそうなので、いったん置いておくことにした。最後に時間があれば実装したい。
完成度を高めるにあたり、効果音やBGM、画像等を使うことが多くなると思うその際は、利用規約をしっかり確認して、自分のゲームで使用できるかどうかの確認が必須となるので注意。
タイトル画面をつくる
タイトルは、前回作ったゲームからまるまる流用して、Spriteだけ張り替える。Spriteは、ゲーム画面のスクリーンショットをとってPaintに張り付けて保存するという原始的(?)な方法で作成した。pngやjpegをspriteに張り付ける方法は、こちらのサイトが詳しい。出来上がりは以下のような感じになった。
無音では寂しいので、BGMをつけることにする。ゲームのタイトルにちなんで、ベートーヴェンの「テンペスト」をタイトルのBGMに据えてみた。曲自体の著作権が切れているが、もちろん演奏された音楽には著作権があるので、著作権フリーのものを探す。見つけたのがクラシック名曲サウンドライブラリー様のサイト。700曲以上の曲がフリーで提供されており、素晴らしいの一言に尽きる。
BGMを流す方法は簡単で、適当なObject(EventSystemなど)にAudio SourceのComponentを付加して、Importした音源をドラッグ&ドロップするだけ。
ゲームを開始すると、BGMが鳴る
タイトルと同じでもいいんだけど、ちょっとクラシック音楽だとしんみりしすぎな気がしたので、アップテンポな曲に切り替えてみる。2回前のUnity 1週間ゲームジャム:お題「ぎりぎり」で曲を使わせて頂いたまんぼう二等兵様の「ロベリア」という曲を使わせて頂いた。この方の曲は本当に完成度が高く、聞くだけでテンションが上がってくる。
BGMの付加方法は、さきほどのタイトルのBGMと同じなので割愛する。
食べ物と接触すると、効果音が鳴る
今回も毎度おなじみ、効果音ラボ様の素材を使わせて頂いた。こちらの素材は、本当に種類が豊富でクオリティが高く、インディーズゲームづくりに役立つものばかりなので、とてもありがたい。Audioの再生は以下のScriptをプレイヤーのObjectに付加して実現する。
以下のScriptでは、foodのtagが付いたオブジェクトに接触した時だけ、効果音を鳴らす。オブジェクトに付加したら、Inspectorの「SeClip」に音源をドラッグ&ドロップする。また、Scriptを付加したオブジェクトに、Audio Sourceのコンポーネントも付加しないと、以下のようなエラーが出るので注意。
MissingComponentException: There is no ‘AudioSource’ attached to the “***” game object, but a script is trying to access it. You probably need to add a AudioSource to the game object “***”. Or your script needs to check if the component is attached before using it.
using UnityEngine; using System.Collections; public class SoundPlay : MonoBehaviour { private AudioSource audioSource; public AudioClip seClip; // Use this for initialization void Start () { audioSource = gameObject.GetComponent(); } // Update is called once per frame void Update () { } void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "beef") { audioSource.PlayOneShot(seClip); } else if (collision.gameObject.tag == "chiken") { audioSource.PlayOneShot(seClip); } else if (collision.gameObject.tag == "pineapple") { audioSource.PlayOneShot(seClip); } else if (collision.gameObject.tag == "drink") { audioSource.PlayOneShot(seClip); } else if (collision.gameObject.tag == "tomato") { audioSource.PlayOneShot(seClip); } } }
スコアがランキングに登録できる
これに関しては、naichiさんが提供されている方法で実装を行った。こちらのページの方法に従えば、簡単にランキング機能を実装することができる。私の場合は、ゲーム終了時にButtonを表示させ、それを押すことでランキングを呼び出す仕様にしている。ゲーム終了時の画面は以下のような感じ。
リトライができる
上の画像にあるように、ランキングのボタンと一緒に、リトライのボタンも表示させている。リトライをクリックすると、シーンを再読み込みする、以下のScriptが実行される。OnClickでgameというシーンを再読み込みさせることでリトライを実行する。シーンの再読み込みすると同時に、refObjで得点の変数にアクセスして、得点をリセットしている。
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class RestartGame : MonoBehaviour { GameObject refObj; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } public void OnClick() { refObj = GameObject.Find( "EvnetSystem" ); ManageParameters.score = 0; Application.LoadLevel("game"); } }
ゲームとしての完成度はかなり高まってきた。あともう少し頑張って内容を詰めて行きたい。
Unity1週間ゲームジャム関連記事まとめ
以下のページで、Unity1週間ゲームジャム関連の記事をまとめています。振り返りからゲーム開発プロセス、短期間でゲームを開発する方法(我流)など色々と書いているので、ぜひどうぞ。