using System.Collections.Generic; namespace UnityEngine.XR.Content.Interaction { /// /// A generic Keychain component that holds the s to open a . /// Attach a Keychain component to an Interactable and assign to it the same Keys of an /// or an to open (or interact with) them. /// [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 m_Keys; HashSet m_KeysHashSet = new HashSet(); 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()); } } /// /// Adds the supplied key to this keychain /// /// The key to be added to the keychain public void AddKey(Key key) { if (key == null || Contains(key)) return; m_Keys.Add(key); m_KeysHashSet.Add(key.GetInstanceID()); } /// /// Adds the supplied key from this keychain /// /// The key to be removed from the keychain public void RemoveKey(Key key) { m_Keys.Remove(key); if (key != null) m_KeysHashSet.Remove(key.GetInstanceID()); } /// public bool Contains(Key key) { return key != null && m_KeysHashSet.Contains(key.GetInstanceID()); } } }