/// <summary> /// Calls a script through the scripting system on an object, returning a typed result /// </summary> public static T CallOnForResult <T>(string script, object instance, ScriptExecutionContext context, params object[] args) { return(TypeUtils.CoerceValue <T>(Instance.CallScript(script, instance, context, args))); }
/// <summary> /// Calls a script through the scripting system on an object /// </summary> public static void CallOn(string script, object instance, ScriptExecutionContext context, params object[] args) { Instance.CallScript(script, instance, context, args); }
/// <summary> /// Calls a script through the scripting system on an object, returning a result /// </summary> public static object CallOnForResult(string script, object instance, ScriptExecutionContext context, params object[] args) { return(Instance.CallScript(script, instance, context, args)); }
private static object CallScriptMethod(MethodInfo scriptMethod, object instance, ScriptExecutionContext context, object[] args) { //get script attribute CCScriptAttribute scriptAttribute = null; var scriptAttributes = scriptMethod.GetCustomAttributes(typeof(CCScriptAttribute), false); if (scriptAttributes != null && scriptAttributes.Length > 0) { scriptAttribute = (CCScriptAttribute)scriptAttributes[0]; } //attempt to resolve instance if (!scriptMethod.IsStatic && instance == null) { if (scriptAttribute != null && scriptAttribute.AutoResolveInstance) { var property = scriptMethod.DeclaringType.GetProperty("Instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (property != null) { instance = property.GetValue(null); } else { var field = scriptMethod.DeclaringType.GetField("Instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (field != null) { instance = field.GetValue(null); } } } if (instance == null) { throw new NoInstanceForNonStaticMethodException(); } } var scriptParameters = scriptMethod.GetParameters(); //trim and coerce arguments object[] trimmedArgs; if (scriptParameters == null || scriptParameters.Length == 0) { //cheap path: pass empty array trimmedArgs = new object[] { }; } else if ((scriptAttribute != null && scriptAttribute.NeverPassExecutionContext) || !(scriptParameters != null && scriptParameters.Length > 0 && scriptParameters[0].ParameterType.IsAssignableFrom(typeof(ScriptExecutionContext)))) { //do not pass ScriptExecutionContext trimmedArgs = CoerceAndTrimArguments(args, scriptParameters, null); //display warning if we had to trim if (scriptParameters.Length != args.Length) { Debug.LogWarning($"[{nameof(ScriptingModule)}] Argument coercion warning: {GetCallableName(scriptMethod)} expected {scriptParameters.Length} arguments but was passed {args.Length}"); } } else { //pass all args including ScriptExecutionContext if (scriptParameters.Length == 1) { trimmedArgs = new object[] { context }; } else { trimmedArgs = CoerceAndTrimArguments(args, scriptParameters, context); } //display warning if we had to trim if (scriptParameters.Length != args.Length + 1) { Debug.LogWarning($"[{nameof(ScriptingModule)}] Argument coercion warning: {GetCallableName(scriptMethod)} expected 1+{scriptParameters.Length-1} arguments but was passed 1+{args.Length}"); } } return(scriptMethod.Invoke(instance, trimmedArgs)); }