unity + GameFramework + XLua XLua和C#中的函数互调
- Lua调用C#
- 静态方法在lua中用 . 来调用
c#代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using XLua;
using System;
using UnityGameFramework.Runtime;
using GameFramework.Resource;
using UnityEngine.Events;
namespace XXX
{
[LuaCallCSharp]
public class LuaUtility
{
[CSharpCallLua]
//调用可以传入string的lua函数的代理
public delegate void LuaFuncWithStrDelegate(string b);
[CSharpCallLua]
public delegate void LuaFuncWithObjectDelegate(System.Object b);
//获取一个lua函数,参数为string
public static LuaFuncWithStrDelegate GetLuaFuncWithStrDelegate(LuaTable scriptEnv,string funcName){
return scriptEnv.Get<LuaFuncWithStrDelegate>(funcName);
}
public static void LoadAsset(String assetName,LuaFuncWithObjectDelegate scallback,LuaFuncWithStrDelegate fcallback){
GameEntry.Resource.LoadAsset(assetName, typeof (Sprite),
new LoadAssetCallbacks(
(assetName, asset, duration, userData) => { scallback(asset);},
(assetName, status, errorMessage, userData) =>
{
fcallback(errorMessage);
}));
}
public static void LoadPrefabAsset(String assetName,LuaFuncWithObjectDelegate scallback,LuaFuncWithStrDelegate fcallback){
GameEntry.Resource.LoadAsset(assetName, typeof (GameObject),
new LoadAssetCallbacks(
(assetName, asset, duration, userData) => { scallback(asset);},
(assetName, status, errorMessage, userData) =>
{
fcallback(errorMessage);
}));
}
}
}
lua中调用
CS.XXX.LuaUtility.LoadAsset(assetName,function(asset)
self.img.sprite = asset
end,function (errorMessage)
Log("LoadAssetFailureCallback..."..errorMessage)
end)
- 对象中的方法用 :来调用
-
self.backBtn = gotransform:Find("BackBtn"):GetComponent("Button") self.backBtn.onClick:AddListener(Handler(self,self._BackClick))
2c#调用xlua的方法
- 首先必须是全局方法,因为在C#中会单独开个table,所以每个lua加载进来都是新的
- 加载带参数的lua方法,需要在C#中定义一个代理类似LuaUtility.LuaFuncWithStrDelegate
--lua 代码 local BaseCtrl = class("BaseCtrl") function BaseCtrl:ctor(param) end function BaseCtrl:OnInit(param) end function BaseCtrl:OnOpen(param) end function BaseCtrl:OnUpdate(param) end function BaseCtrl:OnClose(param) end function BaseCtrl:OnDestroy(param) end function OnInit(param) BaseCtrl:OnInit(param) end function OnOpen(param) BaseCtrl:OnOpen(param) end function OnUpdate(param) BaseCtrl:OnUpdate(param) end function OnClose(param) BaseCtrl:OnClose(param) end function OnDestroy(param) BaseCtrl:OnDestroy(param) end return BaseCtrl
c#代码
void Awake()
{
luaEnv = XLuaManager.Instance.GetLuaEnv();
scriptEnv = luaEnv.NewTable();
// 为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突
LuaTable meta = luaEnv.NewTable();
meta.Set("__index", luaEnv.Global);
scriptEnv.SetMetaTable(meta);
meta.Dispose();
/** 特别注意这个go对象,只在当前的scriptEnv这个lua的table中存在,
lua代码中再加载的lua代码,都找不到这个 go 对象 **/
scriptEnv.Set("go", this);
// scriptEnv.Set("self", this);//防止和lua框架中self重复,用 go 对象来定义
foreach (var injection in injections)
{
scriptEnv.Set(injection.name, injection.value);
}
// Debug.LogWarning("Awake " +luaScript.text);
/** 注意参数scriptEnv,这样加载的lua会在一个新的table中,lua代码中require的lua会在luaEnv中 **/
luaEnv.DoString(luaScript.text, "LuaTestScript", scriptEnv);
Action luaAwake = scriptEnv.Get<Action>("awake");
//获取可以传入String的lua方法
luaInit = LuaUtility.GetLuaFuncWithStrDelegate(scriptEnv,"OnInit");
luaOpen = LuaUtility.GetLuaFuncWithStrDelegate(scriptEnv,"OnOpen");
luaUpdate = LuaUtility.GetLuaFuncWithStrDelegate(scriptEnv,"OnUpdate");
luaOnClose = LuaUtility.GetLuaFuncWithStrDelegate(scriptEnv,"OnClose");
luaOnDestroy = LuaUtility.GetLuaFuncWithStrDelegate(scriptEnv,"OnDestroy");
if (luaAwake != null)
{
luaAwake();
}
}