ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

Unityスクリプト / レンダラー編

f:id:covory10101101276:20180505092234j:plain

クスコ - ペルー

 

みなさんこんにちは🌚

昨日はディズニーシーに急に思い立って友人と遊びに行ってきたブルーノです。もうファストパスも発券できなかったし乗れた大きなアトラクションはタワーオブテラーくらいだったけどめちゃくちゃ楽しかったです。エンターテイメントの代表的な一角としてゲーム作りの上でキャラクターやアトラクションなど参考にできそうです🤓

さて今回は、あらゆるゲーム画面上に描画されるオブジェクトを我々が視認するのに欠かせないメッシュやマテリアルといったレンダラーについてまとめていきます。

 

メッシュとレンダラー

CreatePrimitive()メソッド等で生成されるオブジェクトも含み、我々がゲームシーン上で目にするオブジェクトにはほとんどの場合Mesh FilterMesh Rendererコンポーネントがついています。この二つはどうやらどちらも欠かすことはできないようです。

f:id:covory10101101276:20180505102315p:plain

メッシュフィルターがその頂点(ポリゴン)情報をもち、メッシュレンダラーがそれを画面上に描写するコンポーネントのようです。そしてこのメッシュレンダラーにマテリアルの情報を送ることでそれを元にポリゴン情報に絵をつけていくといった流れでしょうか。

スクリプトからこのメッシュを追加したり編集するにはUnityEngine.MeshFilterクラスからアクセスします。

そしてメッシュはmeshプロパティで取得または追加できます

meshプロパティ

public Mesh mesh { get; set; }

そして追加したメッシュ情報を描画するためのレンダラーはUnityEngine.MeshRendererクラスを用います。

f:id:covory10101101276:20180507142507p:plain

以前学習した[SerializeField]とコルーチンの機能を使っていますね。外部からは勝手にアクセスされないようprivate修飾子を使いつつもインスペクター上からメッシュを設定できるようにし、コルーチンを使うことでUpdateメソッドを使わずに3秒おきにメッシュ変数m1とm2のメッシュ情報を交互にメッシュレンダラー変数mf1に代入しています。

f:id:covory10101101276:20180507142516p:plain

SerializeFieldによりprivateでもこの欄から設定できます。試しにCubeとCapsuleを入れてみました。

f:id:covory10101101276:20180507142525p:plain

交互にオブジェクトのシルエットが変わりますね。でもこの新たに生成したオブジェクトにはマテリアルの情報がないため色や質がわからず、とりあえずピンクっぽい色で表示されています。

 

マテリアル

 マテリアル(Material)はその名の通りその物質の情報です。ザラザラした感じやツルツルした光沢、色やくすみなどの情報を持っています。先ほど自前で用意したゲームオブジェクトには形の情報があるのにこのマテリアルの情報がなかったためにどこからみても全ての部分が同じピンク色という不気味な物質になってしまっていたんですね。

まあ今までにも何回かこのマテリアルを編集したことはありますがインスペクタービューではこんな形でしたね。

f:id:covory10101101276:20180508230032p:plain

メッシュレンダラーのマテリアルの欄から指定することで使用でき、デフォルトでは真っ白になっています。ではこれをスクリプトから使用・追加するにはどうするのでしょうか

マテリアル関係のオブジェクトはUnityEngine.Materialクラスに属します。

UnityEngine.Materialクラス

public class Material : Object

スクリプトからマテリアルを生成する際には元のマテリアルを複製して使用するか、シェーダーを使うという2パターンがあるそうです。シェーダーについてはまだよくわからないので別の機会に勉強します。MeshRendererオブジェクトからmaterial(s)プロパティにアクセスした場合にマテリアルが初期化されていない場合はデフォルトマテリアルが自動で実装されるそうです。ここから色や質感を指定できるので個人的にはこの機能はポイントだと思います。

色の変更はcolorプロパティから取得もしくは変更します。

colorプロパティ

public Color color { get; set; }

 しかし色だけでは全ての質感を表現するのは難しいです。確かに本物そっくりに陰影をつけたりして見分けがつかない絵などもありますが角度が変わればわかってしまいますね。そのためマテリアルには表面にテクスチャを一緒に貼り付けることが多いです。

MaterialクラスのmainTextureプロパティからテクスチャを設定できます。

mainTextureプロパティ

public Texture mainTexture { get; set; }

 実際に使ってみます

f:id:covory10101101276:20180508232648p:plain

先ほどと似たコードのようですね。空のゲームオブジェクトを作成し、3秒ごとにランダムな色を持たせます。

f:id:covory10101101276:20180508232655p:plain

スクリプトから形状を指定すると

f:id:covory10101101276:20180508232702p:plain

色が変わりましたね!

f:id:covory10101101276:20180508232706p:plain

Default-Materialが生成されているのも確認できます。

メッシュの頂点生成などもあるのですが、スクリプトでこれを制御するのはちょっとコアすぎるのでやめておきます笑

今回はここまでにしておきます。

 

ついに始まったUnite Tokyo 2018!!初日の基調講演から行っているのですがもう全てが最高ですね!!🤩専門的なことは難しいですが実践しながら見せてくれる講演もあって違いが視覚的にわかりやすいし、私でもわかるレベルに噛み砕いてくれる講演も多々あって本当に初心者から上級者まで楽しめるものだと思います!絶対に行く価値がありますよ!

明日最終日もいろんなこと聞いてみて回るかー🙃😙