找回密码
 立即注册
查看: 297|回复: 0

xLua基础

[复制链接]
发表于 2021-8-11 22:11 | 显示全部楼层 |阅读模式
1.什么是热更新

热:就是刚出炉
简单来说就是当游戏某个功能出现bug,或者修改了某个功能,或者增加了某个功能的时候,我们不需要重新下载安装安装包,就可以更新游戏内容。
热更新的好处:不用浪费流量重新下载,不用通过商店审核更加快速,不用重新安装玩家可以更快体验到更新的内容

目前比较受欢迎的热更新方案:uLua tolua xLua

2.主菜:“xLua”

xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。
  2016年12月末,xLua刚刚实现新的突破:全平台支持用Lua修复C#代码bug。
  目前Unity下的Lua热更新方案大多都是要求要热更新的部分一开始就要用Lua语言实现,不足之处在于:
1、接入成本高,有的项目已经用C#写完了,这时要接入需要把需要热更的地方用Lua重新实现;
2、即使一开始就接入了,也存在同时用两种语言开发难度较大的问题;
3、Lua性能不如C#;
  xLua热补丁技术支持在运行时把一个C#实现(函数,操作符,属性,事件,或者整个类)替换成Lua实现,意味着你可以:
1、平时用C#开发;
2、运行也是C#,性能秒杀Lua;
3、有bug的地方下发个Lua脚本fix了,下次整体更新时可以把Lua的实现换回正确的C#实现,更新时甚至可以做到不重启游戏;
  这个新特性iOS,Android,Window,Mac都测试通过了,目前在做一些易用性优化。

3.xLua学习

3.1Lua文件加载

a):执行字符串。
  1.     private LuaEnv env;
  2.         // Use this for initialization
  3.         void Start () {
  4.         env = new LuaEnv();
  5.         //在C#中调用Lua代码。
  6.         env.DoString("print('Hello World')");
  7.         //在lua中调用c#代码,要以CS开头,包括完整的类和方法名。
  8.         env.DoString("CS.UnityEngine.Debug.Log('Hello world')");
  9.         }
  10.     private void OnDestory() {
  11.         env.Dispose();
  12.     }
复制代码
b):加载Lua文件。
利用Resources.load加载TextAsset文件,Lua代码要放到Resources目录下。
  1. (一)以加载文件的方式,加载lua代码。文件要以.lua.txt结尾。
复制代码
  1.   TextAsset ta = Resources.Load<TextAsset>("helloWorld.lua");
复制代码
  1.         print(ta);
  2.         LuaEnv env = new LuaEnv();
  3.         env.DoString(ta.ToString());
复制代码
(二)应用一个内置的loader加载
  1. env.DoString("require 'helloWorld'");
复制代码
(三)自定义loader加载lua
  1. LuaEnv env = new LuaEnv();
  2.         //增加一个loader,参数为自定义的loader.
  3.         env.AddLoader(MyLoader);
  4.         //依次使用多个loader(先查找自定义的,再查找默认的)查找文件。
  5.         env.DoString("require 'filepath'");
  6.         env.Dispose();
  7. //自定义的MyLoader,参数为require 指定的"filepath"文件名。filepath"文件名。
  8.     private byte[] MyLoader(ref string filepath) {
  9.         print(filepath);
  10.         string commond = "print('1111')";
  11.         return System.Text.Encoding.UTF8.GetBytes(commond);
  12.     }
复制代码
c):c#访问Lua
(一):获取全局属性。
  1. LuaEnv env = new LuaEnv();
  2. env.DoString("require 'calltolua'");
  3.             //要等加载完成之后,读取变量。
  4.             //类型要统一,变量名要一致。
  5.             //float a =  env.Global.Get<float>("a");
  6.             //print(a);
  7.             //string str = env.Global.Get<string>("str");
  8.             //print(str);
  9.             //bool flag = env.Global.Get<bool>("flag");
  10.             //print(flag);
复制代码
(二):获取Table表。
//通过Class映射。
  1. [/code][code]比较耗费性能。
  2.             //Person people = env.Global.Get<Person>("person");
  3.             //print("name is  " + people.name + "age is " + people.age);
  4.             //env.Dispose();
