从服务器上下载lua

我们先把Lua文件夹中的这两个Lua文本放在服务器上www文件夹中,然后把本地的这个两Lua文本删除

Unity Pro XL的PID调节_junit


Unity Pro XL的PID调节_junit_02


然后新建游戏场景,Load

将Load和Game场景添加在BuildSettings中

Unity Pro XL的PID调节_unity_03


然后进入Load场景,新建脚本LoadLua.cs

输入一下代码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
public class LoadLua : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(LoadL());
    }
    IEnumerator LoadL()
    {
        //下载lua文本
        UnityWebRequest request = UnityWebRequest.Get(@"http://服务器IP/" + "Test.lua.txt");
        yield return request.SendWebRequest();
        string str = request.downloadHandler.text.ToString();
        //存入本地
        File.WriteAllText(@"H:\xiangmu\Txt\Assets\Lua\Test.lua.txt",str);
        //下载lua文本
        UnityWebRequest request2 = UnityWebRequest.Get(@"http://服务器IP/" + "LuaDispose.lua.txt");
        yield return request2.SendWebRequest();
        string str2 = request2.downloadHandler.text.ToString();
        //存入本地
        File.WriteAllText(@"H:\xiangmu\Txt\Assets\Lua\LuaDispose.lua.txt", str2);
        SceneManager.LoadScene(1);//跳转场景
    }
}

然后重新注入和生成,运行场景,场景自动跳转,lua文本已经下载下来,并且功能正常!

解决打包出来的热更问题

我们将工程打包出来后发现,热更功能并没有效果按S和U不管用,这是因为标签打的有问题,官方给了一个方式方式二

Unity Pro XL的PID调节_单元测试_04


我们在Editor目录下,新建脚本HotfixCfg,输入一下代码

using XLua;
using System.Collections.Generic;
using System;
//如果涉及到Assembly-CSharp.dll之外的其它dll,如下代码需要放到Editor目录
public static class HotfixCfg
{
    [Hotfix]
    public static List<Type> by_field = new List<Type>()
    {
    	//需要热更的类
        typeof(Load),
        typeof(Cube)
    };
}

保存文件,重新生成注入,打包运行。打包出来的热更功能又可以使用了!

实现代码热更和资源热更

现在可以视为已经将游戏开发完成并发布了,现在我们想改两个需求

需求一,将按S键起跳的功能改成按W
需求二,再增加一个模型

需求一:
我们只需要找到服务器上的Test.lua.txt文本,将原来的S改为W

xlua.hotfix(CS.Cube,'Update',function(self)
    if(UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.W)) then
        self.rigidbody:AddForce(UnityEngine.Vector3.up*200);
    end
end)

需求二:

我们在unity场景中再建一个Capsule游戏物体,然后拖成预制体添加rigidbody组件添加Cube.cs,然后这只ab包的路径和后缀,将原来工程根目录下的AssetBundles文件夹删除,在unity里重新生成。将生成好的AssetBundles文件夹拷贝到服务器上。

Unity Pro XL的PID调节_lua_05


修改Test.lua.txt文本文件

xlua.hotfix(CS.Load,'Start',function(self)
      self.hot:LoadResource('Capsule','gameobject\\capsule.unity3d')
      self.hot:LoadResource('Sphere','gameobject\\sphere.unity3d')
end)

xlua.hotfix(CS.Load,'Update',function(self)
    if(UnityEngine.Input.GetKeyDown(UnityEngine.KeyCode.K)) then
        UnityEngine.Object.Instantiate(self.hot:GetPrefab('Sphere'))--生成物体在游戏场景中
         UnityEngine.Object.Instantiate(self.hot:GetPrefab('Capsule'))--生成物体在游戏场景中
    end

end)

注意:预制体名称要和查找物体的名称一致,否则可能找不到该物体

Unity Pro XL的PID调节_junit_06


然后运行之前打包好的文件。功能正常!xlua热更内容结束。