Unityで全てまたは一部のシェーダーを一括で違うものにするための関数
・指定したオブジェクトの子要素全てを一括で変換
・Gameobjectに複数のMeshが張ってある場合でも正常に動作します
/// <summary> /// targetGameObject以下の子オブジェクト群のシェーダーをShaderName_toに変更する。ShaderName_fromが指定されていない場合はすべてのShaderを変更 /// </summary> /// <param name="targetGameObject">対象GameObject。子要素も変更されます。</param> /// <param name="ShaderName_from">変更後のShader名</param> /// <param name="ShaderName_to">対象Shader名。未設定時は全てのShaderを変更</param> public static void changeShader(GameObject targetGameObject, string ShaderName_to, string ShaderName_from = "") { //List<GameObject> ret = new List<GameObject>(); foreach (Transform t in targetGameObject.GetComponentsInChildren<Transform>(true)) //include inactive gameobjects { if (t.GetComponent<Renderer>() != null) { var materials = t.GetComponent<Renderer>().materials; for (int i = 0; i< materials.Length; i++) { Material material = materials[i]; if (ShaderName_from == "") { material.shader = Shader.Find(ShaderName_to); } else { if (material.shader.name == ShaderName_from) { material.shader = Shader.Find(ShaderName_to); } } } } } }
利用方法
// StandardをすべてUnlit/STYLYに変更 changeShader(TargetObject, "Unlit/Texture", "Standard"); // すべてのShaderをUnlit/STYLYに変更 changeShader(TargetObject, "Unlit/Texture");