yukamu 发表于 2021-8-13 12:22

c#调用XLua

项目结束,目前无事,家中老人甚是思念,已经思考准备回京,不准备继续留沪了,也坚持到项目结束了,虽然还没上线,不过该做的也都做了,百善孝为先,架不住老人连续一年多的思念,准备离职了,点开到这个公司的第一篇文档,思绪万千,想起当年还在实习的时候,写的C#连接XLUA的文档,发出来玩玩,
using System;
using System.IO;
using UnityEngine;
using XLua;
using System.Text;

public class GameStart : MonoBehaviour
{
    //更改可识别文件后缀文件后缀,这样文件的后缀名就可以直接写成.lua,不必写成.txt了
    byte[] CustomLoader(ref string fileName)
    {
      fileName = fileName.Replace(".", "/");
      string luapath = Application.dataPath + "/LuaSource/" + fileName + ".lua";
      string strLuaContent = File.ReadAllText(luapath);
      byte[] result = Encoding.UTF8.GetBytes(strLuaContent);
      return result;
    }

    public LuaEnv luaEnv;
    private LuaTable scriptEnv;

    private Action luaStart;
    private Action luaUpdate;
    private Action<Collider> luaOnTriggerEnter; //触发
    private Action<Collision> luaOnCollisionEnter;//碰撞
    private Action luaOnDestroy;

    internal static float lastGCTime = 0;
    internal const float GCInterval = 1;

    void Awake()
    {
      luaEnv = new LuaEnv();
      scriptEnv = luaEnv.NewTable();
      LuaTable meta = luaEnv.NewTable();
      meta.Set("__index", luaEnv.Global);
      scriptEnv.SetMetaTable(meta);
      meta.Dispose();
      scriptEnv.Set("self", this);

      luaEnv.AddLoader(CustomLoader);
      luaEnv.AddBuildin("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson); //读取json
      luaEnv.DoString("require('main')", "GameStart", scriptEnv);

      scriptEnv.Get("Start", out luaStart);
      scriptEnv.Get("Update", out luaUpdate);
      scriptEnv.Get("OnTriggerEnter", out luaOnTriggerEnter); //触发
      scriptEnv.Get("OnCollisionEnter", out luaOnCollisionEnter); //碰撞
      scriptEnv.Get("OnDestroy", out luaOnDestroy);

    }

    void Start()
    {
      if (luaStart != null)
      {
            luaStart();
      }
    }

    void Update()
    {
      try
      {
            if (luaUpdate != null)
      {
            luaUpdate();
      }
      if (Time.time - GameStart.lastGCTime > GCInterval)
      {
            luaEnv.Tick();
            GameStart.lastGCTime = Time.time;
      }
      }
      catch
      {
         // print("已经没怪了");
      }
    }

    private void OnTriggerEnter(Collider other)
    {
      if (luaOnTriggerEnter != null)
      {
            luaOnTriggerEnter(other);
      }
    }

    private void OnCollisionEnter(Collision collision)
    {
      if (luaOnCollisionEnter != null)
      {
            luaOnCollisionEnter(collision);
      }
    }

    private void OnDestroy()
    {
      if (luaOnDestroy != null)
      {
            luaOnDestroy();
      }
      luaOnCollisionEnter = null;
      luaOnTriggerEnter = null;
      luaUpdate = null;
      luaStart = null;
      luaOnDestroy = null;
      scriptEnv.Dispose();
    }
}
页: [1]
查看完整版本: c#调用XLua