// Base Highlighter|Highlighters|40010 namespace VRTK.Highlighters { using UnityEngine; using System.Collections.Generic; /// /// Provides a base that all highlighters can inherit from. /// /// /// **Script Usage:** /// > This is an abstract class that is to be inherited to a concrete class that provides highlight functionality, therefore this script should not be directly used. /// public abstract class VRTK_BaseHighlighter : MonoBehaviour { [Tooltip("Determines if this highlighter is the active highlighter for the object the component is attached to. Only one active highlighter can be applied to a GameObject.")] public bool active = true; [Tooltip("Determines if the highlighted object should be unhighlighted when it is disabled.")] public bool unhighlightOnDisable = true; protected bool usesClonedObject = false; protected GameObject objectToAffect; /// /// The Initalise method is used to set up the state of the highlighter. /// /// An optional colour may be passed through at point of initialisation in case the highlighter requires it. /// An optional GameObject to specify which object to apply the highlighting to. /// An optional dictionary of highlighter specific options that may be differ with highlighter implementations. public abstract void Initialise(Color? color = null, GameObject affectObject = null, Dictionary options = null); /// /// The ResetHighlighter method is used to reset the highlighter if anything on the object has changed. It should be called by any scripts changing object materials or colours. /// public abstract void ResetHighlighter(); /// /// The Highlight method is used to initiate the highlighting logic to apply to an object. /// /// An optional colour to highlight the game object to. The highlight colour may already have been set in the `Initialise` method so may not be required here. /// An optional duration of how long before the highlight has occured. It can be used by highlighters to fade the colour if possible. public abstract void Highlight(Color? color = null, float duration = 0f); /// /// The Unhighlight method is used to initiate the logic that returns an object back to it's original appearance. /// /// An optional colour that could be used during the unhighlight phase. Usually will be left as null. /// An optional duration of how long before the unhighlight has occured. public abstract void Unhighlight(Color? color = null, float duration = 0f); /// /// The GetOption method is used to return a value from the options array if the given key exists. /// /// The system type that is expected to be returned. /// The dictionary of options to check in. /// The identifier key to look for. /// The value in the options at the given key returned in the provided system type. public virtual T GetOption(Dictionary options, string key) { return (T)VRTK_SharedMethods.GetDictionaryValue(options, key, default(T)); } /// /// The UsesClonedObject method is used to return whether the current highlighter creates a cloned object to do the highlighting with. /// /// Returns `true` if the highlighter creates a cloned object to apply the highlighter on, returns `false` if no additional object is created. public virtual bool UsesClonedObject() { return usesClonedObject; } /// /// The GetActiveHighlighter method checks the given GameObject for a valid and active highlighter. /// /// The GameObject to check for a highlighter on. /// A valid and active highlighter. public static VRTK_BaseHighlighter GetActiveHighlighter(GameObject obj) { VRTK_BaseHighlighter objectHighlighter = null; VRTK_BaseHighlighter[] foundHighlighters = obj.GetComponents(); for (int i = 0; i < foundHighlighters.Length; i++) { VRTK_BaseHighlighter foundHighlighter = foundHighlighters[i]; if (foundHighlighter.active) { objectHighlighter = foundHighlighter; break; } } return objectHighlighter; } protected virtual void OnDisable() { if (unhighlightOnDisable) { Unhighlight(); } } } }