LUA基础学习第四天

与C#交互

Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”。

交互的机制 (主要是lua调用C#)需要引入LuaInterface命名空间,c#调用lua,使用其中的函数和变量
1.反射机制

2.非反射机制
主要是warp
3.类型的对应
lua number string boolean nill table function
c# double string bool null LuaTable LuaFunction
在这里插入图片描述

注意在uLua/Editor下的WrapFile脚本里添加类型,并更新Source/LuaWrap里的文件
在这里插入图片描述

并在uLua/Lua/System/Global.lua下添加
在这里插入图片描述
using System.Collections;
using LuaInterface;
public class GameFacade : MonoBehaviour {
void Start()
{
CShapTolua()
}
加载Lua代码这一块,可以直接赋一段Lua代码字符串,也可以指定一个Lua脚本文件。
为了热更新,应当采用第二种加载方法,即创建一个Lua脚本文件。由于Unity不支持扩展名为lua的文件,所以可将Lua脚本扩展名定为txt(纯文本文件),并用unity的TextAsset列表负责记录所有脚本文件。
建议列表中给每个脚本搭配一个string类型的ID,这样凭此ID即可加载正确的lua脚本;
另外在LuaState类中新增一个String类型的public成员,赋值为该ID。这样一旦某个Lua脚本在运行时报错,可根据输出的ID值判断是哪个Lua脚本有错误。

c#调用LUA

  public void CShapTolua()
  {
     LuaState  lua = new LuaState()     --lua虚拟机/状态机
     string luaScript = @"    --字符串处理lua脚本
             num=10
             tab = {key1 =1,key2 =2}
             function LuaFunc(n) 
                print(n)
                return 1,'2',3
             end
             print('hello world')  ";
   lua.DoString(luaScript);      --使用lua虚拟机执行lua脚本
   lua["num"] =20;                   --获取变量,修改变量
   lua["name"] ="落海无情";    --创建变量
   LuaTable tab = lua.GetTable("tab")     --获取lua中的表
   Debug.log( tab["key1"])                       --获取表中的键
   lua.NewTable("newTab")   --创建新的表(在lua环境中,未修改字符串
   LuaTable newTab = lua.GetTable("newTab”)
   newTab["newKey1"] =1;    --创建新的键
   LuaFunction func = lua.GetFunction("LuaFunc");  --获取lua中的函数
   object[]  res = func.Call(10)   --传参数
   for(int i =0;i< res.Length;i++)
   { Debug.Log(res[i]); }
   --将成员方法注册到lua环境
   --lua中函数的名称
   --c#持有该方法的对象
   --通过反射获取c#方法中的信息
   lua.RegisterFunction("LuaSimleFunc",this,GetType().GetMethod("SimpleMethod") )
   lua.DoString("LuaSimpleFunc()");
   --注册静态方法到lua环境
   lua.RegisterFunction("LuaStaticFunc",null,typeof(GameFacade).GetMethod("Staticmethod"))
   lua.DoString("LuaStaticFunc()");
  }

LUA调用C#

  public void LuaToCShap()
  {    //反射机制
     //LuaState lua = new LuaState();
     //luastate.dofile  要是用文件的绝对路径
     //string filePath = Application.dataPath + "/Scripts/lua2.lua";
     //lua.Dofile(filePadth);

     //非反射机制
     LuaScriptMgr lua = new LuaScriptMgr()
     //在lua环境中完成unity的环境搭建,可以直接使用wrap类
     lua.Start();
     lua.DoFile("MyLua");     //注意路径相对路径  ulua/Lua下
     lua.GetLuaFunction("MyLua.Init").Call();
     _c = lua.GetLuaFunction("Updatee")
  }
   LuaFunction  _c;
   private void Update()
   {  _c.Call(Time.DeltaTime)
   }

   public void SimpleMethod()
   {
        Debug.Log("成员方法");
   }
   public static void StaticMethod()
   {
       Debug.Log("静态方法");
   }

反射机制

   lua2.lua                                  -------    反射机制
   print(“ccc”)
   --获取lua中的类
   --加载DLL程序集

   //预处理
   luanet.load_assembly("Assembly-CSharp")
   luanet.load_assembly('UnityEngine')       
   Vector2 = luanet.import_type('UnityEngine.Vector2')
   Vector3 = luanet.import_type('UnityEngine.Vector3')
   GameObject = luanet.import_type('UnityEngine.GameObject')
   luanet.import_type('System.Collections.Generic.List')
   Debug = luanet.import_type('UnityEngine.Debug')
   //

   luanet.load_assemly("UnityEngine")                          --加载DLL程序集
   --获取GameObject类
   GameObject = luanet.import_type("UnityEngine.GameObject")   --获取类型
   go = GameObject("NewObje")
   --加载粒子的程序集
   ParticleSystem = luanet.import_type("UnityEngine.ParticleSystem")
   go:AddComponent(luanet.ctype(ParticleSystem))
   --获取类,调用静态方法
   GameFacade = luanet.import_type("GameFacade")               --获取自定义的类
   GameFacade.StaticMethod()
   --查找游戏对象,获取组件,调用成员方法
   obj = GameObject.Find("GameObject")                         --对象名称
   gf = obj:GetComponent("GameFacade")                         --脚本名称
   gf:SimpleMehod()
   }

非反射机制

   MyLua.lua                         -------   非反射机制
   MyLua ={}
   local this = MyLua
   function MyLua.Init()
      this.go = GameObject("NewObj")
      this.go:AddComponent(ParticleSystem.GetClassType())
      camera = GameObject.Find("Main Camera")
      this.go.transform:SetParent(camera.transform)
   --获取Button游戏组件
   btn = GameObject.Find("Button“”)
	-- 执行Button.onClick:AddListener()      --方法1
	-- UIEventListener
	-- btn.onClick:AddListener(function (  )
	-- 	print("Click Click Click")
	-- end)

   UIEventlisterMake.Get(btn).onClick             --方法2
		= function ( go )
         print(go.name)
   end

   function MyLua.Updatee( deltaTime )
	--print(deltaTime)
	-- this.go.transform:Rotate(
	-- 	Vector3.up * 30 * deltaTime)
   end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值