三連休だった
スパイダーマンになってNYの平和を守ったと思ったら、次は核戦争後の荒野を彷徨う事になってオンラインゲームなのに他のプレイヤーと滅多に出会わないという斬新な世界を旅する三連休を過ごしたのですが、あまりに休日ニートが過ぎたのか、車の定期点検にディーラに持ち込んだら担当者に「走行距離が全然伸びていないので、ほとんど新車同然ですね(ニヤニヤ)」みたいな感じで、褒められているんだか貶されているんだか分からない言葉を浴びたりしたので少しは外に出ようと誓った秋の夜。
一気に色が変わる
さて、製作中の「Dull Things No Life」ですが、ゲーム自体は典型的なエンドレスランゲームなので、迫ってくる障害物を右に左に上に下に避けて進んでいくだけ、という単純な内容となっています。
なので他の類似アプリと違いをだす為にアレコレと演出を考えているわけですが、最近思いついた演出が「周りの背景や障害物の色が一気に変わる」というやつ、シューティングゲームなどで偶に見かける演出です。
周りの背景の色を変える、とはスカイボックスやプレイヤー機を囲んでいる壁のMaterialをスクリプトで変えるだけなので特に問題ないのですが、悩んだのは「障害物の色を変える」こと。
つまり、大量に動いているオブジェクトの色を一気に変えないといけない
オブジェクトの色を変える
「Dull Things No Life」では障害物として動いているオブジェクトのMaterialは全て同じものを使用するように作っています。
これは性能対策としてBatch数を減らすためです。
ただ、Unityではオブジェクトに対して
GetComponent<Renderer>().material.color = 色;
を行うことでオブジェクトの色を変更する事が出来ますが、これを行うと内部処理でオブジェクト毎にMaterialが一つ追加されます。つまりBatch数が増えるという意味で、これでは性能対策をした意味がなくなります。
Materialのcolorを変更したいけどBatch数は増やしたくない。
そんなことで悩んでいたのですが、毎度お世話になっているテラシュールブログに解決方法が記載されていました。
SharedMaterialを使う
テラシュールブログによればRendererのsharedMaterialで共通Materialにアクセスすることができるようです。
つまり、同一Materialを参照しているオブジェクト全てに対して変更内容を適用できるということで、共通Materialを変更するので内部処理で新たにMaterialを追加することもありません。
使い方はmaterialと同じように
GetComponent<Renderer>().sharedMaterial.color = 色;
とするだけです。めっちゃ楽。
早速、取り込んでみたらこんな感じなりました。
(sharedMaterialの変更と同時に、スカイボックスと壁のMatrialを変更しています)
まぁ、ソコソコ面白い演出になっているのではないでしょうか。