Weitere ähnliche Inhalte
Ähnlich wie 【Unity道場スペシャル 2017沖縄】Unityで開発する上で 知っとくと便利な面白機能のアレコレ (7)
Mehr von Unity Technologies Japan K.K. (20)
Kürzlich hochgeladen (10)
【Unity道場スペシャル 2017沖縄】Unityで開発する上で 知っとくと便利な面白機能のアレコレ
- 20. Replace box with image
世界は意外とカオス
ゲームを作り始めて簡単なステージを作ると、大体が非常に規則的
に物を並べる事が多いです。
それはある意味で間違っていないかもしれませんが、余り自然では
ありません。実際、等間隔かつ大きさの等しいオブジェクトが並ぶ
光景は、あまり見られない物です(学校の机でさえ!)
そのため、リアルを出すにはある程度の「ゆらぎ」を考えて配置す
るのが良いです。まずは自宅周辺の再現とか良いかもしれません。
- 22. Replace box with image
思った所に配置したい
Sceneの構築は、ステージの構築でもある。
GameObjectを生成する際、思った所にオブジェクトが配置出来な
いケースが多々存在する。
思った位置にサクっと置けると、操作の上では非常に楽しくなる。
ここで紹介する幾つかのTipsを知らない場合、オブジェクトをセッ
トするのは非常に面倒くさいことになるかもしれない。
- 29. Replace box with image
ゲームをゲームらしく
するキモは
オブジェクト間の
やり取りにあり。
審判がルールを監視したり、勇者が敵を選択して攻撃したり、
ボールがゴールに突入したり、カードを出した事でゲームが進行し
たり、好き勝手動くのではなく「ゲーム」としての形を取る為には
、オブジェクト間のやり取りは必須となる。
- 33. Unityでよく見るアプローチ
var obj = Find(“オブジェクト名”);
var comp =obj.GetComponent<任意のコンポーネント>();
comp..何らかの処理();
Scene内の
GameObjectを探す
GameObjectが持つ
Componentにアクセスす
る
- 36. Replace box with image
EventSystem
Serialize可能なオブジェクト(PrefabやScriptableObject、Scene内
のオブジェクト等)に対して、メソッドを呼び出す処理をエディタ
ー側で定義する機能。
uGUI等で使用されており、ボタンを押した際の動作等は
EventSystemを使われる事がある。
- 39. Replace box with image
ScriptableObject
SceneもGameObjectもComponentも超越する事が可能な存在
意図的に制御しない限り、ゲーム内に一つである事を補償出来て、
誰も使わなくなったらひっそりと破棄される事も出来る。
同時にUnityのエディターからの編集にも対応しており、
任意のアセットに対しての参照も構築出来る。
- 48. Replace box with image
3Dにおける綺麗さ
3Dにおける「綺麗さ」は意見は色々あるが、
以下の項目が大半を占めるのではないかと個人的には考えている。
● テクスチャの綺麗さ
● モデルのクォリティ
● 味わい深いライティング
● 質感表現
● 綺麗な画面効果
- 53. Replace box with image
ライティング
光源に対して、光と影の表現を行う。
ただし動的に計算していては多くの電力と性能を浪費してしまうの
で、ある程度は事前に計算しておく手法。
光の陰影、間接光の表現、影野表現等々の処理を経て実際の絵が表
現される。
- 57. Replace box with image
画面効果
所謂Post Effectと呼ばれる手法。
Post Process Stack(アセット)を導入する事で、簡単に高度なエ
フェクトが実現出来る。
今まではUnityはImageEffectと呼んでいたが、最近はImageEffectだ
ったりPostEffectだったりpostFXだったり呼び方が安定しない。
描画が完了したゲーム画面に対して画像的にエフェクトを追加する
事で、画面を味わい深い内容にしてくれる。
特にbloom、Color Gradationはまず入れておきたい
Hinweis der Redaktion
- 今回は「Unityで開発する上で知っとくと便利なおもしろ機能の幾つかを紹介します」
- 今回話す内容はこんな感じです。
どれも直ちに必要ない要素ではあるかもしれませんが、覚えておくと面白いゲームを作る上で何かと役に立つ事があるので、是非思い出してもらえるとうれしいです。
早速話を進めていこうと思いますが、
- 今回は参加者の方にそれなりに「Unityは初めて」といった感じの方がいらっしゃるようなので、少し復習を。
- 題して、大雑把な流れ。
- 例えば、サッカーの世界を表現したいとします。
どんな世界か?
- これを言い直すと、世界、モノ、振る舞いの三つに分けられます。
サッカー場が世界、サッカーボールが物、サッカーボールには「跳ねる」振る舞いが設定されています。
- これはUnity用語で言い直すと、Scene、GameObject、Componentの3種類
- 構造的にはこんな感じ。
Sceneがあり、Scene場にGameObjectが存在し、GameObjectが複数の振る舞いを持つ
- つまり、こういうこと。
ちなみに
- Unityエディターの画面はこんな感じ。
この画面を使ってゲームを作っていく
- 画面の役割も、SceneやComponentを編集する事に集中しています。
- さて、ここからが本題です。
- まずはステージを配置するTips
- ステージを作るのは、慣れてないと非常に面倒くさい作業です。
- はじめてゲームを作る人は、Unityのステージにこんな感じのを作るんじゃないでしょうか。
- ただ実際の世界に目を当ててみると、コレほどまで規則正しく並んでいることは少ないです。
実際の世界に目を向けてみると、ある程度の法則性はあれど綺麗に並ぶことは殆どありません。実際の世界では、もっとカオスなのです。
- 例えば右のように少し物の配置をカオスにするだけで、それっぽさはグット良くなります。
この例は適当に作った物なので雑ですが、自宅の周辺などを模倣して配置してみると、どれほど世界が雑なのか確認出来ます。
- これを数値だけで配置するのは骨が折れるかもしれません。もっと思った所に配置したいのです。
- 問題になる事はこの3つです。
まずは解決方法を紹介します。
- DEMO
Put Stage
Colliderの上に乗るように配置する。
Layerでさわれないようにする
Inspectorのスライドと数式を試す
- 次のTipsは、オブジェクトのやり取りについてです。
- 先程話しましたが、Unityの世界はSceneとGameObject、そしてComponentによって成り立っています。
ただし、それだけでは公園にボールがあるだけ、物があるだけです。
- サッカーを思い出してみて下さい。
ゲームには実際に動くプレイヤーやボールの他に、進行を管理する審判が居ました。
審判はプレイヤー自身の場合もあります。
- Unityの考え方で言えば、審判という機能を持ったGameObjectが存在し、他のプレイヤーやオブジェクトを監視・ゲームの進行を管理します。
- 実際、ゲームをゲームらしくする為に必要なものは、他のオブジェクトを観測し監視しゲームの進行を管理するゲームマネージャーのような物の存在です。
他のプレイヤーはプレイヤー同士で相互作用する事もありますが(ステルスゲームの見えた・見えない、サバイバルゲームのHit宣言等)進行を管理するのは審判が必要です。
- 流石に最初から「審判」の機能を持ったコンポーネントは存在しませんが、自分で定義することが出来ます。
この場合、他のGameObjectから現状のステータスを持ったComponentを読取り、ゲームの状態を判断する形です。
- この動作を実現するには、一般的にはC#でコードを書く必要があります。
コードはオブジェクトを観測するだけでなく、何らかのアクションを行った時にオブジェクトにアクションを指示する際にも必要です。
まずは3つの一般的なやり方を軽く紹介します。
- 最も基本的なのは、観測先のオブジェクトをUnityエディターで設定できるようにしてセットする方法です。
観測先をエディター側でセット出来るので、コードを書く分量はかなり少ないです。また変更も楽ちんです。
- 量が増えてきたり、観測対象が動的に増減する場合には、スクリプトで検索するコードも含めてセットします。
- 観測対象が唯一無二の場合は、唯一無二のオブジェクトにする事で他のComponentからのアクセスを楽にする事も出来ます。
これは唯一無二のプレイヤーが存在する場合や、唯一無二の審判に自身で登録しに行く場合等が考えられます。
- さて、先程紹介した基本的な方法では動的に増減する場合や、処理の呼び出しは殆どコードを記述する必要があります。
ただ、実際大規模な所は兎も角、もっと簡単な部分でも一々コードを書くのは正直面倒です。
折角の機会ですので、少しおもしろい使い方を紹介します。内容は少し上級者向けですので、忘れてもらっても問題ありません。
- Unityのイベントシステムは、エディター側で呼び出す処理を決める事ができるシステムです。
- 最初からSceneに配置している物から、最初からSceneに配置している物に対しての指示を、殆どコードを書かずに変更・実現出来ます。
- Demo
簡単な例を見せましょう。
これで音が出ます。
- もう一つが、最近注目されているScriptableObjectという機能です。
ScriptableObjectはScene・GameObject・Componentの枠から外れる「アセット(ファイル)」として存在する事のできるオブジェクトです。
- このためSceneに含まれるGameObjectと異なり、Prefab(動的にGameObjectをシーンに追加される際によく使われる、セットアップ済GameObjectを配置する手法)や他のSceneのGameObjectからでも参照・情報を共有する事ができます。
実際のデモ
- ここで面白いのが、インスタンスとして存在するためUnityEventと連携出来る点です。
UnityEventはMethodを呼べるので、SOのメソッドを呼べます。例えば自身のインスタンスを登録する等の処理を行います。
- 後は他のオブジェクトがScriptableObjectに対してメソッドの呼び出しを行う際、SOから他のオブジェクトに対して仲介を行えば
- C2はC1の存在を知らなくともメソッドを呼び出すことが出来ます。
これはC2が動的に作成された場合でも有効な事を意味し、動的にC1が作られても問題ない事も意味します。
Moveデモ
- この使い方は少し特殊であり、一応全てScriptで運用管理する場合には冗長です。ただ、オブジェクトの接続先が増減したりする条件で簡単なイベントを呼び出したいといった場合では、このアプローチは割と良い感じに動くかなと。
- ちなみに逆に、Scriptで全部制御したい…Componentとか殆ど使わない…みたいな事をしたい人もよく居ますが
これは良くあることです。
- 実際問題、例えばボードゲーム等「ゲームマスターが駒の動きまで制御する」といったケースは多々存在します。
これは向いてる・向いてない…というより使い方次第な部分ではあります。
- さて、最後の項目…画面を綺麗にするアプローチについてです。
- 実際「きれいな画面」はどのように実現されているのか…といった話ですが、
- まぁ「テクスチャの綺麗さ」「モデルの品質」「味わい深いライティング」「画面にマッチした質感表現」「画面効果」とか、そういった感じでしょう。
- この「きれいなモデル」や「テクスチャ」の表現に関しては、Unityでは機能を提供していないので専用のDCC(Digital Content Creation)ツールを使うのが良いです。
- 残りの「ライティング」「画面効果」「質感表現」はリアルタイムに動作する項目ですので、Unity側である程度コントロールする事が期待されています。
- ちなみに、ライティングはどちらかと言えば空間を演出する物、質感は物質を演出する物で、画面効果は空間と物質を上手い感じに繋いでくれる事を期待されています。
- まずライティングから紹介します。
- 実際どの程度ライティングが効果的かと言うと、左がライティングを向こうにしたもの、右がライティングを有効にしたものです。
どちらが好きかは人次第な所はありますが、かなり違って見えます。
- ライティングを有効にする操作は、GameObjectの描画設定を管理してるMeshRendererにあるLightmap Staticにチェックを入れ、ライトをベイクするだけです。
ベイクの操作を行うと
- 左から
材質の色抽出、
反射光・間接光の計算
影の計算…を経て
実際のライティング済画面を作ってくれます。
- もう一つの画面を綺麗にするポイントは、画面効果です。
ゲーム画面の絵を元に、画面にエフェクトを追加します。
例えばカメラの模倣。遠距離や近距離はボケて丁度いい物だけを細かく出してくれる。
例えば光のにじみ。「光っているオブジェクト」を明確に表現してくれます。
例えば色の調整。何となく退屈な絵から、メリハリのある絵にしてくれます。映画のようなメリハリのある絵が使われる場面では、必ず使われています。
- これは凄い難しい機能で、多くの数学的・3D的な知識が必要ですが、
Post Processing Stackを使うと割とサクっとそれなりにものが作れます。
逆に言うと、コレが無いと残念な絵しか作れません。
Demo
実際にやってみます。(PostEffectシーン)
- とりあえず最低でもBloomとカラーグラデーションは欲しい所です。
- ゲームの見た目も盛ったら変わる!!!!ヤバい!!ポストプロセス!!入門!!!!!!!!!
というビックリ過多な動画があるので、それを見て欲しい。
- 最後に質感の話をしますが、その前にコレを見て下さい。
ロボです。
- 同じモデルのロボです。
- この違いは何処から来るのでしょうか。
- この2つの違いはShaderから来ています。Shaderは光の陰影を表現する為の物で、考え方としては3Dオブジェクトを塗る際のタッチを決める項目です。
- Shaderと、Shaderが使うテクスチャをセットにたものをMaterialと呼んでいます。
このMaterial(材質)により、どのようにモデルが塗られるのかを決めることが出来ます。
なお、以前は塗り方はプログラマの裁量で決められており、塗り方を統一するのは難しかったのですが、
- 昨今ではPBR(物理的な絵を目標とした塗り方)が一般化しており、DCCツールで生成したデータを使用すれば、DCCツールと同じような塗り方が実現できています。
- 逆に日本では、リアリスティックではない「アニメ調」的な塗り方の絵の方がウケが良いのは面白い特徴です。
- これで自分の話は終わりですが、最後におさらいです。
- 今回話した内容は3つ。
ステージ配置のTips、オブジェクト間のやりとり、そしてライティングです。
どれも直ちに必要ない要素ではあるかもしれませんが、覚えておくと面白いゲームを作る上で何かと役に立つ事があるので、是非思い出してもらえるとうれしいです。