Files
tianrunCRM/Assets/CoolapeFrame/Scripts/Lua/CLBaseLua.cs
2020-07-04 14:41:25 +08:00

538 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description: 把mobobehaviour的处理都转到lua层
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using XLua;
namespace Coolape
{
public class CLBaseLua : MonoBehaviour
{
public bool isPause = false;
public string luaPath;
protected static LuaEnv _mainLua = null;
// 防止报错
public static LuaEnv mainLua
{
get
{
if (_mainLua == null)
_mainLua = new LuaEnv();
return _mainLua;
}
}
public void resetMainLua()
{
_mainLua = new LuaEnv();
}
public LuaEnv lua;
public virtual void setLua()
{
if (luaTable != null)
return;
doSetLua(false);
}
LuaTable _luaTable;
public LuaTable luaTable
{
get
{
if (_luaTable == null)
{
}
return _luaTable;
}
set
{
if (_luaTable != value && _luaTable != null)
{
destoryLua();
}
_luaTable = value;
}
}
string luaClassname = null;
public bool isClassLua
{
get
{
if (luaClassname == null)
{
if (luaTable != null)
{
luaClassname = luaTable.GetInPath<string>("__cname");
}
luaClassname = luaClassname == null ? "" : luaClassname;
}
return !string.IsNullOrEmpty(luaClassname);
}
}
public object[] doSetLua(bool Independent)
{
object[] ret = null;
try
{
destoryLua();
if (Independent)
{
lua = new LuaEnv();
}
else
{
lua = mainLua;
}
CLUtlLua.addLuaLoader(lua);
if (!string.IsNullOrEmpty(luaPath))
{
ret = CLUtlLua.doLua(lua, luaPath);
if (ret != null && ret.Length > 0)
{
luaTable = (LuaTable)(ret[0]);
if(isClassLua)
{
LuaFunction newFunc= luaTable.GetInPath<LuaFunction>("new");
if (newFunc != null)
{
ret = newFunc.Call();
if (ret != null && ret.Length > 0)
{
luaTable = (LuaTable)(ret[0]);
}
}
else
{
Debug.LogError("Is class lua, but no new function ==" + luaPath);
}
}
}
else
{
Debug.LogError("SetLua no luatable returned !! ==" + luaPath);
}
}
}
catch (System.Exception e)
{
Debug.LogError("[" + gameObject.name + "]" + e);
}
return ret;
}
Transform _tr;
//缓存transform
public Transform transform
{
get
{
if (_tr == null)
{
_tr = gameObject.transform;
}
return _tr;
}
}
public object[] call(LuaFunction func, params object[] _params)
{
if (func == null)
{
return null;
}
if (isClassLua)
{
NewList list = ObjPool.listPool.borrowObject();
list.Clear();
list.Add(luaTable);
list.AddRange(_params);
object[] ret = func.Call(list.ToArray(), null);
ObjPool.listPool.returnObject(list);
return ret;
}
else
{
return func.Call(_params);
}
}
public void onNotifyLua(GameObject gameObj, string funcName, object paras)
{
LuaFunction lfunc = null;
if (!string.IsNullOrEmpty(funcName))
{
lfunc = getLuaFunction(funcName);
}
else
{
lfunc = getLuaFunction("onNotifyLua");
}
if (lfunc != null)
{
call(lfunc, gameObj, paras);
}
}
public Dictionary<string, LuaFunction> luaFuncMap = new Dictionary<string, LuaFunction>();
public virtual LuaFunction getLuaFunction(string funcName)
{
if (string.IsNullOrEmpty(funcName))
return null;
LuaFunction ret = null;
if (luaFuncMap.ContainsKey(funcName))
{
ret = luaFuncMap[funcName];
}
if (ret == null && luaTable != null)
{
ret = luaTable.GetInPath<LuaFunction>(funcName);
//ret = (LuaFunction)(luaTable [funcName]);
if (ret != null)
{
luaFuncMap[funcName] = ret;
}
}
return ret;
}
public object getLuaVar(string name)
{
if (luaTable == null)
return null;
return luaTable.GetInPath<object>(name);
}
/// <summary>
/// Invoke4s the lua.回调lua函数 等待时间
/// </summary>
/// <param name='callbakFunc'>
/// Callbak func.
/// </param>
/// <param name='sec'>
/// Sec.
/// </param>
Hashtable coroutineMap = Hashtable.Synchronized(new Hashtable());
Hashtable coroutineIndex = Hashtable.Synchronized(new Hashtable());
public UnityEngine.Coroutine invoke4Lua(object callbakFunc, float sec)
{
return invoke4Lua(callbakFunc, "", sec);
}
public UnityEngine.Coroutine invoke4Lua(object callbakFunc, object orgs, float sec)
{
return invoke4Lua(callbakFunc, orgs, sec, false);
}
/// <summary>
/// Invoke4s the lua.
/// </summary>
/// <param name="callbakFunc">Callbak func.lua函数</param>
/// <param name="orgs">Orgs.参数</param>
/// <param name="sec">Sec.等待时间</param>
public UnityEngine.Coroutine invoke4Lua(object callbakFunc, object orgs, float sec, bool onlyOneCoroutine)
{
if (!gameObject.activeInHierarchy)
{
Debug.LogWarning("invoke4Lua error, then gameObject is hidden.name=" + gameObject.name);
return null;
}
if (callbakFunc == null)
{
Debug.LogError("callbakFunc is null ......");
return null;
}
try
{
UnityEngine.Coroutine ct = null;
if (onlyOneCoroutine)
{
cleanCoroutines(callbakFunc);
}
int index = getCoroutineIndex(callbakFunc);
ct = StartCoroutine(doInvoke4Lua(callbakFunc, sec, orgs, index));
setCoroutine(callbakFunc, ct, index);
return ct;
}
catch (System.Exception e)
{
Debug.LogError("[" + gameObject.name + "]" + callbakFunc + ":" + e);
return null;
}
}
public int getCoroutineIndex(object callbakFunc)
{
object key = getKey4InvokeMap(callbakFunc, coroutineIndex);
int ret = MapEx.getInt(coroutineIndex, key);
coroutineIndex[key] = ret + 1;
return ret;
}
public void setCoroutineIndex(object callbakFunc, int val)
{
object key = getKey4InvokeMap(callbakFunc, coroutineIndex);
coroutineIndex[key] = val;
}
/// <summary>
/// Gets the key4 invoke map.当直接传luafunction时不能直接用用Equals查找一下key
/// </summary>
/// <returns>The key4 invoke map.</returns>
/// <param name="callbakFunc">Callbak func.</param>
/// <param name="map">Map.</param>
public object getKey4InvokeMap(object callbakFunc, Hashtable map)
{
if (callbakFunc == null || map == null)
return callbakFunc;
object key = callbakFunc;
if (callbakFunc != null)
{
NewList keys = ObjPool.listPool.borrowObject();
keys.AddRange(map.Keys);
for (int i = 0; i < keys.Count; i++)
{
if ((callbakFunc).Equals((keys[i])))
{
key = keys[i];
break;
}
}
ObjPool.listPool.returnObject(keys);
keys = null;
}
return key;
}
public Hashtable getCoroutines(object callbakFunc)
{
object key = getKey4InvokeMap(callbakFunc, coroutineMap);
if (coroutineMap[key] == null)
{
coroutineMap[key] = new Hashtable();
}
return (coroutineMap[key]) as Hashtable;
}
public void setCoroutine(object callbakFunc, UnityEngine.Coroutine ct, int index)
{
object key = getKey4InvokeMap(callbakFunc, coroutineMap);
Hashtable map = getCoroutines(callbakFunc);
map[index] = ct;
coroutineMap[key] = map;
}
public void cleanCoroutines(object callbakFunc)
{
object key = getKey4InvokeMap(callbakFunc, coroutineMap);
Hashtable list = getCoroutines(callbakFunc);
foreach (DictionaryEntry cell in list)
{
StopCoroutine((UnityEngine.Coroutine)(cell.Value));
}
list.Clear();
setCoroutineIndex(callbakFunc, 0);
coroutineMap.Remove(key);
}
public void rmCoroutine(object callbakFunc, int index)
{
object key = getKey4InvokeMap(callbakFunc, coroutineMap);
Hashtable list = getCoroutines(callbakFunc);
list.Remove(index);
coroutineMap[key] = list;
}
public void cancelInvoke4Lua()
{
cancelInvoke4Lua(null);
}
public void cancelInvoke4Lua(object callbakFunc)
{
if (callbakFunc == null)
{
Hashtable list = null;
NewList keys = ObjPool.listPool.borrowObject();
keys.AddRange(coroutineMap.Keys);
object key = null;
for (int i = 0; i < keys.Count; i++)
{
key = keys[i];
if (key != null)
{
list = getCoroutines(key);
foreach (DictionaryEntry cell in list)
{
StopCoroutine((UnityEngine.Coroutine)(cell.Value));
}
list.Clear();
}
}
coroutineMap.Clear();
coroutineIndex.Clear();
ObjPool.listPool.returnObject(keys);
}
else
{
cleanCoroutines(callbakFunc);
}
}
Queue invokeFuncs = new Queue();
IEnumerator doInvoke4Lua(object callbakFunc, float sec, object orgs, int index)
{
yield return new WaitForSeconds(sec);
try
{
rmCoroutine(callbakFunc, index);
object func = null;
if (callbakFunc is string)
{
func = getLuaFunction(callbakFunc.ToString());
}
else
{
func = callbakFunc;
}
if (func != null)
{
if (!isPause)
{
if (isClassLua && func is LuaFunction)
{
if (orgs == null)
{
Utl.doCallback(func, luaTable);
}
else
{
Utl.doCallback(func, luaTable, orgs);
}
}
else
{
if (orgs == null)
{
Utl.doCallback(func);
}
else
{
Utl.doCallback(func, orgs);
}
}
}
else
{
//ArrayList list = new ArrayList ();
NewList list = ObjPool.listPool.borrowObject();
list.Add(func);
list.Add(orgs);
list.Add(index);
invokeFuncs.Enqueue(list);
}
}
}
catch (System.Exception e)
{
string msg = "[" + gameObject.name + "] call err:doInvoke4Lua" + ",callbakFunc=[" + callbakFunc + "]";
// CLAlert.add (msg, Color.red, -1);
Debug.LogError(msg);
Debug.LogError(e);
}
}
public virtual void pause()
{
isPause = true;
}
public virtual void regain()
{
isPause = false;
object func = null;
object orgs = null;
NewList invokeList = null;
try
{
while (invokeFuncs.Count > 0)
{
invokeList = (NewList)(invokeFuncs.Dequeue());
func = invokeList[0];
orgs = invokeList[1];
if (isClassLua && func is LuaFunction)
{
if (orgs == null)
{
Utl.doCallback(func, luaTable);
}
else
{
Utl.doCallback(func, luaTable, orgs);
}
}
else
{
if (orgs == null)
{
Utl.doCallback(func);
}
else
{
Utl.doCallback(func, orgs);
}
}
ObjPool.listPool.returnObject(invokeList);
invokeList = null;
}
}
catch (System.Exception e)
{
Debug.LogError("[" + gameObject.name + "]" + func != null ? func.ToString() : "" + "==" + e);
}
}
public virtual void OnDestroy()
{
destoryLua();
}
public void destoryLua()
{
foreach (var cell in luaFuncMap)
{
if (cell.Value != null)
{
cell.Value.Dispose();
}
}
luaFuncMap.Clear();
if (_luaTable != null)
{
_luaTable.Dispose();
_luaTable = null;
}
}
}
}