夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityエディタ拡張を使用して現在開かれているシーンのすべてのMeshRendererからCastShadowを設定する

本日はUnity枠です。 Unityではメッシュを描画する際は一般的にMeshRendererコンポーネントを使用しています。(アニメーションを行うメッシュなどはSkkinedMeshRendererなどが使用される場合もあります。)

MeshRenererでは描画の設定として影を設定することができ、シェーダーが影を描画することに対応している場合は影合描画されます。

しかし影の描画は一般的に描画コストが高い処理といわれており、負荷を考慮する場合はCastShadowの機能をオフにすることが推奨されています。

筆者の場合HoloLensアプリケーションでは性質上黒を描画することができないため、シーン内のすべてのMeshRendererからCastShadowをオフにする作業を行っていましたが、作業後にシーンの変更が生じる別の作業を行う場合やチーム開発を行う場合などでは最終的にCastShadowがオンのオブジェクトが存在してしまうこともありかなり面倒くさい作業となっていました。

今回はUntiyエディタ拡張を使用して現在開かれているシーンに存在しているMeshRendererからCastShadowを一括オン、オフにする実装を行います。

〇ソースコード

今回は最初にソースコードを紹介します。

こちらではUnity上部ワールドメニューTools内にコマンドが作成され選択することでWindowが開き、すべてのRendererのCastShadow値をBool castShadowsの値に基づきオン、オフにします。

using UnityEditor;
using UnityEngine;

    /// <summary>
    /// This class allows you to simultaneously turn on and off the CastShadow functionality for game objects using a particular shader in the currently open scene.
    /// </summary>
    public class MeshRendererShadowCastingEditor : EditorWindow
    {
        private bool castShadows = false; // CastShadow Settings Defaultで府にしています。

        [MenuItem("Tools/Mesh Renderer Shadow Casting Editor")]
        public static void ShowWindow()
        {
            //ウィンドウを開きます。
            GetWindow<MeshRendererShadowCastingEditor>("Mesh Renderer Shadow Casting Editor");
        }

         //ウィンドウに表示されるUI
        private void OnGUI()
        {
            castShadows = EditorGUILayout.Toggle("Cast Shadows", castShadows);

           //"Update"ボタンとボタンを押した際の処理を記述します。
            if (GUILayout.Button("Update"))
            {
                UpdateCastShadows( castShadows);
            }
        }

  //ボタンを押された際のMeshRenderのCastShadowを変更するメソッドです。
        private void UpdateCastShadows( bool castShadows)
        {
           //シーン上に存在するすべてのMeshRendererを取得します。
            MeshRenderer[] renderers = FindObjectsOfType<MeshRenderer>();

          
           //取得したRendererごとにUI上に表示されているBool型のcastShadowsの設定に基づいてオンオフを変更しています。
            foreach (MeshRenderer renderer in renderers)
            {
                    renderer.shadowCastingMode = castShadows
                        ? UnityEngine.Rendering.ShadowCastingMode.On
                        : UnityEngine.Rendering.ShadowCastingMode.Off;
            }
        }
    }

本日は以上です。