IdleGirl/Assets/Plugins/Editor/RelationsInspector/RelationsInspectorLink.cs

115 lines
3.3 KiB
C#

using UnityEngine;
using System;
using UnityEditor;
using System.Reflection;
public class RelationsInspectorLink
{
// assembly names
const string riAssemblyName = "RelationsInspector";
const string editorAssemblyName = "Assembly-CSharp-Editor";
const string editorFirstPassAssemblyName = "Assembly-CSharp-Editor-firstpass";
// window type
const string riWindowTypeName = "RelationsInspector.RelationsInspectorWindow";
static Type windowType;
// window's API1 property
const string api1PropertyName = "GetAPI1";
static PropertyInfo api1Property;
// API1 type
const string riAPI1TypeName = "RelationsInspector.RelationsInspectorAPI";
static Type api1Type;
// API1's ResetTargets method
const string api1ResetTargetsMethodName = "ResetTargets";
static Type[] api1ResetTargetsArguments = new Type[] { typeof( object[] ), typeof( Type ), typeof( bool ) };
static MethodInfo api1ResetTargetsMethod;
// RI is available iff all types, properties and methods could be retrieved
public static bool RIisAvailable
{
get; private set;
}
// ctor. retrieves types, properties and methods
static RelationsInspectorLink()
{
windowType = GetTypeInAssembly( riWindowTypeName, riAssemblyName );
if ( windowType == null )
{
return; // this happens when RI is not installed. no need for an error msg here.
}
api1Property = windowType.GetProperty( api1PropertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty );
if ( api1Property == null )
{
Debug.LogError( "Failed to retrieve API1 property of type " + windowType );
return;
}
api1Type = GetTypeInAssembly( riAPI1TypeName, riAssemblyName );
if ( api1Type == null )
{
Debug.LogError( "Failed to retrieve API1 type" );
return;
}
api1ResetTargetsMethod = api1Type.GetMethod( api1ResetTargetsMethodName, api1ResetTargetsArguments );
if ( api1ResetTargetsMethod == null )
{
Debug.LogError( "Failed to retrieve API method ResetTargets(object[],Type,bool)" );
return;
}
RIisAvailable = true;
}
// opens the window and returns its API1 object
static object GetAPI1Object()
{
if ( !RIisAvailable )
throw new Exception( "RelationsInspector is not available" );
var windowObj = EditorWindow.GetWindow( windowType );
if ( windowObj == null )
{
Debug.LogWarning( "failed to get window of type " + windowType );
return null;
}
return api1Property.GetValue( windowObj, null );
}
// calls ResetTargets. for backends that are shipped with RI
public static void ResetTargets( object[] targets, string backendTypeName, bool delayed = true )
{
if ( !RIisAvailable )
throw new Exception( "RelationsInspector is not available" );
Type backendType = GetTypeInAssembly( backendTypeName, editorAssemblyName );
if (backendType == null)
{
backendType = GetTypeInAssembly(backendTypeName, editorFirstPassAssemblyName);
}
if ( backendType == null )
{
Debug.LogError( "Failed to retrieve backend type " + backendTypeName );
return;
}
object api1 = GetAPI1Object();
api1ResetTargetsMethod.Invoke( api1, new object[] { targets, backendType, delayed } );
}
// retrieves the type from the assembly. names are case-sensitive.
// returns null if the type was not found
static Type GetTypeInAssembly( string typeName, string assemblyName )
{
return Type.GetType( typeName + "," + assemblyName, false, false );
}
}