Unity Create a Game Series (E25. Finishing up)をやってみました。

とても長いチュートリアルで途中苦しかったですが無事にチュートリアルを完了できました。23回目、24回目でAudioの設定、25回でメニュー作成、26回でスコア、ヘルスメーター、最後にImageEffectsを追加してこのゲームを動かすことができました。

全体の感想

Sebastian LagueさんのProcedual cave generation tutorialは、Unity公式チュートリアルに載っていてYoutubeでいくつか動画チュートリアルを配信してくれています。

このチュートリアルは、トップダウン・シューティングゲームを作るために最もお勧めできるチュートリアルでした。ただしある程度プログラミングが分かっている必要がありました。実際に、再生数が回を重ねるごとにユーザーが減っているのを見ると、動かなかったときに自分でgithubのプロジェクトと比較したり、プログラミングのエラーを自分でつぶす能力がないと、フィードバックはあまり期待できないので先に進めない状態になっているようでした。

また、ウェーブ生成や各種アニメーションは、コルーチンやUnityの機能を使わず、プログラミングで各種アニメーションの基礎を実現しました。例えば銃のリコイルやリロードのアニメーションなどです。実装してみればそこまで難しいことではないので経験になり、Unityのアニメーション方法と、基本的なイージングやアニメーションをプログラミングで実装する方法の2つの選択肢を手に入れられました。しかし、これは初心者向けのチュートリアルと思っていたので、ちょっとこれは難しすぎるのではとも感じました。

レベルの自動生成は、何も知らないと実装に苦労するところなので、チュートリアルの中でかなりの時間を割いて説明してくれたのが大変良かったです。またこの部分の動画とソースコードが独立して切り出せるので、他のプロジェクトにすぐ適用できそうです。

クラス構成について

最初にクラスの全体像などが分からないため、こうしたほうがいいのでは?と途中に何度も思いながら実装しました。ただゲームの複雑な仕組みを学習していくうちに、Unityでは、C#スクリプトはオブジェクトの振る舞いを制御するための部品の1つなので、デザインパターンや高度なC#の使い方(Linqなど)や、立派なクラスデザインより、とりあえず動かせるスクリプトを作って誰でも読めるものを用意すればよいかなと考えるようになりました。手軽に読めて、ゲームが面白ければそれでよいかなと。。。

チュートリアルと公式のソースコード

https://github.com/SebLague/Create-a-Game-Source

Unity5の3Dサウンドについて

このゲームでは、ゲーム中はプレイヤーに、音が出る部分(リスナー)が付いているので、そこから音が出て3Dサウンドになります。3Dサウンドは単純に音声再生時に、座標を指定するとそこから音が出るようになります。

uGUIのDynamicな値とStaticな値

Unityでメニュー画面を作るときにボタンやスライダーなどを使いますが、スライダーなどは、入力された値をプログラムに渡すことができます。このとき、ユーザーがUIのスライダーを変更したDynamicな値を渡す方法と、どんな時も固定値を渡す方法(Static Parameters)の2種類が選択できます。

以下の画像のように、上部にDynamicなメソッドが表示され、下部にStaticなメソッドが表示されます。よくあるミスで、Dynamicな値を渡したいのに、Staticなメソッドをイベントハンドラーとして設定してしまう場合があります。注意しましょう。

スライダーのメニューの上部がDynamicな値
スライダーのメニューの上部がDynamicな値

最後の回でヘルスメーター作成

下の赤線がヘルスメーター
下の赤線がヘルスメーター

最後の回で、ヘルスメーターを作成しました。今後メーターを作るときに別途サンプルを探す必要がなくなってよかったです。

スコアを見やすくするアウトライン(Outline)

Unityには、テキスト表示の他にOutlineコンポーネントがあります。これにより輪郭エフェクトをつけることができます。ほかにもShadowがあります。Unityで初めてゲームを作る場合、Outlineを使わずデフォルトフォントのため何かパッとしないゲームになってしまいます。ちょっとした装飾をすると印象が変わるので、お手軽ですしおすすめです。

005
Outlineなし
006
Outlineあり

007

Unity5の強力なImageEffects

このプロジェクトの最後の数分でImageEffectsを適用しましたが効果が絶大でした。Unity5であれば、Standard Assetsをプロジェクトにインポートすればすぐに使えます。

008
ImageEffectsなしの状態
009
Vignette and Chromatic Aberrationのみ適用。角にいくほどボケて黒くなる。
010
Screen Space Ambient Occlusion(SSAO)のみ適用。キューブの上と右に影が表示
011
Color Correction Curvesのみ適用。色補正
012
上記3つのImageEffectsをすべて適用

UnityはImageEffects(≒ポストエフェクト)を設定するだけで、劇的な変化があるため今後ゲーム制作で積極的に使っていきたいです。公式マニュアルはちょっと重たいですが、気が向いたときに、ImageEffectsの一覧を見てみるとよいです。

