Qiita初投稿。
マルチシーン運用時のSkyboxの動的設定
環境はUnity 2017.2.0f3。
RenderSettings.skyboxの設定先
skyboxの設定自体はRenderSettings
クラスにあるんで普通にsetすればいいだけ。
Unity - スクリプトリファレンス: RenderSettings
public void SetupSkybox(Material skybox) {
if (RenderSettings.skybox != skybox) {
RenderSettings.skybox = skybox;
}
}
ただこれ、マルチシーン運用しているときに非常に困りました。なんとシーンの指定がない。
これどこのシーンに設定されるのだろうかと思ったら、Activeなシーンのskyboxに設定されるんですね。強制的に。
つまりこれは「non activeなシーン(またはまだload中のシーン)のskyboxを編集してからactiveにしたい」ということが出来ない。
例えばシーンAを開いた状態でシーンBを動的にLoadScene(Additive)
したとき、シーンBのhierarchy上にあるobjectのStart()
でシーンBのskyboxを動的に設定ようとしても、まだシーンBはloadが完了しておらずactiveになっていないので、その時点でactiveなシーンAのskyboxに設定されてしまうという、非常に面倒くさいことが起きた。
解決策:遅延設定
つまるところ、シーンがActiveになったら設定するようにしておくしかないのかなと。
本当に? っていう感じ……。
private string TargetSceneName = "設定したいシーン名";
// activeになったときに呼ばれるコールバック
private void OnActivedSetupSkybox(
UnityEngine.SceneManagement.Scene prev,
UnityEngine.SceneManagement.Scene next) {
if (next.name == TargetSceneName) {
// 改めてskyboxを更新
SetupSkybox();
// コールバック登録を解除
UnityEngine.SceneManagement.SceneManager.activeSceneChanged -= OnActivedSetupSkybox;
}
}
// skyboxの設定処理
public void SetupSkybox(Material skybox) {
if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == TargetSceneName) {
// 所望のシーンがactiveだったら素直にskyboxを更新する
if (RenderSettings.skybox != skybox) {
RenderSettings.skybox = skybox;
}
}
else {
// 所望のシーンがactiveでなかったら、activeになったときに更新するように
// コールバックを登録しておく。
UnityEngine.SceneManagement.SceneManager.activeSceneChanged += OnActivedSetupSkybox;
}
}
なんでこれ標準でシーン指定できないんだろうなあ。
この事について軽く検索してみたところ、他に記事を見かけなかったということは、こういうマルチシーンでのskybox動的設定はあまり推奨されないということなんですかね……。