top of page
執筆者の写真BTA(Kelorin Jo)

昼と夜を切り替えるスクリプトを考える

更新日:2020年10月10日

カモメ町の動作確認でVRチャットにワールド作ってアップしてましたが、

昼と夜の2つのワールドをアップして動作確認、まで来て次は

一つのステージで昼夜賄えないか…となり、VRチャットでは苦労して作っても

トラストレベルの都合でプライベートでしか公開できないのがわかり、

じゃあUnityRoomに投稿しよう…となりましたが


いつも使ってたEnviroが使えない!!



2018.4でビルドしてたから2019ではどうだかわからないけど、

2018.4ではEnviroがまともに動かない、WebGLでビルドしてもレンダ失敗して使えない

(モバイル対応のLiteもあるけど、50ドル版に同梱されてるものと同じだよな…?)

のが判明して、代替案を模索してました。


※アセットがアップデートで使えなくなる事態に備えてキャッシュは定期的に複製して備えてたけど

それでもタイミングが悪いとバージョン違いで使い物にならなくなる運ゲー



天候系アセットも軒並み2019か2020に移行してしまってるだろうなあ…

簡易でいいからなんかないの 自作しかないのか


Unityで昼夜を切り替える表現をするには、これだけの処理が必要です


1.スカイボックスを切り替える

2.ライトを切り替える

3.窓やネオンのマテリアルのエミッションを切り替える

4.夜間オブジェクト(シャッターとか)の表示を切り替える

5.BGMを切り替える


フェード切り替えとか朝焼け夕焼け雨が降るとか贅沢言わなければ、すぐ出来んこともなかった


・スカイボックスを切り替える

参考記事

これみて作ったのが

ChangeSkybox.cs


シーン中の空オブジェクトにスクリプトをアタッチして、スカイボックスのマテリアルを複数登録して、

トリガーコライダーやボタンなどでイベントで呼び出して使うと、スカイボックスのマテリアルが切り替わります。



朝焼け夕焼けにフェードで切り替えはできません。

そもそもスカイボックスは横にしか回転しないので、太陽が登って沈んでという表現が無理

(スカイボックスでなく球…スカイドームだったら、ポリゴン球を回転させるのならあるいは)


・ライトを切り替える

・夜間オブジェクトの表示を切り替える

これは、切り替えるオブジェクトを一つの親オブジェクトにまとめといて、イベントでsetActiveを切り替えれば済むのでコードいらずですね。

えっライトがstaticでベイクしてたらどうするの?知らん


・BGMを切り替える

フェードしないでいいなら、オーディオソースをオンオフで切り替えれば為せるはず。



ここまでは簡単


マテリアルのエミッションを切り替える


このコードはじつは過去に作ってます。


standardシェーダーを使ってるマテリアルだったら_EmissionColorの色を変えるのですが

実行中はマテリアルはオブジェクトの数だけ複製されるので、まずシーン中のすべてのオブジェクトを調べて、使ってるマテリアルを検索して把握する必要があります。

複数あるオブジェクト中の複数あるマテリアル…「マテリアルリスト」の何番目にあるかをGetComponentで把握して、自作のリストに入れます。


さらに、マテリアルの中の1項目の色を書き換えるには、マテリアル単体をオブジェクトにダイレクトに書き換えることはできず、新たにマテリアルリストの変数を作ってその中でマテリアルを書き換えて、「オブジェクト名」.GetComponent<Renderer>().materials= でマテリアルリスト差し替える、という手間がいります…


根幹部分だけ抜粋すると、


for (int j = 0; j < AllTargetMSCObjects[i].TargetMSCObjectList.Count; j++)

{

AllTargetMSCObjects[i].TargetMSCMaterialList[j][AllTargetMSCObjects[i].TargetMSCMaterialNoList[j]].SetColor(TargetMaterialpreset[i].ChangeSetColorName, lcolor);

AllTargetMSCObjects[i].TargetMSCObjectList[j].GetComponent<Renderer>().materials= AllTargetMSCObjects[i].TargetMSCMaterialList[j];

}

…自作リストだらけで自分でも何書いてるのかわからない

とにかくうんざりする複雑さです。



ArrayArrayBuilderにこの複雑なことをするっとできるコードを同梱してるのですが、



有料販売してる内容をばらすのはまずいので、使いたかったら買ってね…といいつつ、詳しい使い方は今まで記載してなかったりします

使い方動画は作ったのに


モデルのアセットと違って、プログラムのアセットはリリースしたら不具合やUnityバージョンの互換性につねに悩まされて他のことができなくなる、と後で気づきまして。稚拙なコードだからまず互換性の影響はないだろうけど、作って即内容忘れてたから、不具合出たらもう直せない

だからむしろ売れるなとさえ考えてて、利用者が増えるような親切な使い方を解説できずにいたというヘタレで勝手な都合があります。

近いうち、BOOTHで「昼夜切り替えアセット」として無料配布しようと思います。



ともあれこの機能を実装したものがこちらです。

Kamome BeachResort showcase01

画面右上のボタンで切り替えできます。



追記:2019でビルドしたらと思ったけどそうなると今度は、URPとHDRPを使わないのかって話になり、使うアセットの動作確認がまた大変に。

少なくともマテリアル変更スクリプトはシェーダーが大幅にかわったので使えませんでした。

HDRPはエミッションの色だけでなく明るさの数値を変える仕様になり、スカイボックスはプロフィールを変えないといけなくなりました。

対応するのそう簡単じゃなさそうだから、配布はまた別の機会にします


閲覧数:2,372回0件のコメント

最新記事

すべて表示

Comments


bottom of page