热更新分类
第一种方案:
1.项目开发中,可以将部分逻辑提取到一个单独的代码工程中,打包为DLL
2.将DLL打包为AssetBundle
3.Unity程序动态加载AssetBundle中的DLL文件,使用Reflection机制来调用代码
第二种方案:
lua插件。在Unity环境内嵌一个lua虚拟机,经常变动的和对执行效率没要求的逻辑用Lua实现,游戏启动时加载服务器上最新的lua字节码来执行游戏。
=========================================================================
Xlua使用方法:
1.去xlua的github库,(腾讯的),下载下来
2.把下载下来的Assets下面的文件拖到unity里面。
导入成功之后可以看到菜单栏多了一个xlua
3.就可以直接使用啦。
基本上github上都有XLua的教程文档。
=========================================================================
Unity调用Lua之Hello World:记住lua的txt文件一定要放在Resources文件夹下面。
LoadLua.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class LoadLua : MonoBehaviour {
private LuaEnv luaenv;
void Start () {
luaenv = new LuaEnv();
//luaenv.DoString("print('Hello NiuDaLi')");
luaenv.DoString("require 'LoadLua'");
luaenv.Dispose();
}
void Update () {
}
private void OnDestroy()
{
}
}
LoadLua.lua.txt
print('Hello Ran')
效果就是控制台会输出Hello Ran。
=========================================================================
其实关于XLua就两部分
第一部分是CS调用Lua代码,第二部分是Lua调用CS代码
1.CS调用Lua:
CsCallLua.cs:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class CsCallLua : MonoBehaviour
{
void Start()
{
var luaenv = new XLua.LuaEnv();
luaenv.DoString("require 'CsCallLua'");
//var nn = luaenv.Global.Get<int>("nn");
//var age = luaenv.Global.Get<int>("age");
//var isHS = luaenv.Global.Get<bool>("isHandsome");
//print(nn);
//print(age);
//print(isHS);
//1 table映射class
//Teather t = luaenv.Global.Get<Teather>("teather");
//t.age = 16;
//print(t.name);
//luaenv.DoString("print(teather.age)");
//print(t.age);
//2 table to interface
//ITeather t = luaenv.Global.Get<ITeather>("teather");
//print(t.name + "-Interface");
//t.age = 16;
//luaenv.DoString("print(teather.age)");
//print(t.age);
//3 dic、list
//Dictionary<string, object> dic = luaenv.Global.Get<Dictionary<string, object>>("teather");
//foreach (var item in dic)
//{
// print(item.Key + ":"+item.Value);
//}
//List<object> list = luaenv.Global.Get<List<object>>("teather");
//foreach (var item in list)
//{
// print(item + ":List" );
//}
//4 luatable
//LuaTable t = luaenv.Global.Get<LuaTable>("teather");
//print(t.Get<string>("name")+"-LuaTable");
//5 delegate
//Action ac = luaenv.Global.Get<Action>("add");
//ac();
//ac = null;
// Add ac = luaenv.Global.Get<Add>("add");
// int v;
//print( ac(22,99,out v)+":"+ v);
// ac = null;
//6 luafuncion
LuaFunction fun = luaenv.Global.Get<LuaFunction>("add");
object[] val = fun.Call(7,7);
foreach (var item in val)
{
print(item);
}
luaenv.Dispose();
}
[CSharpCallLua]
delegate int Add(int a, int b,out int value);
class Teather
{
public string name;
public int age;
public bool isHandsome;
}
[CSharpCallLua]
interface ITeather
{
string name { get; set; }
int age { get; set; }
}
void Update()
{
}
}
CsCallLua.lua.txt:
nn = "Ran"
age = 18
isHandsome = true
teather = {
name = "Ran然",age = 18, isHandsome = true,3,2,1,2,
}
function add(a,b)
print(a+b)
return a+b,66
end
=========================================================================
2.Lua调用CS
LuaCallCS.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LuaCallCS : MonoBehaviour {
// Use this for initialization
void Start () {
var luaenv = new XLua.LuaEnv();
luaenv.DoString("require 'CsCallLua'");
luaenv.Dispose();
}
// Update is called once per frame
void Update () {
}
}
LuaCallCS.lua.txt:
--实例化
CS.UnityEngine.GameObject("ran")
print(CS.UnityEngine.Time.deltaTime)
local go = CS.UnityEngine.GameObject
local light = go.Find("Directional Light");
light.name = "light"
=========================================================================
总结:总而言之Xlua热更新很好用,就是跳过了商店,直接在应用上下载更新资源。
如果你是ios开发,那么如果你要从商店更新的话,首先用户会觉得麻烦,你会流失客户。其次,苹果管的很严,会有周期审核,这就导致你的更新很慢(●'◡'●)
所以用XLua就好了。
当然了这个只是简单的基础XLua的教学,更高深的请自行百度吧hhh