物質自体に色はない?

Unityのマテリアルチャートをみると、プラスチックなどの非金属の場合は、sRGBは、50-243の範囲で使うとあります。今まで0-255でやってきた値と異なります。そこで、色とは何かを調べてみたのですが、ccs-inc.co.jpの記事がとても分かりやすく、光源と物体と目の関係を説明してくれていました。イチゴを青色LEDで見ると、かなり黒くなっているのはとても新鮮な感覚で見ることができました。

また、UnityのマテリアルのAlbdoも、その色を反射する値と考えれば納得できそうです。

https://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialCharts.html

http://www.ccs-inc.co.jp/s2_ps/s1/s_04/column/light_color/vol11.html

http://www.ccs-inc.co.jp/s2_ps/s1/s_04/column/light_color/vol12.html

http://illustrator-ok.com/illustrator_koza/color/contents/color1.html

 

Unity5のライティング学習資料

Unity5では、PBS(Physical Based Shading,物理ベースシェーディング)や光を焼く(Bake)という仕組みがあり、単純に色はRGBで0-255で指定すればよいというものではありません。またマニュアルを読んで設定項目を読んでもいまいち知識がないため消化不良になってしまいます。

Unityのライティングの学習 Part1 を作成して、自分用の実験用プロジェクトが作成できたので、設定項目の意味が分からないながらもスライダーを調節して、[Build]を行って、影響をシーンビューで判断できるところまで来ました。またいろいろ試すことで、Unityエディター上でどこに項目があるかも分かってきました。

此処までで様々なライティングのキーワードが分かったので、Google検索でさらに情報を入手できるようになりました。公式でグラフィックスについていくつかセッションがあるので、確認してさらに知識を深めようと思います。

Unityとアセットツールで学ぶ「絵づくり」の基礎(ライト、シェーダー、イメージエフェクト)

http://japan.unity3d.com/unite/unite2016/schedule

上記URLに、PDF資料もあり、駆け足ですが多くの事が説明されています。私のような初心者ははっきり言ってわからないことだらけですが、コーネルボックスを作って実験していけば、また知識が付くと思うのでやってみます。

 

[Unite 2015 TOKYO]Unity 5グラフィックスガイド 実践編

110分という長い動画ですが、これを見ることで全体像が掴めそうです。私のようにUnityの入門書を買わずに行き当たりばったりで学習している人は一度見たほうが良いかもしれません。

その他、グラフィック関係の動画。

 

http://tongullman.blogspot.jp/2015/05/unity5.html

Unity 5 Lighting Cookbook

 

Unityのライティングの学習 Part3

Unityのライティングの学習 (Part1, Part2)で、GIを設定するための基礎知識を学び、また自分で試行錯誤するためのサンプルプロジェクトを作成しました。今回は、このサンプルプロジェクトに実際に各種設定を行い、GIを体験しましょう。

まずは、Part1で学んだ以下を再確認しましょう。

  • GIは、反射光を考慮します。
  • GIは、初期設定で有効です。
  • GIは、静的オブジェクトが対象なので、チェックが必須。
  • GIは、焼き作業が重いので、Resolutionパラメータを要調整。
  • Lithtオブジェクトは、とりあえずmixedに

手順としては、動かないプリミティブをすべて静的オブジェクトにします。次に、Resolutionパラメータを小さくしておきます。最後にLightをmixedにします。

1.プリミティブオブジェクトを静的オブジェクトにします。

プリミティブオブジェクトを選択して、右上の[Static]にチェックを入れるだけです。

 

001
複数選択して、Staticにチェックを入れている例

2. Resolutionパラメータを小さくします。

メニュー->Window->Lighting(下から6番目ぐらい)を選択して、Lightingタブを表示して、Precomputed Realtime GIとBaked GIのResolutionを0.5~1ぐらいにします。

002

