Files
JJBB/Assets/Project/Script/LuaScripts/UI/LuaUIBehaviour.cs
2024-08-23 15:49:34 +08:00

272 lines
7.2 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.

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
}