|
|
- // SDK Scripting Define Symbol Predicate|SDK_Base|003
- namespace VRTK
- {
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- using System;
-
- /// <summary>
- /// Specifies a method to be used as a predicate to allow VRTK_SDKManager to automatically add and remove scripting define symbols. Only allowed on static methods that take no arguments and return a `bool`.
- /// </summary>
- [Serializable]
- [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
- public sealed class SDK_ScriptingDefineSymbolPredicateAttribute : Attribute, ISerializationCallbackReceiver
- {
- /// <summary>
- /// The prefix of scripting define symbols that must be used to be able to automatically remove the symbols.
- /// </summary>
- public const string RemovableSymbolPrefix = "VRTK_DEFINE_";
-
- /// <summary>
- /// The scripting define symbol to conditionally add or remove.
- /// </summary>
- public string symbol;
-
- #if UNITY_EDITOR
- /// <summary>
- /// The build target group to use when conditionally adding or removing symbol.
- /// </summary>
- [NonSerialized]
- public BuildTargetGroup buildTargetGroup;
- #endif
- [SerializeField]
- private string buildTargetGroupName;
-
- private SDK_ScriptingDefineSymbolPredicateAttribute()
- {
- }
-
- /// <summary>
- /// Creates a new attribute.
- /// </summary>
- /// <param name="symbol">The scripting define symbol to conditionally add or remove. Needs to start with `RemovableSymbolPrefix` to be able to automatically remove the symbol. `null` and `string.Empty` are not allowed.</param>
- /// <param name="buildTargetGroupName">The name of a constant of `BuildTargetGroup`. `BuildTargetGroup.Unknown`, `null` and `string.Empty` are not allowed.</param>
- public SDK_ScriptingDefineSymbolPredicateAttribute(string symbol, string buildTargetGroupName)
- {
- if (symbol == null)
- {
- VRTK_Logger.Fatal(new ArgumentNullException("symbol"));
- return;
- }
- if (symbol == string.Empty)
- {
- VRTK_Logger.Fatal(new ArgumentOutOfRangeException("symbol", symbol, "An empty string isn't allowed."));
- return;
- }
-
- this.symbol = symbol;
-
- if (buildTargetGroupName == null)
- {
- VRTK_Logger.Fatal(new ArgumentNullException("buildTargetGroupName"));
- return;
- }
- if (buildTargetGroupName == string.Empty)
- {
- VRTK_Logger.Fatal(new ArgumentOutOfRangeException("buildTargetGroupName", buildTargetGroupName, "An empty string isn't allowed."));
- return;
- }
-
- SetBuildTarget(buildTargetGroupName);
- }
-
- /// <summary>
- /// Creates a new attribute by copying an existing one.
- /// </summary>
- /// <param name="attributeToCopy">The attribute to copy.</param>
- public SDK_ScriptingDefineSymbolPredicateAttribute(SDK_ScriptingDefineSymbolPredicateAttribute attributeToCopy)
- {
- symbol = attributeToCopy.symbol;
- SetBuildTarget(attributeToCopy.buildTargetGroupName);
- }
-
- public void OnBeforeSerialize()
- {
- }
-
- public void OnAfterDeserialize()
- {
- SetBuildTarget(buildTargetGroupName);
- }
-
- private void SetBuildTarget(string groupName)
- {
- buildTargetGroupName = groupName;
-
- #if UNITY_EDITOR
- Type buildTargetGroupType = typeof(BuildTargetGroup);
- try
- {
- buildTargetGroup = (BuildTargetGroup)Enum.Parse(buildTargetGroupType, groupName);
- }
- catch (Exception exception)
- {
- VRTK_Logger.Fatal(new ArgumentOutOfRangeException(string.Format("'{0}' isn't a valid constant name of '{1}'.", groupName, buildTargetGroupType.Name), exception));
- return;
- }
-
- if (buildTargetGroup == BuildTargetGroup.Unknown)
- {
- VRTK_Logger.Fatal(new ArgumentOutOfRangeException("groupName", groupName, string.Format("'{0}' isn't allowed.", groupName)));
- return;
- }
- #endif
- }
- }
- }
|