HACKライフハックTRENDトレンドITエンジニアの求人・転職に+AgentGeekroidトップスキルゼロからのUnity(6)ゲームに基本的なルールを加えてみようskillゼロからのUnity(6)ゲームに基本的なルールを加えてみよう2015.11.19Unityスキル賀好昭仁Tweet最近はアプリやゲームなど、色々と無料のものが増えてきました。開発者の善意による無償提供だったり、広告収入で頑張っていたりと理由は様々ですが、無料で使えるmBaaSまで登場し、ネットワーク対応のゲームもコストをかけずに開発出来るようになりました。service、アプリやゲームなどでよく使う機能をまとめて提供するサービス。ユーザ管理やリモートPUSHなど、様々な機能を提供している)筆者も最近無料のmBaaSを利用する機会があり、あまりの便利さに「これホントに無料でいいの?あとで請求来たりしないの??」と不信感さえ覚えてしまいました。よし、今回はmBaaSについて学びましょう!ぜひそうしましょう!!・・・すみません、テンションが上がり過ぎました。ゲーム作りの基礎を学んでいる真っ最中でしたね。何をするにも、まずは基本が大切。ここはグッと堪えて、引き続きゲームの基礎作りを進めていきましょう!(mBaaSは本当に便利ですので、いずれご説明の機会を設けられればと思います。)さて、前回はキャラクターを操作出来るところまで進めましたね。今回はゲームのルールを作っていきましょう。野球やサッカーなどの勝ち負けがあるスポーツには、必ずルールがあります。ルールでは、チームの人数、どうやったら得点になるか、試合中にやってはいけないことなど、様々なことが決められています。基本的に得点が高いほうが勝ちとなりますので、「ルールに沿って相手より多く得点を得る」ことが最終目的となります。同じように、ゲームもルールに沿って目的を達成することでゲームが進行していきます。(余談)目的の無いゲーム最近人気のMinecraftなど、明確な目的が無いゲームも存在します。いったゲームは全く目的が無いわけではなく、ユーザに遊び場を提供することで、ユーザ自身が「よし、次はこれをやろう!」という目的を作って遊んでいます。ゲーム開発に慣れてきたら、ゲームの自由度を高めてユーザ自身に遊び方を探してもらうのも面白いかもしれません。このゲームはどんなルールにしましょう?ダメージを受けずにボスを倒したらクリア、制限時間内に特定のアイテムを取得したらクリアなど、様々なパターンが考えられます。今回は練習ということで、シンプルに・足場から落ちてはいけない。・ゴールにたどり着くことが目的。たどり着いたらステージクリアというルールにしてみましょう。■ユーザにメッセージを伝えようゲームオーバーやステージクリアしたときには、その情報をユーザに伝える必要があります。そのためには、何らかの演出を準備する必要が出てきます。演出には視覚エフェクト・画像・音声など、様々な形があります。OVER」のメッセージを表示することにします。■メッセージってどう表示するの?前回までに画像を配置する方法は学びましたが、文字の表示は今回が初めてでしたね。文字を画像にして配置する手もありますが、Unityにはテキストやボタンなどを簡単に配置できるUI作成機能が備わっていますので、今回はこれを使ってみましょう。OnGUI()メソッドを使うUnityにはフレーム毎に呼ばれるOnGUI()というUI描画用メソッドがあり、この中にUI描画用のコードを書きます。Unityに古くから備わっている機能ですが、現在はもっと簡単な実装方法があるため、利用する機会は少ないでしょう。(公式でも推奨はされていません)コードのみで完結するため、デバッグ出力には向いているかもしれません。実装方法を詳しく知りたい場合は、下記の公式ドキュメントに詳しく記載されています。UI開発用Assetを使うNGUIという非常に有名なAssetがあり、昨今のUI開発ツールの定番となっています。UIパーツをグラフィカルに配置出来るため、前述のOnGUI()と比べて使い勝手は格段に良く、メンテナンスもしっかりされています。Storeからダウンロード可能で、執筆時点ではバージョン2.7は無料(Unity無料版と同じく、前年度の予算または売上が10万ドル以下であれば使用可)となっていて、それ以降のバージョンは有料です。UnityのUIシステム(uGUI)を使うUnity4.6から、Unityに新しいUI作成機能が実装されました。(別名「uGUI」とも呼ばれています)これは前述のOnGUI()に代わる機能となり、NGUIと同じようにUIパーツをグラフィカルに配置することができます。NGUIに比べると歴史は浅いですが、必要な機能はひと通り揃っている印象です。オフィシャルの機能のため今後にも期待できそうです。こちらはぜひ公式ドキュメントに目を通しておきましょう。http://docs.unity3d.com/ja/current/Manual/UISystem.html今回は、UnityのUIシステム(uGUI)を使って開発を進めていきます。■メッセージ表示を実装するでは、実装に取り掛かりましょう。前回までに作成したGameSceneを開きましょう。すると、Canvasというオブジェクトが自動生成され、その中にTextが配置されます。このCanvasは、その名の通りUIのキャンバスであり、描画領域です。ボタンやメニューなどのUIパーツは、Canvasの中に追加していく形になります。Canvasのコンポーネントでは画面サイズの設定も可能ですので、スマホ向けゲームを作る場合などにも便利です。http://docs.unity3d.com/ja/current/Manual/class-Canvas.htmlまた、Canvasの下にEventSystemというオブジェクトも生成されています。こちらを使うと、ユーザの入力をイベントとして受け取ったりすることができます。今回は特に使いませんので、そのままにしておきましょう。Textの名前を「MessageText」とし、キャンバスの中央に配置します。Transformコンポーネントから行えます。Yを0にすると、要素がキャンバスの中央に移動します。アンカー関連の設定など、Pos以外のプロパティも頻繁に使いますので、マニュアルに目を通しておきましょう。http://docs.unity3d.com/ja/current/Manual/UIBasicLayout.html文字の変更はTextコンポーネントから行うことが可能です。MESSAGE」、Colorを白にしてみましょう。ParagraphのAlignmentで文字の配置を設定できますので、中央寄せを選択しておきます。Sizeを「50」にしてみましょう。おや?文字が画面に表示されなくなりましたね。デフォルト状態ですと、枠からはみ出た文字は表示されなくなっています。Overflowを「Overflow」に変更することで文字がはみ出ていても表示させることができます。テキストの配置はこれでOKです。この状態だと常に画面中央にテキストが表示されますので、MessageTextのインスペクター左上にあるチェックボックスをOFFにしておきましょう。することでゲームオブジェクトが非アクティブとなり、画面に表示されなくなります。(余談)ゲームオブジェクトを非アクティブにする場合の注意点ゲームオブジェクトを非アクティブにすると、画面に表示されなくなるだけでなく、ゲームオブジェクトのライフサイクルにも影響を与えます。具体的にはStart()やUpdate()メソッドがコールされなくなります。GameObject.Find("オブジェクト名")で検索してもHITしなくなりますので注意しましょう。今回はテキストのみ配置しましたが、ボタンや画像なども同じように配置可能です。他にもスクロールビューやドロップダウンなど様々なUIパーツがありますので、色々試してみましょう。■ゴール地点を作ってみよう次はゴール地点を作ってみましょう。キャラクターがゴールしたかどうかの判定は意外とカンタンです。ゴール地点に当たり判定のあるオブジェクトを配置します。キャラクターがこのオブジェクトに衝突したらゴールと見なすようにすればOKです。Fly└Sprites└Backgroundにあるscene_01_midgroundをゲーム画面にドラッグ&ドロップし、名前をGoalとします。位置は右端のブロックの上にでもしてみましょうか。小さいのでScaleを1.5にします。2Dコンポーネントを付与します。TriggerプロパティをONにしておきましょう。することで、Colliderの衝突判定のみ行われるようになります。Scriptを新規作成します。このスクリプトにゴールの処理を書いてみましょう。Goalスクリプトを開き、下記のコードを記入します。メッセージを表示するmessageText.gameObject.SetActive(true);}}}GoalオブジェクトにGoalスクリプトをドラッグ&ドロップします。Textのプロパティが表示されているかと思います。(スクリプトにpublicのプロパティを追加すると、ここに表示されます。TextプロパティにMessageTextオブジェクトをドラッグ&ドロップしましょう。TextプロパティにMessageTextオブジェクトが紐付けられました。スクリプト内でmessageTextを操作すると、MessageTextオブジェクトに操作が加わることになります。紐付け手順を忘れると、実行時にエラーが発生しますので注意しましょう。CLEAR!!」の表示がされるようになりました。プロジェクトを実行してみましょう。)■ゲームオーバーを作るゴールが出来ましたので、次はゲームオーバーを作りましょう。ひよこちゃんが落ちてしまった時にゲームオーバーとなるので、ブロックの下の方に横長の衝突判定用オブジェクトを配置します。手順はゴールとほとんど同じです。2Dコンポーネントを紐付けます。TriggerのONも忘れずに。Xを「10」にしておきましょう。このオブジェクトを足場の少し下に配置しておきます。Assets/ScriptsにGameOverスクリプトを作成し、下記のコードを記入します。メッセージを表示するmessageText.gameObject.SetActive(true);}}Assets/ScriptsにGameOverスクリプトを作成し、下記のコードを記入します。GameOverスクリプトをGameOverオブジェクトのコンポーネントとして追加します。Goalの時と同じように、MessageTextプロパティのひも付けも行いましょう。OVERと表示されるようになりました。)■(おまけ)カメラにキャラクターを追従させるメインテーマからは外れますが、カメラが固定だとステージの配置も制限されてしまいます。カメラにひよこちゃんを追従させるには、どうすれば良いでしょうか。答えは超カンタンです。CameraをHiyokoにドラッグ&ドロップします。Cameraが入ります。この状態でゲームを実行してみてください。)カメラがキャラクターを追従するようになりましたね。親となるゲームオブジェクトが動くと、子のオブジェクトも一緒に動きます。ゲーム本編・UIどちらでも使えるテクニックですので、覚えておきましょう。■まとめ今回学んだUIの作成は、どんなゲームでも必ず使うことになるかと思います。習得しておきましょう。練習ですのでゲームのルールはシンプルなものにしましたが、本来は物凄く重要な部分です。構想の段階からしっかり考えておきましょう。ステージクリア・ゲームオーバーを実装したことで少しゲームっぽくなってきましたね。今の状態だとスタート地点からゴール地点まで進むだけとなっていて、あまり楽しくありません。次回は敵キャラクターやアイテムなどを作って、ゲームをにぎやかにしていきましょう。昭仁qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。7匹の先輩猫社員たちにイスを占領される。Corporation。