复制代码
  1. class Person {
  2.         public string name;//属性的参数名,类型要与lua中的一致。
  3.         public  int age;
  4.     }
复制代码
//通过Interface映射。
  1. //IPerson Iperson = env.Global.Get<IPerson>("person");
  2.             //print("name is  " + Iperson.name + "age is " + Iperson.age);
  3.             接口类型的可以改变Lua中的值,类则不行,只能通过映射,获取lua中的值。
  4.             //Iperson.name = "hahahah";
  5.             //print("name111 is  " + Iperson.name + "age is " + Iperson.age);
  6.             //Iperson.method(33,33);
  7. [CSharpCallLua]//interface一定要加[CSharpCallLua]特性。
  8.     interface IPerson {
  9.         //类型要一致,属性名,方法名也要一模一样。
  10.          string name { get; set; }
  11.          int age { get; set; }
  12.          void method(int a, int b);
  13.     }
复制代码
//通过Dictory,List,LuaTable映射
  1. //Dictory<>:只能映射键值对类型的,没有key的不能映射。
  2.             //Dictionary<string, object> dic = env.Global.Get<Dictionary<string, object>>("person");
  3.             //foreach(string item in dic.Keys){
  4.             //    print(item + "is" + dic[item]);
  5.             //}
  6.             List<>:只能映射没有key的list,但是不能映射键值对。
  7.             //List<object> list = env.Global.Get<List<object>>("person");
  8.             //foreach(object o in list){
  9.             //    print("value is" + o);
  10.             //}
  11.             //
  12.             //LuaTable luaTable = env.Global.Get<LuaTable>("person");
  13.             //print("name is" + luaTable.Get<string>("name"));
  14.             //print("age is " + luaTable.Get<int>("age"));
复制代码
(三):访问全局function
//delegate获取
  1. //delegate获取
  2.             //1.系统定义的委托Action.
  3.             //Action add = env.Global.Get<Action>("Add");//"Add"要与lua中定义的方法名一致,参数,返回值也要一致。
复制代码
  1.             //add();
  2.             //add = null;
  3.             //2.自定义的委托
  4.             //int a, b;
  5.             //Add add = env.Global.Get<Add>("Add");
  6.             //int result = add(33,44,out a,out b);//
复制代码
  1.             //Lua可以有多个返回值,c#可以用out,ref接收。
  2.             [CSharpCallLua]
  3.             delegate int Add(int a,int b,out int a1,out int b1);
复制代码
  1.             //print("result " + result);
  2.             //print("a:" + a + " b:" + b);
  3.             //add = null;
复制代码
//luafunction获取lua.
  1. //luafunction获取。
  2.         LuaFunction func = env.Global.Get<LuaFunction>("Add");
  3.         object[] obs = func.Call(22,44);//call设置参数,返回值为object[]类型
  4.         foreach(object item in obs){
  5.             print(item.ToString());
  6.         }
复制代码
3.2 Lua调用c#.

new C#对象

var newGameObj = new UnityEngine.GameObject();
对应到Lua是这样:
local newGameObj = CS.UnityEngine.GameObject()

访问C#静态属性,方法

读静态属性
CS.UnityEngine.Time.deltaTime
写静态属性
CS.UnityEngine.Time.timeScale = 0.5
调用静态方法
CS.UnityEngine.GameObject.Find('helloworld')

小技巧:如果需要经常访问的类,可以先用局部变量引用后访问,除了减少敲代码的时间,还能提高性能:
local GameObject = CS.UnityEngine.GameObject
GameObject.Find('helloworld')
访问C#成员属性,方法
  1. --成员变量,成员方法:new出来的对象,通过对象调用的,变量或者方法。
  2. go = CS.UnityEngine.GameObject.Find("Main Camera") --不能有分号。
  3. --local camera = go.GetComponent(go,"Camera") 成员方法第一个变量要传游戏对象本身。
  4. local camera = go:GetComponent("Camera") --或者用对象:(冒号)方法,的模式调用。
  5. CS.UnityEngine.GameObject.Destroy(camera)
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 07:55 , Processed in 0.088877 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表