Files
JJBB/Assets/Project/Script/LuaScripts/UI/LuaUIBehaviour.cs

272 lines
7.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using System;
using System.Collections.Generic;
using Games.LogicObj;
using GCGame.Table;
using Module.Log;
using UnityEngine;
using UnityEngine.UI;
using XLua;
[Serializable]
public class LuaParamGO
{
public string name;
public GameObject value;
}
[LuaCallCSharp]
public class LuaUIBehaviour : MonoBehaviour
{
internal const float GCInterval = 1; //1 second
internal static float lastGCTime = 0;
public string luaScript;
public LuaParamGO[] injectionGos;
private bool hasAwake;
private Action luaAwake;
private Action luaFixedUpdate;
private Action luaOnDestroy;
private Action luaOnDisable;
private Action luaOnEnable;
private Action luaOnRevPacket;
private Action luaStart;
private Action luaUpdate;
protected LuaTable scriptEnv;
public void Awake()
{
if (hasAwake) return;
hasAwake = true;
Init();
if (luaAwake != null) luaAwake();
}
private void Start()
{
if (luaStart != null) luaStart();
}
private void Update()
{
if (luaUpdate != null) luaUpdate();
}
private void FixedUpdate()
{
if (luaFixedUpdate != null) luaFixedUpdate();
}
private void OnEnable()
{
#if UNITY_EDITOR
// 编辑器模式下重新打开UI重新加载脚本便于调试
//Init();
//hasAwake = true;
//if (luaAwake != null)
//{
// luaAwake();
//}
#endif
if (luaOnEnable != null) luaOnEnable();
}
private void OnDisable()
{
if (luaOnDisable != null) luaOnDisable();
}
private void OnDestroy()
{
if (luaOnDestroy != null) luaOnDestroy();
luaOnDestroy = null;
luaUpdate = null;
luaStart = null;
scriptEnv.Dispose();
}
protected virtual void Init()
{
if (luaScript == null)
return;
if (scriptEnv == null)
{
if (LuaMain.luaEnv == null)
{
Debug.LogError("LuaMain._LuaEnv == null");
return;
}
scriptEnv = LuaMain.luaEnv.NewTable();
}
var meta = LuaMain.luaEnv.NewTable();
meta.Set("__index", LuaMain.luaEnv.Global);
scriptEnv.SetMetaTable(meta);
meta.Dispose();
scriptEnv.Set("self", gameObject);
foreach (var injection in injectionGos) scriptEnv.Set(injection.name, injection.value);
var script = LoadAssetBundle.Instance.LoadScriptAsset(luaScript);
LuaMain.luaEnv.DoString(script.text, luaScript, scriptEnv);
luaAwake = scriptEnv.GetInPath<Action>(luaScript + ".Awake");
luaStart = scriptEnv.GetInPath<Action>(luaScript + ".Start");
luaUpdate = scriptEnv.GetInPath<Action>(luaScript + ".Update");
luaFixedUpdate = scriptEnv.GetInPath<Action>(luaScript + ".FixedUpdate");
luaOnEnable = scriptEnv.GetInPath<Action>(luaScript + ".OnEnable");
luaOnDisable = scriptEnv.GetInPath<Action>(luaScript + ".OnDisable");
luaOnDestroy = scriptEnv.GetInPath<Action>(luaScript + ".OnDestroy");
luaOnRevPacket = scriptEnv.GetInPath<Action>(luaScript + ".OnRevPacket");
}
#region interaction
public void OnRevPacket(PacketDistributed packet)
{
if (luaOnRevPacket == null)
return;
scriptEnv.Set("RevPacket", packet);
luaOnRevPacket();
}
public void CloseUI()
{
gameObject.SetActive(false);
}
#endregion
#region lua tool
public static GameObject InstantiateSubItem(GameObject subItemPre, GameObject parent)
{
var newItem = Instantiate(subItemPre);
newItem.transform.SetParent(parent.transform);
newItem.transform.localScale = Vector3.one;
newItem.transform.localPosition = Vector3.zero;
newItem.transform.localRotation = Quaternion.Euler(Vector3.zero);
newItem.SetActive(true);
return newItem;
}
public static void ClearAllChildItem(GameObject parent)
{
var children = new List<Transform>();
for (var i = 0; i < parent.transform.childCount; ++i) children.Add(parent.transform.GetChild(i));
for (var i = 0; i < children.Count; ++i) Destroy(children[i].gameObject);
}
public static Tab_CommonItem GetCommonItem(int itemData)
{
var commonItem = TableManager.GetCommonItemByID(itemData);
return commonItem;
}
public static string GetStrDictionary(int strDictionary)
{
return StrDictionary.GetActDictionaryString("#{" + strDictionary + "}");
}
public static Image GetChildImage(GameObject go, string childName)
{
var childGO = go.transform.Find(childName);
if (string.IsNullOrEmpty(childName)) childGO = go.transform;
return childGO.GetComponent<Image>();
}
public static void SetImage(GameObject go, string childName, string imageName)
{
var image = GetChildImage(go, childName);
LoadAssetBundle.Instance.SetImageSprite(image, imageName);
}
public static void SetItemIcon(GameObject go, string childName, int itemData)
{
var commonItem = TableManager.GetCommonItemByID(itemData);
SetImage(go, childName, commonItem.Icon);
}
public static Text GetChildText(GameObject go, string childName)
{
var childGO = go.transform.Find(childName);
if (string.IsNullOrEmpty(childName)) childGO = go.transform;
return childGO.GetComponent<Text>();
}
public static void SetText(GameObject go, string childName, string textStr)
{
var textGO = GetChildText(go, childName);
textGO.text = textStr;
}
public static Obj_MainPlayer GetPlayerInfo()
{
return Singleton<ObjManager>.GetInstance().MainPlayer;
}
public LuaUIBehaviour GetChildUILua(string childName)
{
var childGO = transform.Find(childName);
if (string.IsNullOrEmpty(childName)) childGO = transform;
return childGO.GetComponent<LuaUIBehaviour>();
}
public static void SetCommonAward(GameObject itemGO, int awardType, int subType, int num)
{
var awardItem = new MarketingActAwardItem();
awardItem.awardType = awardType;
awardItem.awardSubType = subType;
awardItem.awardNum = num;
itemGO.GetComponent<MarketingCommonAward>().InitItem(awardItem);
}
#endregion
#region
public void CallScriptFunc(string funcName)
{
var func = scriptEnv.Get<string, Action>(funcName);
if (func == null)
{
LogModule.ErrorLog("there is no script func name:" + funcName);
return;
}
func();
}
public void CallScriptFuncAtPath(string funcName, params object[] funcParam)
{
var func = scriptEnv.GetInPath<LuaFunction>(funcName);
if (func == null)
{
LogModule.ErrorLog("there is no script func name:" + funcName);
return;
}
func.Call(funcParam);
}
public virtual GameObject GetInjectionObj(string name)
{
if (injectionGos != null)
for (var i = 0; i < injectionGos.Length; ++i)
if (injectionGos[i].name == name)
return injectionGos[i].value;
return null;
}
#endregion
}