//redirect from the copy constructor in c++, binds and injects the values void CopyFrom(IntPtr _from, IntPtr _to) { MochaInterface.CScript to = new MochaInterface.CScript(_to, false); MochaInterface.CScript from = new MochaInterface.CScript(_from, false); //copy properties over object to_sc = cscriptToBoundScriptLookup[to].scriptObject; object from_sc = null; if (cscriptToBoundScriptLookup.ContainsKey(from)) { from_sc = cscriptToBoundScriptLookup[from].scriptObject; CopyObject(from_sc, to_sc); if (from.gameObject.GetIsDormantObject()) { //HACK: remove this object is it came from a prefab - it has served its purpose _unregister(_from); } } else { Logger.Log("WARNING: No defaults values will be copied for object from prefab: " + to.gameObject.GetName()); } }
private void RegisterCScript(IntPtr from) { //setup MochaInterface.CScript cs = new MochaInterface.CScript(from, false); BoundScript bs = new BoundScript(); bs.scriptComponent = cs; string sc = cs.scriptAsset.GetName(); //assumed valid at this point sc = sc.Remove(sc.Length - 3); bs.scriptName = sc; //post-compilation bs.scriptObject = ScriptManager.getInstance().MakeObject(bs.scriptName); if (bs.scriptObject != null) { bs.scriptObject.GetType().GetProperty("gameObject").SetValue(bs.scriptObject, cs.gameObject, null); try { bs.Func_OnUpdate = bs.scriptObject.GetType().GetMethod("OnUpdate"); if (bs.Func_OnUpdate == null) { throw new Exception("No public OnUpdate specified for class: " + bs.scriptName); } } catch (Exception e) { Logger.Log("ERROR compiling scripts: " + e.Message); } } bs.register_id = cs.register_id; RelinkScriptPropertiesFromStore(bs); bs.scriptEvents.Enqueue(new ScriptEvent() { methodname = "OnStart" }); //indexing registeredScripts.Add(bs); cscriptToBoundScriptLookup.Add(cs, bs); if (!gameObjectToBoundScriptsLookup.ContainsKey(cs.gameObject)) { gameObjectToBoundScriptsLookup.Add(cs.gameObject, new List <BoundScript>()); } gameObjectToBoundScriptsLookup[cs.gameObject].Add(bs); }
private void UnRegisterCScript(IntPtr from) { MochaInterface.CScript cs = new MochaInterface.CScript(from, false); BoundScript bs = null; try { bs = cscriptToBoundScriptLookup[cs]; } catch (KeyNotFoundException) { Logger.Log("ERROR: Unregister skipped (not found) for script from GameObject: " + cs.gameObject.GetName()); return; } //call OnEnd if (bs.hasCalledOnStart) { MethodInfo mi = bs.scriptObject.GetType().GetMethod("OnEnd"); if (mi != null) { try { mi.Invoke(bs.scriptObject, null); } catch (Exception e) { Logger.Log("WARNING: Could not call OnEnd on script: " + bs.scriptName + " because " + e.Message); } } } registeredScripts.Remove(bs); cscriptToBoundScriptLookup.Remove(cs); var bslist = gameObjectToBoundScriptsLookup[cs.gameObject]; bslist.Remove(bs); if (bslist.Count == 0) { gameObjectToBoundScriptsLookup.Remove(cs.gameObject); } }
void QueueAction(IntPtr cs_ptr, string _methodname, IntPtr data, string data_type) { object data_obj = null; if (data != null) { MochaInterface.IMeta imeta_obj = new MochaInterface.IMeta(data, false); if (String.IsNullOrWhiteSpace(data_type)) { Logger.Log("ERROR: Failed to convert queued event parameter because data_type is null"); } else { data_obj = CastingHelper.castTo(imeta_obj, Type.GetType("MochaInterface." + data_type)); } } MochaInterface.CScript cs = new MochaInterface.CScript(cs_ptr, false); BoundScript bs = cscriptToBoundScriptLookup[cs]; bs.scriptEvents.Enqueue(new ScriptEvent() { methodname = _methodname, data = data_obj }); }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) { return(null); } MochaInterface.CScript cs = value as MochaInterface.CScript; if (cs == null) { return(null); } if (MochaScriptSystem.ScriptSubsystemManaged.getInstance().GetHasErrors()) { return(null); } if (!MochaScriptSystem.ScriptSubsystemManaged.getInstance().IsCScriptRegistered(cs)) { return(null); } var ret = MochaScriptSystem.ScriptSubsystemManaged.getInstance().GetBoundScriptFromCScript(cs); return(ret); }