Advertisement
celinedrules

SceneReference.cs

Mar 2nd, 2023 (edited)
812
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.10 KB | Source Code | 0 0
  1. using System;
  2. using UnityEngine;
  3. using Object = UnityEngine.Object;
  4. using UnityEditor;
  5. using UnityEditor.SceneManagement;
  6.  
  7. namespace SceneManagement
  8. {
  9.     [Serializable]
  10.     public class SceneReference : ISerializationCallbackReceiver
  11.     {
  12.         [SerializeField] private Object sceneAsset;
  13.  
  14.         private string scenePath = string.Empty;
  15.  
  16.         private bool IsValidSceneAsset
  17.         {
  18.             get
  19.             {
  20.                 if (!sceneAsset)
  21.                     return false;
  22.  
  23.                 return sceneAsset is SceneAsset;
  24.             }
  25.         }
  26.  
  27.         public string SceneName => sceneAsset.name;
  28.  
  29.         public string ScenePath
  30.         {
  31.             get => GetScenePathFromAsset();
  32.             set
  33.             {
  34.                 scenePath = value;
  35.                 sceneAsset = GetSceneAssetFromPath();
  36.             }
  37.         }
  38.  
  39.         public static implicit operator string(SceneReference sceneReference) => sceneReference.ScenePath;
  40.         public void OnBeforeSerialize() => HandleBeforeSerialize();
  41.         public void OnAfterDeserialize() => EditorApplication.update += HandleAfterDeserialize;
  42.         private SceneAsset GetSceneAssetFromPath() => string.IsNullOrEmpty(scenePath) ? null : AssetDatabase.LoadAssetAtPath<SceneAsset>(scenePath);
  43.         private string GetScenePathFromAsset() => sceneAsset == null ? string.Empty : AssetDatabase.GetAssetPath(sceneAsset);
  44.  
  45.         private void HandleBeforeSerialize()
  46.         {
  47.             if (IsValidSceneAsset == false && string.IsNullOrEmpty(scenePath) == false)
  48.             {
  49.                 sceneAsset = GetSceneAssetFromPath();
  50.  
  51.                 if (sceneAsset == null)
  52.                     scenePath = string.Empty;
  53.  
  54.                 EditorSceneManager.MarkAllScenesDirty();
  55.             }
  56.             else
  57.             {
  58.                 scenePath = GetScenePathFromAsset();
  59.             }
  60.         }
  61.  
  62.         private void HandleAfterDeserialize()
  63.         {
  64.             EditorApplication.update -= HandleAfterDeserialize;
  65.  
  66.             if (IsValidSceneAsset)
  67.                 return;
  68.  
  69.             if (string.IsNullOrEmpty(scenePath))
  70.                 return;
  71.  
  72.             sceneAsset = GetSceneAssetFromPath();
  73.  
  74.             if (!sceneAsset)
  75.                 scenePath = string.Empty;
  76.  
  77.             if (!Application.isPlaying)
  78.                 EditorSceneManager.MarkAllScenesDirty();
  79.         }
  80.     }
  81.  
  82. #if UNITY_EDITOR
  83.     [CustomPropertyDrawer(typeof(SceneReference))]
  84.     public class SceneReferenceDrawer : PropertyDrawer
  85.     {
  86.         public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
  87.         {
  88.             return EditorGUIUtility.singleLineHeight;
  89.         }
  90.        
  91.         public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
  92.         {
  93.             SerializedProperty sceneProp = property.FindPropertyRelative("sceneAsset");
  94.             label = new GUIContent("Scene to Load");
  95.             Rect pos = EditorGUI.PrefixLabel(position, label);
  96.             EditorGUI.PropertyField(pos, sceneProp, GUIContent.none);
  97.         }
  98.     }
  99. #endif
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement