本文主要是介绍游戏热更新(XLua)专题四(XLua),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
插件下载:https://github.com/Tencent/xlua
- 01_Helloworld: 快速入门的例子。
- 02_U3DScripting: 展示怎么用lua来写MonoBehaviour。
- 03_UIEvent: 展示怎么用lua来写UI逻辑。
- 04_LuaObjectOrented: 展示lua面向对象和C#的配合。
- 05_NoGc: 展示怎么去避免值类型的GC。
- 06_Coroutine: 展示lua协程怎么和Unity协程相配合。
- 07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。
- 08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。
- 09_GenericMethod: 泛化函数支持的演示。
- 10_SignatureLoader: 展示如何读取经数字签名的lua脚本,参见数字签名的文档介绍。
- 11_RawObject: 当C#参数是object时,如何把一个lua number指定以boxing后的int传递过去。
- 12_ReImplementInLua: 展示如何将复杂值类型改为lua实现
目录
一、HelloWorld
二、U3DScripting
一、HelloWorld
using UnityEngine;
using XLua;public class Helloworld : MonoBehaviour
{// Use this for initializationvoid Start(){//创建一个Lua运行的环境,可以去执行我们的lua代码LuaEnv luaenv = new LuaEnv();//打印luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");//销毁我的执行环境luaenv.Dispose();}
}
二、U3DScripting
1.Cube(LuaBehaviour):
Injections是一个Injection类型的数组
Size:是数组的长度
lightObject是数组里面的元素
Name:依赖注入(每一个name对应一个物体,lua脚本只要用这个Name既可以找到物体)(例如有一个物体身上有灯组件:①Name: A, ②把物体拖进Value ③通过A:GetCompent(typeof(CS.UnityEngine.Light))获取)
Value::把物体拖进去
LuaBehavior:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using XLua;
using System;[System.Serializable]
public class Injection
{public string name;public GameObject value;
}[LuaCallCSharp]
public class LuaBehaviour : MonoBehaviour
{public TextAsset luaScript;public Injection[] injections;internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!internal static float lastGCTime = 0;internal const float GCInterval = 1;//1 second private Action luaStart;private Action luaUpdate;private Action luaOnDestroy;//lua中有表类型,而C#中没有表类型,LuaTable和Lua中的表相对应,后续实现转换private LuaTable scriptEnv;void Awake(){scriptEnv = luaEnv.NewTable();//为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突LuaTable meta = luaEnv.NewTable();//元表 对lua数据结构(表)进行功能上的扩充//"__add"\"__sub"\"_mul.....";meta.Set("__index", luaEnv.Global);scriptEnv.SetMetaTable(meta);meta.Dispose();scriptEnv.Set("self", this);foreach (var injection in injections){scriptEnv.Set(injection.name, injection.value);}luaEnv.DoString(luaScript.text, "LuaBehaviour", scriptEnv);Action luaAwake = scriptEnv.Get<Action>("awake");scriptEnv.Get("start", out luaStart);scriptEnv.Get("update", out luaUpdate);scriptEnv.Get("ondestroy", out luaOnDestroy);if (luaAwake != null){luaAwake();}}// Use this for initializationvoid Start(){if (luaStart != null){luaStart();}}// Update is called once per framevoid Update(){if (luaUpdate != null){luaUpdate();}if (Time.time - LuaBehaviour.lastGCTime > GCInterval){luaEnv.Tick();LuaBehaviour.lastGCTime = Time.time;}}void OnDestroy(){if (luaOnDestroy != null){luaOnDestroy();}luaOnDestroy = null;luaUpdate = null;luaStart = null;scriptEnv.Dispose();injections = null;}
}
LuaTestScripts:
local speed = 10
local lightCpnt = nilfunction start()print("lua start...")print("injected object", lightObject)--找到lightObject,获取它身上的Light组件lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))
endfunction update()local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed--让cube旋转self.transform:Rotate(r)--改变light的颜色lightCpnt.color = CS.UnityEngine.Color(CS.UnityEngine.Mathf.Sin(CS.UnityEngine.Time.time) / 2 + 0.5, 0, 0, 1)
endfunction ondestroy()print("lua destroy")
end
2.LuaCallCSharp
①新建一个脚本Test.cs
using XLua;[LuaCallCSharp]
public class Test
{public int index;public int Add(int a, int b){return a + b;}
}
②新建一个luaTest.lua.txt(在文件夹修改后缀)
function start()--找到C#脚本local Test=CS.Test--实例化local test=Test()--属性赋值test.index=66print("index"..test.index)--调用方法print("打印返回值"..test.Add(test,1,4))//冒号与点的区别,点,要把对象传进去,冒号则不需要print("打印返回值"..test:Add(1,4))
end
这篇关于游戏热更新(XLua)专题四(XLua)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!