初期設定では、[Auto]チェックボックスにチェックが入っているので、自動で焼き処理が開始されます。遅い場合は、[Auto]のチェックを外してキャンセルしてしまいましょう。そしてResolutionを調整し、[Build]するか、[Auto]のチェックを付けましょう。

003

 

3.LightのBakingをmixedにします。

2をやった時点ですでにGIはできています。そのためこのBaked GIにかかわるこの設定はどういう意味か私自身もう一度調べる必要があります。いずれにせよ、一度mixedにしてみましょう。ポイントライトとDirectional Lightの両方に以下設定をしました。

004

 

4.Lightingタブ

現在のLightingタブです。

006

結果

赤い箱に近い地面の色は赤くなって、青い箱の近くの地面の色は青くなっています。

005
GIができた!
007
立方体が微妙な色になっている。

ただ、解像度が低い設定影響か分かりませんが、立方体の黒い影が微妙な色合いでした。とはいえ、今後設定項目を調べていけばよい話なので今回はこれで良しとしましょう。

このプロジェクトの配布

Unity5.4

http://hajimete-program.com/games/SandboxLighting02.zip

まとめ

3回にわたりGI(Global Illumination、グローバル・イルミネーション)の基礎から実際に試行錯誤できるプロジェクトを作成しました。今後は、公式マニュアルとGoogle検索を活用して、設定項目の意味を調べていきましょう。

Unityのライティングの学習 Part2

今回は、GIを適用する前のポイントライトを1つ、キューブをいくつか並べた単純なプロジェクトを作成します。

401

FPSコントローラーでFPS視点で動かせるようにします。

プロジェクトの新規作成

001

スタンダード・アセットのCharactersをインポート

002

003

PlaneをScale(100,1,100)で作成。

004

FPSControllerがカメラを持つので、Main Cameraを無効化

005

Standard Assets/Characters/FirstPersonCharacter/Prefabs/FpsControllerをシーンにドロップ。適当に初期Y座標を設定。

_001

壁の作成

Create Emptyで、’Walls’を作って、その中に6面をCubeで作成します。隙間が空いていなければよいので大きさ、位置は適当でよいです。

007_top007_forward007_back  007_left 007_right007_bottom

プリミティブの作成

特に細かいルールはありません。

101 102 103 104 105 106 107

Materialを作成して割り当て

https://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialCharts.html

Unityは、物理ベースシェーディング(Physical Based Shading,PBS)です。物理ベースレンダリングと呼ぶ場合が多いようです。これは色を付けるときに、金属か非金属(布、プラスチックなど)を考慮します。

そのため、Materialは非金属の場合、sRGBの範囲は50-243です。0-255ではありません。金属の場合は、186-255になります。上記チャートのsRGB RANGEという部分に記述されています。

201

スフィアにSilverを割り当て、キューブにRed,Blue,Greenを割り当て、他はWhiteマテリアルを割り当てました。

Silverの作成方法

公式マニュアルのチャートにSILVERが用意されているので、Albedoスポイトでシルバーを指定しましょう。

203

202

Red,Green,Blue,Whiteは、Materialは非金属で、sRGBの範囲は50-243で作成します。Redの場合、RGBAは(243,50,50,255)になります。

204
非金属のsRGBの範囲は50-243

ポイントライトの作成と調整

301

またDirectional Lightの位置は以下にしました。この値に特に理由はありません。

302

最後にグループ化したWallsをY,Z軸を5にしました。これも特に理由はありません。

304

最終的にできたもの

401

 

このプロジェクトの配布

Unity5.4

http://hajimete-program.com/games/SandboxLighting01.zip

 

Unityのライティングの学習 Part1

初心者向けのUnity5のGI(Global Illumination,グローバル・イルミネーション)のチュートリアルです。GIは仕組みや用語が複雑なため、はじめて使ってみる場合には取っ掛かりが必要になります。そこでこのチュートリアルでは、細かい設定は後回しにして、まずはGIのサンプルプロジェクトを作るところからはじめます。

