Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

118 lines
4.3 KiB

// 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
}
}
}