モハーの断崖 -アイルランド-
みなさんこんにちは🌚
早くゲームを作り始めたいのに他のサイトで情報を仕入れようとするたびに新しいワードや概念が出てきて自分の知識の無さにやきもきしながらも焦燥に駆られているブルーノです。さあ早く今回の分を勉強していきましょう!!
今回からはレンダリングについてです。レンダリングとは、ゲームの無機質なデータにあらゆる手法で彩りを持たせることを言います。今回やるのは主に照明やカメラワークについてです。
カメラ
カメラはUnityに最初に触れた時からずっと使い続けているコンポーネントですね。プロジェクトを新規に立ち上げた際にデフォルトで用意されているMain Cameraはいわゆるカメラコンポーネントを持ったゲームオブジェクトです。グランツーリスモなど視点が急に切り替わったりするゲームにみられるように、複数配置することができます。
コンポーネントからカメラをコントロールする場合はUnityEngine.Cameraクラスによって表されます。
UnityEngine.Cameraクラス
public sealed class Camera : Behaviour
ゲーム空間でのオブジェクト同士の当たり判定はそれぞれ3次元座標内で交差しているかどうかで判断できますが、我々が覗いているゲーム画面は2次元です。クリックやタッチがオブジェクトに触れているかどうかを判定するにはスクリーン上の座標から光線を取得するScreenPointRay()メソッドを使用します。
ScreenPointRay()メソッド
public Ray ScreenPointToRay(Vector3 position);
positionパラメータにスクリーン上の座標を指定することでそこから画面奥方向へ向かう光線を取得できるので、PhysicsクラスのRaycast()メソッドでそれが何かと衝突しているかを取得できます。ちなみにScreenPointToRay()メソッドの引数はVector3型ですが奥行きのz座標は使われません。
Raycast()メソッド
public static bool Raycast(Ray ray, out RaycastHit hitinfo);
rayパラメータには先ほどのような光線の情報を入れ、hitinfoパラメータには光線に衝突したオブジェクトの情報を格納するRaycastHit構造体を指定します。引数の変数を変更するためref, outキーワードを使っています。構造体にいちいち値を代入しておかなくてもいいようにoutキーワードの方を使っていますね。
RaycastHit構造体
public static RaycastHit
RaycastHit構造体には衝突したゲームオブジェクトの情報が入っています。
では例を書いてみます。
マウスがおかれている座標から光線を飛ばし(14行目)、それが衝突したオブジェクトの情報をhit構造体に格納し座標を加工して返す(17, 18行目)というものですね。短い中に色々工程が詰め込まれている。。。
マウスがcubeに乗っている間だけ回転する!
照明
照明はゲームにおいてもドラマや映画などにおいても非常に重要ですよね。雰囲気から心情や状況の描写まで照明によってその印象は全く違うものになってきます。
UnityのLightコンポーネントには4種類の照明が用意されており、Typeの欄からその種類を変更できます。
Spot :文字通り一箇所を円錐状に照らします。スポットライトですね
Directional :イメージとしては太陽の光のように、光源の座標に関係なくある角度から全てのオブジェクトを照らします。
Point :ある一点から周り全方位を照らします。蛍みたいです。
Area(baked Only) :四角形の範囲で照らす光ですが、演算処理の負荷が大きいらしく、リアルタイムでの描写はできないようになっています。そのため、ベイクしてもう周囲のオブジェクトへ反映のさせ方を決めておく必要があります。しかし柔らかくリアリティのある光が演出できるそうです。
スクリプトからLightコンポーネントのこれらの種類を変更するにはLightTypeプロパティから取得もしくは変更します。
LightTypeプロパティ
public LightType type { get; set; }
このtypeはエディター上で設定する時と同じ名前で大丈夫です。
ではプログラムを作成していきます
Start()メソッド内で光を写す床と光源を持ったオブジェクトを用意し、位置を整えます。
そしてUpdate()メソッドでは時間に応じて光がDirectionalとSpotを交互に変えるようになっています。16, 27, 30行目でライトを変更するLighttypeプロパティが使われています。
2秒ごとにスポットライトとディレクショナルライトが切り替わるようになりました。
このようにスクリプトからもエディター上でできる全ての変更を行うことができるんですね。今回はここまでにしておきます。
久々の更新です😇今も色々準備やら何やらで忙しいんですがこうして合間を縫って勉強しています。このGWも予定がいっぱいっぱい...Unite Tokyoもいくしお金がかつかつだな笑