XLua和C#中的函数互调 unity + GameFramework + XLua 

unity + GameFramework + XLua  XLua和C#中的函数互调

  1. 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();
            }

        }

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值