115 lines
3.3 KiB
C#
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 );
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|