// 功能:记录一个委托对象,自动删除前面关联的那个 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; } }
// 功能:根据脚本所传的参数,动态获取或创建一个关联的委托对象 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); }
// 功能:根据脚本所传的参数,动态获取或创建一个关联的委托对象 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); }