http://docs.unity3d.com/ja/current/Manual/comp-ImageEffects.html

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E25. Finishing up).zip

Assets/Scenes/Menu.unityをUnity5.3で開けばタイトル画面(メニュー画面)が表示されます。

まとめ

インベントリー管理は別途学習する必要がありますが、玉転がしでアイテム取得は行ったので、それを応用して簡易的なインベントリー管理を作成すれば、このゲームに組み込めそうです。

このチュートリアルで、ガンシューティングの実装方法と動作するプログラムは入手できたので、次回からは、MagicaBoxelで作ったキャラクターのガンシューティングを作っていきたいです。

 

Unity Create a Game Series (E21. Guns and UI)をやってみました。

Unity Create a Game Series (E21. Guns and UI)で、複数の銃を切り替えられるようにしました。またステージ開始時にウェーブと敵の数を表示するUIを追加しました。

ステージ開始時のUIを作成し、複数の銃を用意してステージ毎に切り替えるようにしました。一般的なゲームの場合、ステージで装備が切り替わるのではなく、アイテム管理があって、そこでプレイヤーが装備を切り替えられます。今回はステージの切り替えのタイミングで、銃を強制的に変えましたが、以下のようにすれば簡単にアイテム管理に切り替えられそうです。

  • 敵を倒したとき一定の確率で、アイテムを落とす。
  • 取ると、インベントリー(単純な配列)に格納。
  • インベントリーを表示。
  • 1,2,3キーで切り替えられる。

A01

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E21. Guns and UI).zip

まとめ

あと4回分Youtube動画が残っていますが、これらはオーディオ追加、メニュー作成、最後の細かい修正などになるため、おそらく難しいことはないと思われます。オーディオ追加などは気楽にやりたいです。

Unity Create a Game Series (E19. crosshairs)をやってみました。

E17. weapon variationでは、単発、バースト、オートマティックで弾を打てるように修正し、E18. wave difficultyでは、敵ウェーブごとに敵の強さなどを調整できるようにしました。そしてE19.crosshairsでは、照準を作成しました。

002
ウェーブ毎に敵の攻撃力や速度を調整できるようにした

照準の表示の仕方

照準を実装する方法は、すこし特徴的で、照準オブジェクトのレイヤーをUIにしました。またメインカメラはUIレイヤーを映さないにして、UIレイヤーのみを映すカメラ(Crossharis camera)を別途用意しました。これで、Crossharis cameraの深度(Depth)を上げることで、必ず標準が手前に表示されるようにしました。シンプルな2Dゲームの場合、ゲームオブジェクト自体のz軸を変更して手前に表示するか奥に表示するかなを調整したりしますが、カメラでどのレイヤーを映すかを設定できるのは、大きなゲームフレームワークでないと使わない機能なので、新鮮で勉強になりました。

003
crosshairs(照準)はUIレイヤー
004
マスキングでUIレイヤーのみ対象にしたカメラ

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E18. wave difficulty).zip

Unity Create a Game Series (E16. weapon effects)をやってみました。

今回は、弾を発射した際に、薬莢(やっきょう)を飛ぶようにして、また銃口が光る(マズルフラッシュ)ようにしました。プログラミングや作業は簡単ですが細かい作業なので、どこに何かあるかを繰り返し作業をして覚える必要があります。

また小さなパフォーマンスチューニングですが、薬きょうは、フロアと障害物以外には衝突しないようにしました。

001

Unity Create a Game Series (E14. game over)をやってみました。

Unity Create a Game Series (E14. game over)をやってみました。

今回はゲームオーバー画面をuGUIで作成し、”Play again”ボタンで、シーンをリロードする仕組みを作りました。これは今までミニゲームを作ったりした際に経験していたので簡単でした。

ゲームオーバーシーンを表示
ゲームオーバーシーンを表示

この回で、基本的なゲームの仕組みは揃いました。これから先の目次を見ると、それぞれの機能を磨き上げる工程になるので、おそらくそこまで難しいものではないと思われるので頑張って進んでいきます。

  • パーティクル追加
  • 敵ウェーブの修正
  • リコイル・リロード
  • 武器の追加
  • UI改良、
  • オーディオ追加
  • メニュー

あとは、ライフバー、アイテム、インベントリーあたりを学べばさらに良くなりそうです。

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E14. game over).zip

 

 

Unity Create a Game Series (E12. finishing the map generator)をやってみました。

引き続き、「Unity Create a Game Series」をやりマップの自動生成の作業が完了し、第7回までに作ったトップダウンシューティングゲームに組み込みました。

マップ自動生成をゲームに組み込んだところ
マップ自動生成をゲームに組み込んだところ

今回の第12回は、障害物に高低差を付け、グラデーションを付けれるようにしました。高低差はScaleで変更できるのが容易に想像できますが、Materialをプログラムから操作するのは少ないので、このチュートリアルで扱えてよかったです。また、今回は、Game.unityシーンに、MapGeneratorのオブジェクトをコピーペーストしてゲームに反映させました。MapGenerator.unityはシーンとして独立して保存しているのでいろいろ修正が可能です。

