AssetBundle化したShaderが外れてしまう


あるシーンをアセットバンドル化した際に、そのシーンで使われているパーティクルが白くなってしまったので調べてみた。
調べてみるとアセットバンドル化した際に、uGUIなどのシェーダーが外れてしまうことがあるらしい。

参考)神様は有給消化中です。 | AssetBundle化したPrefabのシェーダー参照が壊れる現象

AssetBundleManagerのSimulate Modeだと再現できないけど、実際にAssetBundleを読み込んでみると再現できる。

上記のサイトを参考に、パーティクルのGameObjectに対して再度設定するコンポーネントを割り当てたら動いた。

using UnityEngine;
using System.Collections;

/// <summary>
/// アセットバンドル化したパーティクルなどのシェーダーが外れてしまうので
/// それを回避するためにAwakeにて当て込む。
/// </summary>
public class ParticleShaderReset : MonoBehaviour {
	/// <summary>
	/// シェーダー。
	/// </summary>
	[SerializeField]
	string shaderStr;

	/// <summary>
	/// Awake.
	/// </summary>
	void Awake() {
		ParticleSystem ps = this.GetComponent<ParticleSystem>();

		Shader s = Shader.Find(this.shaderStr);

		if (s != null)
			ps.GetComponent<Renderer>().sharedMaterial.shader = s;
		else
			Debug.LogWarning(this.shaderStr + " シェーダーが見つかりません。");
	}
}

コメントを残す