コード例 #1
0
 // 功能:记录一个委托对象,自动删除前面关联的那个
 public void  RecordDelegate(System.Object pDelegateFunc, FCDelegateBase pObj)
 {
     if (pDelegateFunc == null)
     {
         return;
     }
     if (pObj == null)
     {
         FCDelegateBase pOld = null;
         if (m_Record.TryGetValue(pDelegateFunc, out pOld))
         {
             FCDelegateKey key = new FCDelegateKey();
             key.nVMPtr     = pOld.m_VMPtr;
             key.nThisPtr   = pOld.m_nThisPtr;
             key.nClassName = pOld.m_nClassName;
             key.nFuncName  = pOld.m_nFuncName;
             m_Delegates.Remove(key);
         }
         m_Record.Remove(pDelegateFunc);
     }
     else
     {
         m_Record[pDelegateFunc] = pObj;
     }
 }
コード例 #2
0
    // 功能:根据脚本所传的参数,动态获取或创建一个关联的委托对象
    public T  GetDelegate <T>(long L, int nIndex = 0) where T : FCDelegateBase, new()
    {
        long pDelegatePtr = FCLibHelper.fc_get_param_ptr(L, nIndex);                        // 得到脚本委托参数(临时的,不可保留)
        long nObjPtr      = FCLibHelper.fc_inport_delegate_get_obj_ptr(pDelegatePtr);       // 得到脚本对象地址
        int  nClassNameID = FCLibHelper.fc_inport_delegate_get_class_name_id(pDelegatePtr); // 类名
        int  nFuncNameID  = FCLibHelper.fc_inport_delegate_get_func_name_id(pDelegatePtr);  // 函数名

        if (0 == nObjPtr && 0 == nClassNameID && 0 == nFuncNameID)
        {
            return(default(T)); // 返回空指针
        }
        FCDelegateKey key = new FCDelegateKey();

        key.nThisPtr   = nObjPtr;
        key.nClassName = nClassNameID;
        key.nFuncName  = nFuncNameID;

        FCDelegateBase obj = null;

        if (m_Delegates.TryGetValue(key, out obj))
        {
            return((T)obj);
        }
        T pObj = new T();

        pObj.m_nThisPtr   = nObjPtr;
        pObj.m_szFuncName = GetDelegateFuncName(pDelegatePtr);
        pObj.m_nClassName = nClassNameID;
        pObj.m_nFuncName  = nFuncNameID;
        m_Delegates[key]  = pObj;
        return(pObj);
    }
コード例 #3
0
    // 功能:根据脚本所传的参数,动态获取或创建一个关联的委托对象
    public T  GetDelegate <T>(long L, int nIndex = 0) where T : FCDelegateBase, new()
    {
        long pDelegatePtr = FCLibHelper.fc_get_param_ptr(L, nIndex);                            // 得到脚本委托参数(临时的,不可保留)
        long VM           = FCLibHelper.fc_get_vm_ptr(L);
        long nObjPtr      = FCLibHelper.fc_inport_delegate_get_obj_ptr(VM, pDelegatePtr);       // 得到脚本对象地址
        int  nClassNameID = FCLibHelper.fc_inport_delegate_get_class_name_id(VM, pDelegatePtr); // 类名
        int  nFuncNameID  = FCLibHelper.fc_inport_delegate_get_func_name_id(VM, pDelegatePtr);  // 函数名

        if (0 == nObjPtr && 0 == nClassNameID && 0 == nFuncNameID)
        {
            return(default(T)); // 返回空指针
        }
        FCDelegateKey key = new FCDelegateKey();

        key.nVMPtr     = VM;
        key.nThisPtr   = nObjPtr;
        key.nClassName = nClassNameID;
        key.nFuncName  = nFuncNameID;

        // -- 这个地方有必要加锁,如果不加锁的话,多线程执行脚本,并在脚本中使用委托,就会导致这里线程冲突
        if (VM != FCDll.GetMainVMPtr())
        {
            Debug.LogError("请注意多线程冲突的问题, 不可以在多线程中使用委托");
        }

        FCDelegateBase obj = null;

        if (m_Delegates.TryGetValue(key, out obj))
        {
            if (key.nVMPtr != VM)
            {
                Debug.LogError("多线程冲突, 记录有误,请检查对应的委托用法");
            }
            return((T)obj);
        }
        T pObj = new T();

        pObj.m_VMPtr      = VM;
        pObj.m_nThisPtr   = nObjPtr;
        pObj.m_szFuncName = GetDelegateFuncName(VM, pDelegatePtr);
        pObj.m_nClassName = nClassNameID;
        pObj.m_nFuncName  = nFuncNameID;
        m_Delegates[key]  = pObj;
        return(pObj);
    }