74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| 
 | |
| namespace UnityEngine.XR.Content.Interaction
 | |
| {
 | |
|     /// <summary>
 | |
|     /// A generic Keychain component that holds the <see cref="Key"/>s to open a <see cref="Lock"/>.
 | |
|     /// Attach a Keychain component to an Interactable and assign to it the same Keys of an <see cref="XRLockSocketInteractor"/>
 | |
|     /// or an <see cref="XRLockGridSocketInteractor"/> to open (or interact with) them.
 | |
|     /// </summary>
 | |
|     [DisallowMultipleComponent]
 | |
|     public class Keychain : MonoBehaviour, IKeychain
 | |
|     {
 | |
|         [SerializeField]
 | |
|         [Tooltip("The keys on this keychain" +
 | |
|             "Create new keys by selecting \"Assets/Create/XR/Key Lock System/Key\"")]
 | |
|         List<Key> m_Keys;
 | |
| 
 | |
|         HashSet<int> m_KeysHashSet = new HashSet<int>();
 | |
| 
 | |
|         void Awake()
 | |
|         {
 | |
|             RepopulateHashSet();
 | |
|         }
 | |
| 
 | |
|         void OnValidate()
 | |
|         {
 | |
|             // A key was added through the inspector while the game was running?
 | |
|             if (Application.isPlaying && m_Keys.Count != m_KeysHashSet.Count)
 | |
|                 RepopulateHashSet();
 | |
|         }
 | |
| 
 | |
|         void RepopulateHashSet()
 | |
|         {
 | |
|             m_KeysHashSet.Clear();
 | |
|             foreach (var key in m_Keys)
 | |
|             {
 | |
|                 if (key != null)
 | |
|                     m_KeysHashSet.Add(key.GetInstanceID());
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Adds the supplied key to this keychain
 | |
|         /// </summary>
 | |
|         /// <param name="key">The key to be added to the keychain</param>
 | |
|         public void AddKey(Key key)
 | |
|         {
 | |
|             if (key == null || Contains(key))
 | |
|                 return;
 | |
| 
 | |
|             m_Keys.Add(key);
 | |
|             m_KeysHashSet.Add(key.GetInstanceID());
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Adds the supplied key from this keychain
 | |
|         /// </summary>
 | |
|         /// <param name="key">The key to be removed from the keychain</param>
 | |
|         public void RemoveKey(Key key)
 | |
|         {
 | |
|             m_Keys.Remove(key);
 | |
| 
 | |
|             if (key != null)
 | |
|                 m_KeysHashSet.Remove(key.GetInstanceID());
 | |
|         }
 | |
| 
 | |
|         /// <inheritdoc />
 | |
|         public bool Contains(Key key)
 | |
|         {
 | |
|             return key != null && m_KeysHashSet.Contains(key.GetInstanceID());
 | |
|         }
 | |
|     }
 | |
| }
 |