私は、UnityのGI(=Global Illumination、グローバル・イルミネーション)を調べ始めましたが、公式マニュアルだけを読んでいると、いろいろな知識が必要になり初心者には使えないと感じました。しかし、用語をメモ帳で整理しながら調べていくと、まずは動かせるプロジェクトを用意して、そこでパラメータを試行錯誤しながら、公式マニュアルで、パラメータの意味を調べていけば、学習できそうなことが分かってきました。

このチュートリアル(Part1)では、GIを動作させるための最低限の基礎知識を学んだ後に、実際に簡素なプロジェクトを作ります(Part2)。細かいパラメータはひとまず後回しにしています。

Part2で、実際に動かせるプロジェクトを用意します。サンプルプロジェクトを完成させることで、ただ公式マニュアルで設定項目の説明を読むだけから、設定項目を自分で試行錯誤できるようになります。こうなれば、実際のプロジェクトの動作から、視覚的に各種設定項目を理解しやすくなります。

このように、学習のきっかけさえ掴めば、初心者でもGIを学んでいけます。それではやっていきましょう。

GI(Global Illumination,グローバル・イルミネーション)とは

Unity5にはGI(Global Illumination,グローバル・イルミネーション)が使えます。GIは反射光の計算をします。以下、画像を見てください。1枚目がGIが動いていない画像で、2枚目がGIが有効になっている画像です。

001
Unity初期設定で、GIは動いていない
002
GIが有効

2つの画像は、中央の円柱の下にポイントライトが配置されています。上の画像の場合、赤い箱に当たり反射して地面に写った光は、赤い箱の影響を受けていないため、白い光のままです。下の画像の場合は、赤い箱に当たり反射して地面に写った光は、赤い箱の影響を受けて、ほのかに赤くなっています。

003
GIを有効にして、青箱の上でジャンプ

上記画像は、GIを有効にして、青箱の上でジャンプした時にキャプチャーした画像です。赤、青、緑の各箱に光が当たり、それが反射して地面に写った場合は、箱の影響を受けて、色が変化しています。GI(=Global Illumination、グローバル・イルミネーション)とは、この光が反射したときの色を考慮する仕組みです。

Part2で実際にこのプロジェクトを作成します。つまりPart2で、どのようにすればよいかという知識を学びます。ただ、GIはとても複雑なので、このPart1で「何が」に当たる知識を学びます。

初期設定でGIは有効化されています。

以下の画像を見てもらえばわかるように、Lightingタブ(メニュー->Window->Lighting)を開くと、いろいろなGIの項目があります。公式マニュアルに各項目の説明がありますが、初心者がこれを読みこなすのは困難なため、まずはとっかかりが必要と思われます。

005

Unityの初期状態では、上記のLightingタブのように、「Precomputed Realtime GI」「Baked GI」「General GI」のすべての項目にチェックが入っています。そして、「Auto」チェックボックスにチェックが入っているので、初期設定でGIは有効化されています。

TODO: Precomputed Realtime GI, Baked GIの違いを説明.

GIを使うには静的オブジェクトにする必要があります。

ただし、GIを使うには対象を静的オブジェクトにする必要がありますが、立方体などのプリミティブを配置しただけでは静的オブジェクトのマークがされません静的(=Static)にするのは簡単で、以下の画像のようにInspectorタブで、Staticにチェックを入れる必要があります。

006

 

GIは光を焼く(Bake)作業が必要

GIは、反射光を計算しなければなりません。これには膨大な計算が必要なためリアルタイムで計算するのではなく、あらかじめ計算しておいてその情報を実行中に参照することになります。

光を焼く(Bake)作業が必要ですが、Lightingタブで「Auto」チェックボックスにチェックが入っている場合は、オブジェクトを動かした後に自動で焼く作業が開始されます。チェックが入っていない場合は、自分で「Build」ボタンを押して光を焼く必要があります。

