【初心者Unity】ライトの種類
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ライトの種類
今回はUnityのライトコンポーネントで使用できるライトのタイプについて紹介します。
※ 使用しているUnityのバージョンは2019.4.19です。
ライトの種類について
シーンに配置できるライトのタイプはLightコンポーネントにて設定します。
タイプは全部で4種類(Directional、Spot、Point、Area)あり、それぞれ使いどころが異なります。
Directional Light
Directional Light は最も使用頻度の高いライトです。3Dモードで作成したプロジェクトでは予めシーンに配置されています。
特徴は太陽光をイメージするとわかりやすいと思います。はるか遠くに光源があるイメージで、下図のようにシーン全体をまんべんなく同じ強さで照らします。
また他のライトと異なる点として、Directional Lightはシーン内の位置(TransformのPosition)の影響を受けません。
上図をシーンビューで見てみるとDirectional Lightが棒人間のかなり近くに配置されていますが、光が強く当たるなどはせず、仮に遠くに離したとしても光の当たり方に違いはありません。
一方で角度(TransformのRotation)の影響は受けます。
Directional Lightのアイコンから出ている線は、光の方向を表しています。
例えば下図のように横向き(Rotationのxを0ぐらい)にすると、太陽が地平線付近にある(明け方や夕方の)様なライティングとなります。
夕焼け(ちなみに向きを逆さまにするとほぼ真っ暗になります)
プロパティについて
Lightコンポーネントは下図のプロパティを持ちます。
※ SpotライトはRangeとSpot Angle、PointライトはRangeが追加されますが、他は共通です。
比較的使用頻度の高い設定として、影の有無や形状を扱う「Shadow Type」が挙げられます。
No Shadow(影なし)→ Hard Shadow(くっきり影)→ Soft Shadow(ぼんやり影)の順に描画の負荷は高くなります。
Spot Light
Spot Light(スポットライト)の特徴は、懐中電灯や車のヘッドライドをイメージするとわかりやすいでしょう。
ライトの位置から指定した方向を照らすことができます。
照明領域はローカルZ軸方向を正面とした円すい形となり、光源に近いほど明るくなります。
Directional Lightが持つプロパティに加え、範囲(Range)と角度(Spot Angle)のプロパティを持ちます。
Point Light
Point Light(ポイントライト)の特徴は、電球やロウソク、街灯などをイメージすると良いでしょう。
光源を中心とする球体状の照明領域をもち、中心に近いほど明るくなります。
照明範囲は球体状となるため、Directional Lightがもつプロパティに加え、範囲(Range)のプロパティを持ちます。
Area Light
Area Light(エリアライト)は指定した長方形の片面を光源とし、全方向に向かって照射します。
拡散する光の表現などをかなりきれいに描画できるのですが、使用するためにはいくつか条件があります。
棒人間にはエリアライトが当たっていません(後述)
同シーンビュー(頭上のCubeは解説のために設置)
エリアライトはライティングの計算にかなりの負荷がかかるため、ライトマップにベイク(焼き込み)する形でのみ使用できます。
ライトマップとは、ゲームオブジェクトをどのようにライティングするか予め計算したデータです。
ライトマップの計算はStaticオブジェクトのみが対象となります。
Staticオブジェクトとは「動かないオブジェクト」のことです。
インスペクターの右上のStaticにチェックを入れることで、Unityに「このオブジェクトは動きませんよ!」と宣言したことになります。
Unity内部の処理としては、事前に動かないオブジェクトと教えてもらうことで様々な演算の対象外にできるため、適切に使用することでゲームの負荷軽減にもつながります。
サンプル画像の棒人間は、Staticオブジェクトに設定していないためエリアライトの照射対象外となっています。
(ちなみに今回使用した棒人間のアセットは、Mesh Rendererコンポーネントを持たないので、仮にStaticにしたとしてもエリアライトは当たりません)
それではエリアライトの対象となっている棒人間の頭の上のCubeを見てみましょう。
Staticオブジェクトなので、Mesh RendererコンポーネントのLightmappingのプロパティにマッピング情報が焼き込まれています。(ベイクされた状態)
ベイクされた状態のゲームオブジェクトは光源がなくても、光が当たっているという体で自ら発光します。エリアライトを削除しても発光します。
このようにエリアライトには様々な制限がありますが、要するにエリアライトは負荷が高いので動かないオブジェクトにしか使えない!
ということです。
あくまでもシーン内で重要な部分の動かないオブジェクトをきれいに表現するためのライトです。