【xLua】xLua热更新简单实现

前言:

Unity 2017.3.0p1

xLua v2.1.9

一.导入xLua

新建项目,将xLua的Assets下的四个文件文件拷贝到项目中的Assets

还需将xLua的Asset同级目录下的Tools也拷贝到项目中

二.配置

在File--Build Settings--Player Settings--Other Settings--Configuration的Scripting Define Symbols添加HOTFIX_ENABLE

三.用NetBox开启一个服务器

NetBox可以快速地开启一个服务器,放在哪个目录则在哪里开启服务器

链接:https://pan.baidu.com/s/1hOVXoB2oZJ3VbPaS_lWHbw 
提取码:kjc6 

现在将Lua脚本和NetBox都放在F盘根目录

 

开启的服务器地址默认是localhost,但如果默认端口无法访问,则可以查看本地端口

现在服务器地址就是http://localhost:59311/

四.新建场景和脚本

Loading场景用于加载资源,LoadResources脚本挂在Loading场景的一个空物体上

Main场景是主场景,Mian脚本挂在Mian场景的一个空物体上
Mian场景在放置一个Text控件,用于显示版本号

LoadResources脚本

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class LoadResources : MonoBehaviour {

    //服务器资源地址
    string url = @"http://localhost:59311//HotfixTest.lua.txt";
    //下载地址
    string path;


    void Start () {
        path = Application.persistentDataPath + "/HotfixTest.lua.txt";

        StartCoroutine(Load());
    }
    
    IEnumerator Load()
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        //如果服务器有相应的资源,则能下载成功
        if (!request.isHttpError)
        {
            string str = request.downloadHandler.text;
            File.WriteAllText(path, str);

            print("下载完成");
        }
        else
        {
            print("跳过更新");
        }

        //跳转到Main场景
        UnityEngine.SceneManagement.SceneManager.LoadScene("Main");
    }

}

Main脚本

需要在类前加上Hotfix

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using XLua;

[Hotfix]
public class Main : MonoBehaviour {

    public Text versionText;

    LuaEnv luaEnv;
    //本地资源地址
    string path;

    void Start()
    {
        path = Application.persistentDataPath + "/HotfixTest.lua.txt";

        luaEnv = new LuaEnv();
        luaEnv.AddLoader(myLoader);

        if (File.Exists(path))
            luaEnv.DoString("require 'HotfixTest'");

        ShowVersion();
    }


    //加载本地文件
    private byte[] myLoader(ref string filePath)
    {
        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
    }

    private void ShowVersion()
    {
     
    }

    private void OnDestroy()
    {
        luaEnv.Dispose();
    }
}

HotfixTest.lua.txt

xlua.hotfix(CS.Main,'ShowVersion',function(self)
	self.versionText.text='V2.0.0'
end)

五.运行

在Unity中点击XLua--Generate Code

出现finished!

在点击XLua--Hotfix Inject In Editor

出现had injected! hotfix inject finish!

则表示成功了

现在如果服务器不放lua脚本,控制台上输出跳过更新,text显示不变

现在如果服务器放上lua脚本,控制台上输出下载完成,text显示V2.0.0

 

现在如果又想更新资源,更新lua脚本

xlua.hotfix(CS.Main,'ShowVersion',function(self)
	self.versionText.text='V3.0.0'
end)

重新运行

热更新完成

 


xLua官网

官方FAQ

 

 

版权声明:本文为weixin_38211198原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38211198/article/details/89930568

智能推荐

DC-8靶机教程

多喝热水:http://hackergu.com/ 一、主机发现 ​ 使用netdiscover,发现主机IP为192.168.203.134。 二、端口扫描 ​ 目标开放22端口和80端口,web站点是一个DrupalCMS的站点,版本为7。 三、漏洞利用 ​ 我们访问此站点: ​ 关注点为两个红框,如果点击上面那个红框的内容,url显示为: ​ 倘若点击的是下面的红框,则url显示为: ​ 看...