Bakeはとてつもなく重い!

007

Bake作業はとても重い作業です。初期設定だと30分で終わらないかもしれません。[Auto]にチェックが入っていると、オブジェクトをちょっと動かすごとにBakeが開始されて、計算が終わらないため、ライティングが変な状態のままになってしまう場合があり、開発中はとてもストレスがたまるようになります。

これを回避するには、Realtime Resolutionを0.5、Baked Resolutionを0.5ぐらいにすると、ライティングの精度はあまりよくありませんが、ひとまずいままで通りに開発できます。もっと下げてみたり、Precomputed Realtime GIまたはBaked GIを無効にしてみるのもよいかもしれません。

Lightオブジェクトはひとまずmixed

公式マニュアルには、LightのBakingの説明として以下の説明があります。

Directional Lightや自分で用意したポイントライトには、以下のようにBaking項目で、Realtime, Baked,Mixedのいづれかを指定できます。Lightingタブで、Baked GIにチェックを入れている場合、このLightオブジェクトを焼き作業の対象にするかしないかの設定のようです。ひとまずMixedにしておけば大丈夫そうです。

008

 

いままで学んだことのまとめ

  • GIは、反射光を考慮します。
  • GIは、初期設定で有効です。
  • GIは、静的オブジェクトが対象なので、チェックが必須。
  • GIは、焼き作業が重いので、Resolutionパラメータを要調整。
  • Lithtオブジェクトは、とりあえずmixedに

まとめ

細かい設定項目は、今後調べて身に着けるとして、ひとまず、自分でGIを試してみて、そこから知識を広げるための最低限の知識を学習しました。次回は簡単なプロジェクトを作成します。

 

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 (E16. weapon effects)をやってみました。

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

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

001

Unity5のGI(Global Illumination)を使ってみる

UnityのGIを使っている以下の記事が簡単に設定できそうなので試してみました。

地面を緑にして、GI(Global Illumination)の設定をしたら、反射した光で天井が若干緑になりました。GIはスタティックオブジェクトにしか適用できないため動的なオブジェクトにはLight Probeを使うそうです。

001

分からない事が多いですが、GIやIBLやLightProbeなどを駆使すれば、通常作ったゲームよりもより一段上の見た目にできそうです。ただゲーム開発中は、GIを設定すると計算する時間が長いので、最後のライティング調整でやったほうがよいと感じました。

 

分かりやすいチュートリアルを探していたら以下のサイトを見つけました。

http://sassybot.com/blog/lightmapping-in-unity-5/

 

参考資料

 

このプロジェクトの配布

http://hajimete-program.com/games/UnityLighting.zip

 

 

Unity5でブロック崩しの見た目をLighting(ライティング)で変更する

001

Unityで、ポイントライトとスポットライトの使い方がわかったので、ブロック崩しを壁で覆って、Skyboxやディレクショナルライトを削除してみました。入門で味気ないブロック崩しですが、様々な光源を使うことでかなり印象が変わってきます。昔アルカノイドというゲームがあったのですが、これはかなりゲーム性があるので、弾を打てるようにしたり、自分を大きくしたり、BGM、SE、パーティクル、など演出を加えてみたいです。

このプロジェクトの配布

すでに何回もブロック崩しは作ったので、ゲーム部分はちゃんと作ってないです。

http://hajimete-program.com/games/BreakoutGame02.zip

 

Unity5で、ブルームの説明をしているチュートリアル

先日「Unity5.3でネオンのように発光させる(ブルームBloom)方法」を書きましたが、Unity5で、ブルームの説明をしているチュートリアルを見つけました。若干古いので、昨日の記事とUIが違うようですが参考になります。

SpeedTutorさんのサムネイルをみると、Unity5の細かいチュートリアルをいくつもリリースしているようなのでこれらもいろいろ参考になると思われます。