// 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();
}
}
}
}