从服务器上下载lua
我们先把Lua文件夹中的这两个Lua文本放在服务器上www文件夹中,然后把本地的这个两Lua文本删除
然后新建游戏场景,Load
将Load和Game场景添加在BuildSettings中
然后进入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不管用,这是因为标签打的有问题,官方给了一个方式方式二
我们在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文件夹拷贝到服务器上。
修改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)
注意:预制体名称要和查找物体的名称一致,否则可能找不到该物体
然后运行之前打包好的文件。功能正常!xlua热更内容结束。