002
Unityエディターで、各マップを設定できるようにしている

MapGeneratorスクリプトには、Mapクラスを作り、その配列をUnityエディターから操作できるようにしたので、ちょっとしたマップの修正を検証するのが簡単になりました。

マップ自動生成の基礎プログラミングを手に入れた

様々なパラメータを修正できる
様々なパラメータを修正できる

今回まで一番の収穫は、プロシージャル・ジェネレーションの基礎を学習できたことです。ローグライク系ゲームのように、フロアを自動生成するような仕組みに作り替えたりはまだできませんが、それをするためのメッシュ生成や配列操作などは学べました。

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E12. finishing the map generator).zip

Unity Create a Game Series (E11. map navigation)をやってみました。

Unityのナビゲーション・探索システムでは、フィールドにBake(焼く)ことで、NavMeshAgentがそのフィールドを移動でき、NavMeshObstacle(障害物)を用意することで、その領域を移動できなくします。

ナビゲーションの設定は1つ1つのタイルに対して行うのではなく、1つ大きな100×100などのQuadを用意して、そこにBakeします。ちょうど以下のような感じです。NavMeshObstacleコンポーネントが付加されているオブジェクト移動できなくなるため、灰色になり、移動できるところは水色になります。

002
フィールドの外側に最大マップ領域を作ってNavMeshAgentが移動できるようにする

このままでもよいですが、今回は最大領域から落ちたりしないように、四方をマスキングしました。

003
NavMeshObstacleでマスキングして、移動できないようにする

まとめ

マップを自動生成して、NavMeshAgentが移動できるようになったのであとは細かい修正を残すだけとなりました。

Unity Create a Game Series (E10. map connectivity)をやってみました。

Sebastian LagueさんのUnity5チュートリアル「Create a Game (Unity 5)」の
Unity Create a Game Series (E10. map connectivity)をやってみました。

このチュートリアルは、第8回になる「E08. tile map」からは今までのプロジェクトと独立していて、第8回からでもチュートリアルとして始められるようになっています。主なテーマは、マップ生成です。

Unityエディターで様々なマップを自動生成
Unityエディターで様々なマップを自動生成

E08,E09,E10と作業して、上記のような自動生成ができるようになりました。マップ生成は複雑に感じますが、実際にはライフゲーム、倉庫番、テトリスのような二次元配列を使い、隣接するXY要素の衝突判定やフラグ判定を行うときと基本的な仕組みは同じでした。またマップの場合は、道が途切れ内容にする方法が必要ですが、これは、アルゴリズムとして確立していてFlood Fillアルゴリズムを使いました。と言ってもやっているとは簡単で、中心をまず調べ、その隣接する障害物じゃないものを調べ続けるという事再帰的に繰り返していくだけです。

マップが二次元配列になっているので、以下が成り立ちます。

マップ全体の要素数 – 壁の数 = 通れるタイルの数

実際の例に置き換えると、以下のようになります。

10×10のマップ(100要素) – 10個の障害物 = 90個の通れるタイル

よって、Flood Fillアルゴリズムで、通れる道を調べたときに、90個に達しなければどこかの道が壁でおおわれていることになります。この仕組みを、壁を作るときに応用し、壁を作ってみて、その時点で、Flood Fillで道を調べふさがってしまったら、壁をいったん取り消すということを、壁の最大個数にするまで繰り返しマップを作ります。

 

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E10. map connectivity).zip

まとめ

マップ自動生成の基本部分はできたので、あとはUnityのNavigation対応と、壁などの装飾を残すだけです。1回の動画時間は20分以内ですが、一時停止し細かいロジックを理解するとなると1時間を超える作業になるので、思っている以上に時間がかかり大変です。

Unity Create a Game Series (E06. enemy attacks)をやってみました。

 

Unity Create a Game Series

Sebastian LagueさんはUnity公式のチュートリアルページで、洞窟のプロシージャル・ジェネレーションのチュートリアルを書いた人です。Unity Create a Game Seriesはトップダウン式のガンシューティングゲームで、以下を網羅したチュートリアルです。

  • キャタクターや敵のウェーブ作成
  • 銃のリロード、将来、銃の切り替えに考慮した実装
  • マップ・ジェネレーション
  • 敵の追尾
  • メニューなどのGUI作成
  • ゲームオーバーシーン
  • パーティクル

アイテム取得やインベントリーなどはありませんが、別途して組み合わせることでゲームに面白さを追加できそうです。また基本的なマップ・ジェネレーションもあるので、ローグライクやハックアンドスラッシュ系のゲームのように、短い時間で無限に遊んでもらえるゲームを作れそうです。

E05までは、コード量は多めですがスムーズに進みましたが、E06は、敵の体当たりする位置の調整算出する方法が数学的で難しかったです。書いて動いてはいますが、一度別途プロジェクトを用意して、ベクトル計算部分を再学習しなければならないと感じました。