//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
            });
        }
示例#5
0
        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);
        }