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)