Android VIEW简单绘图

画布canvas 提供两个构造函数: Canvas():创建一个空的Canvas对象 Canvas(Bitmap bitmap):创建一个以bitmap位图为背景的Canvas 常用的Canvas方法: void drawBitmap(Bitmap bitmap,float left,float top,Paint paint):在指定坐标绘制位图 void drawLine(float star...

数据去重的各种方法汇总(三)

Pandas去重DataFrame 接上篇,这篇就剩最后的用Pandas对DataFrame里面的数据去重,这里也有两种方法,可以直接看官方文档(但是掌柜觉得其实就是一种方法,因为第一种只是显示哪些重复。。。): 使用duplicated方法,它会返回一个布尔向量,其长度为行数,表示行是否重复,但是并不会删除重复数据。来看实例: 然后会得到这样一个表格: 现在使用duplicated方法: 会得到...

Linux环境下RabbitMQ消息队列的安装和配置

一、什么是RabbitMQ? RabbitMQ就是一个在AMQP基础上实现的企业级消息系统,简单的说,就是一个消息队列系统。具体的介绍,可以网上去搜!目前只介绍RabbitMQ在Linux系统的安装。 二、RabbitMQ的安装 1、 RabbitMQ是基于Erlang开发,所以使用之前必须安装Erlang语言开发包。 wget http://www.erlang.org/download/otp...

train_test_split切分数据集工具

顾名思义,这是一个切分训练集与测试集的工具   如果我们不使用,而是手动进行划分,要么进行简单的操作——划去前80%为训练集,后20%为测试集,这样会带来很多的问题,因为这样做,我们切出来的会让训练集和测试集的分布很不一致,我们可以看一下简单粗暴方法切出来的分布图: 红色的训练集,蓝色是测试集(点击图片放大可以看得很清楚,直接看博客好像图片模糊)   然...

猜你喜欢

shell编程第一节 和shell

shell编程看的博客感觉写的挺好的:http://www.cnblogs.com/dongying/p/6262935.html 以及  https://www.cnblogs.com/clsn/p/8028337.html#auto_id_0 简单总结:shell编程就是对一堆Linux命令的逻辑化处理。 chmod +x hello_world.sh ./hello_world.s...

微信开发:js sdk 分享(java)

今天记录一下微信jssdk 的分享给朋友的功能,获取config接口注入。 1.需要绑定域名(注意:设置js安全域名的时候,需要设置微信ip白名单,ip白名单新出来的,非白名单内的ip无法获取access_token 更无法获取jsapi) 在设置js 安全域名在 设置–>公众号设置–>功能设置里边 appid appSercret 在开发–>...

js--HTML美术馆

前言 因为之前库房合作的时候交给我一个任务,就是在点击某一项物品的时候显示出几张相印的小图片,然后点击小图片之后显示出一张大图片,因为当时还没有接触JavaScript,所以这方面的知识不是很了解,一直拖着,大概有两天吧,是在是解决不了,于是将这个任务交给了老付和建华,今天在学习JavaScript的时候突然之后就看到了有这么一项功能,于是就有感而发。 内容 首先向大家展示代码。 这部分是HTML...

Jenkins持续集成环境部署(入门篇)

为什么要持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 价值: 1、减少风险 一天中进行多次的集成,并做了相应的测试,有利于检查缺陷,了解软件的健康状况,减少假定。 2、减少重复过程 节省时间、费用和工作量,通过自动化的持...

linux 下rabbitmq的安装以及设置远程用户访问

安装过程中会有提示,一路输入“y”即可。 完成后安装RabbitMQ: 3.自己建个文件夹 进行下载安装也可  直接执行也可 先下载rpm: 完成后启动服务: 可以查看服务状态: 这里可以看到log文件的位置,转到文件位置,打开文件: 这里显示的是没有找到配置文件,我们可以自己创建这个文件 编辑内容如下: 这里的意思是开放使用,rabbitmq默认创建的用户gue...