128 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace ES3Internal
 | |
| {
 | |
|     public class ES3GlobalReferences : ScriptableObject
 | |
|     {
 | |
| #if !UNITY_EDITOR || ES3GLOBAL_DISABLED
 | |
|         public static ES3GlobalReferences Instance{ get{ return null; } }
 | |
|         public UnityEngine.Object Get(long id){return null;}
 | |
|         public long GetOrAdd(UnityEngine.Object obj){return -1;}
 | |
|         public void RemoveInvalidKeys(){}
 | |
| #else
 | |
| 
 | |
| #if ES3GLOBAL_DISABLED
 | |
|         private static bool useGlobalReferences = false;
 | |
| #else
 | |
|         private static bool useGlobalReferences = true;
 | |
| #endif
 | |
| 
 | |
|         private const string globalReferencesPath = "ES3/ES3GlobalReferences";
 | |
| 
 | |
|         [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 | |
|         public ES3RefIdDictionary refId = new ES3RefIdDictionary();
 | |
| 
 | |
|         private static ES3GlobalReferences _globalReferences = null;
 | |
|         public static ES3GlobalReferences Instance
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 // If Global References is disabled, we still keep it enabled unless we're playing so that ES3ReferenceMgrs in different scenes still use the same IDs.
 | |
|                 if (Application.isPlaying && !useGlobalReferences)
 | |
|                     return null;
 | |
| 
 | |
|                 if (_globalReferences == null)
 | |
|                 {
 | |
|                     _globalReferences = Resources.Load<ES3GlobalReferences>(globalReferencesPath);
 | |
| 
 | |
|                     if (_globalReferences == null)
 | |
|                     {
 | |
|                         _globalReferences = ScriptableObject.CreateInstance<ES3GlobalReferences>();
 | |
| 
 | |
|                         // If this is the version being submitted to the Asset Store, don't include ES3Defaults.
 | |
|                         if (Application.productName.Contains("ES3 Release"))
 | |
|                         {
 | |
|                             Debug.Log("This has been identified as a release build as the title contains 'ES3 Release', so ES3GlobalReferences will not be created.");
 | |
|                             return _globalReferences;
 | |
|                         }
 | |
| 
 | |
|                         ES3Settings.CreateDefaultSettingsFolder();
 | |
|                         UnityEditor.AssetDatabase.CreateAsset(_globalReferences, PathToGlobalReferences());
 | |
|                         UnityEditor.AssetDatabase.SaveAssets();
 | |
|                     }
 | |
| 
 | |
|                 }
 | |
| 
 | |
|                 return _globalReferences;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private long Get(UnityEngine.Object obj)
 | |
|         {
 | |
|             if (obj == null)
 | |
|                 return -1;
 | |
| 
 | |
|             long id;
 | |
|             if (!refId.TryGetValue(obj, out id))
 | |
|                 return -1;
 | |
|             return id;
 | |
|         }
 | |
| 
 | |
|         public UnityEngine.Object Get(long id)
 | |
|         {
 | |
|             foreach(var kvp in refId)
 | |
|                 if (kvp.Value == id)
 | |
|                     return kvp.Key;
 | |
|             return null;
 | |
|         }
 | |
| 
 | |
|         public void RemoveInvalidKeys()
 | |
|         {
 | |
|             var newRefId = new ES3RefIdDictionary();
 | |
|             foreach (var kvp in refId)
 | |
|             {
 | |
|                 var obj = kvp.Key;
 | |
|                 if (obj == null)
 | |
|                     continue;
 | |
| 
 | |
|                 if ((((obj.hideFlags & HideFlags.DontSave) == HideFlags.DontSave) ||
 | |
|                  ((obj.hideFlags & HideFlags.DontSaveInBuild) == HideFlags.DontSaveInBuild) ||
 | |
|                  ((obj.hideFlags & HideFlags.DontSaveInEditor) == HideFlags.DontSaveInEditor) ||
 | |
|                  ((obj.hideFlags & HideFlags.HideAndDontSave) == HideFlags.HideAndDontSave)))
 | |
|                 {
 | |
|                     var type = obj.GetType();
 | |
|                     // Meshes are marked with HideAndDontSave, but shouldn't be ignored.
 | |
|                     if (type != typeof(Mesh) && type != typeof(Material))
 | |
|                         continue;
 | |
|                 }
 | |
|                 newRefId[obj] = kvp.Value;
 | |
|             }
 | |
|             refId = newRefId;
 | |
|         }
 | |
| 
 | |
|         public long GetOrAdd(UnityEngine.Object obj)
 | |
|         {
 | |
|             var id = Get(obj);
 | |
| 
 | |
|             // Only add items to global references when it's not playing.
 | |
|             if (!Application.isPlaying && id == -1 && UnityEditor.AssetDatabase.Contains(obj) && ES3ReferenceMgr.CanBeSaved(obj))
 | |
|             {
 | |
|                 id = ES3ReferenceMgrBase.GetNewRefID();
 | |
|                 refId.Add(obj, id);
 | |
| 
 | |
|                 UnityEditor.EditorUtility.SetDirty(this);
 | |
|             }
 | |
| 
 | |
|             return id;
 | |
|         }
 | |
| 
 | |
|         private static string PathToGlobalReferences()
 | |
|         {
 | |
|             return ES3Settings.PathToEasySaveFolder() + "Resources/" + globalReferencesPath +".asset";
 | |
|         }
 | |
| #endif
 | |
|     }
 | |
| }
 |