Skip to content Skip to sidebar Skip to footer

Visualizzare e selezionare oggetti Cast Shadow = Shadow Only nell’editor di Unity

Uno dei problemi dell’editor di Unity è che gli oggetti di cui abbiamo impostato la proprietà del Renderer Cast Shadow uguale a Shadow Only è che non vengono in alcun modo più visualizzati una volta settata. L’unico modo per poterli riselezionare (e dunque spostare o modificare) è quello di trovarli nella gerarchia.
In situazioni dove la scena è molto complessa si rischia spesso di non trovarli più in alcun modo se non ricordandosene il nome.

Per fortuna è possibile, attraverso il namespace Unity.Editor, interagire con gli oggetti e fare in modo di mostrarli nuovamente con possibilità di interazione. Per farlo è necessario creare uno script che traversi tutti gli oggetti in scena e mostri quelli Cast Shadow = Shadow Only. Di seguito lo script.


#if UNITY_EDITOR

using UnityEngine;
using UnityEditor;
using UnityEngine.Rendering;
using UnityEditor.SceneManagement;

[InitializeOnLoad]
public static class ShadowOnlyGizmoEditor
{
    static ShadowOnlyGizmoEditor()
    {
        SceneView.duringSceneGui += OnSceneGUI;
    }

    private static void OnSceneGUI(SceneView sceneView)
    {
        // Se siamo nel prefab mode, non disegniamo nulla
        if (PrefabStageUtility.GetCurrentPrefabStage() != null) return;

        Handles.color = Color.yellow;
        foreach (Renderer rend in Object.FindObjectsOfType<Renderer>())
        {
            if (rend.shadowCastingMode == ShadowCastingMode.ShadowsOnly)
            {
                //Disegna un wireframe attorno agli oggetti
                Handles.DrawWireCube(rend.bounds.center, rend.bounds.size);

                //Scrive il nome dell'oggetto
                GUIStyle style = new GUIStyle();
                style.normal.textColor = Color.yellow;
                style.fontSize = 12;
                style.fontStyle = FontStyle.Bold;
                Handles.Label(rend.bounds.center + Vector3.up * rend.bounds.extents.y, rend.gameObject.name, style);

                //Rende l'oggetto selezionabile
                if (Handles.Button(rend.bounds.center, Quaternion.identity, 0.5f, 0.5f, Handles.SphereHandleCap))
                {
                    Selection.activeGameObject = rend.gameObject;
                }
            }
        }
    }
}
#endif

Si noti nello script l’uso della direttiva di compilazione #if editor che permette di eseguire lo script unicamente quando è utilizzato l’editor di Unity e non in build. Il risultato dovrebbe essere il seguente (notare il punto centrale selezionabile)

Copyright © Desdinova ® / PIVA 03799780162 / Non è una testata giornalistica.
Tutti i diritti riservati ai legittimi proprietari, anche ove non citati.