Unity+AssetsBundel+XLua+阿里云

Unity热更新的步骤:AssetsBundle打包好资源——上传到服务器——运行项目——检测是否需要更新——1.需要更新2.不需要更新——1.需要更新——从服务器下载资源到本地——本地加载资源包——运行。

一、阿里云

操作完了之后就下载阿里云提供的 .Net SDK,解压后把Aliyun.OSS.dll导入到Unity 的 Plugins 文件夹下,需要把Unity .Net框架改为4.6。

二、XLua

1.配置XLua配置

2.编写脚本

Xlua:

Load.lua

local UnityEngine=CS.UnityEngine
xlua.hotfix(CS.LuaHotfixTest,'OnClickOne',function(self)UnityEngine.Object.Destroy(self.Cube.gameObject)
end)xlua.hotfix(CS.LuaHotfixTest,'OnClickTwo',function(self)UnityEngine.Object.Destroy(self.Sphere.gameObject)
end)

Dispose.lua

xlua.hotfix(CS.Test,'OnClickOne',nil)xlua.hotfix(CS.Test,'OnClickTwo',nil)

C#:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using XLua;[Hotfix] // lua需要热更新的脚本
public class LuaHotfixTest : MonoBehaviour
{/// <summary>/// 方块预制体/// </summary>public Transform Cube;/// <summary>/// 圆球预制体/// </summary>public Transform Sphere;/// <summary>/// 按钮1/// </summary>public Button BtnOne;/// <summary>/// 按钮2/// </summary>public Button BtnTwo;// Use this for initializationvoid Start(){BtnOne.onClick.AddListener(OnClickOne);BtnTwo.onClick.AddListener(OnClickTwo);}// Update is called once per framevoid Update(){}/// <summary>/// 按钮一点击方法/// </summary>[LuaCallCSharp]private void OnClickOne(){}/// <summary>/// 按钮二点击方法/// </summary>[LuaCallCSharp]private void OnClickTwo(){}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Aliyun.OSS;
using Aliyun.OSS.Common;
using UnityEngine;/// <summary>
/// 下载 最新 Lua 文件
/// </summary>
public class DownLoadLua : MonoBehaviour {string filePath;string savePath;Thread thread;Action GetObjectSuccessCallback;OssClient ossClient;// Start is called before the first frame updatevoid Start(){ossClient = new OssClient(Config.EndPoint, Config.AccessKeyId, Config.AccessKeySecret);}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space)){GetObjectByThread(() =>{Debug.Log("下载成功");},"luascript.assetsbundle",@"F:\GaoSaiFi\UnityTools\XLua\xLua-master\Assets\StreamingAssets\luascript.assetsbundle");}}/// <summary>/// /// </summary>/// <param name="action"></param>/// <param name="filePath">阿里云上传的文件名+后缀</param>/// <param name="savePath">下载之后保存的路径</param>public void GetObjectByThread(Action action, string filePath, string savePath){this.GetObjectSuccessCallback = action;this.filePath = filePath;this.savePath = savePath;thread = new Thread(GetObject);thread.Start();}void GetObject(){try{OssObject result = ossClient.GetObject(Config.Bucket, filePath);using (var resultStream = result.Content){using (var fs = File.Open(savePath, FileMode.OpenOrCreate)){int length = (int)resultStream.Length;byte[] bytes = new byte[length];do{length = resultStream.Read(bytes, 0, length);fs.Write(bytes, 0, length);} while (length != 0);this.GetObjectSuccessCallback();}}}catch (OssException e){print("下载文件出错:" + e);}catch (Exception e){print("下载文件出错:" + e);}finally{thread.Abort();this.GetObjectSuccessCallback = null;}}}
public class Config
{public const string AccessKeyId = "填写自己的AccessKeyId";public const string AccessKeySecret = "填写自己的AccessKeySecret";public const string EndPoint = "oss-cn-beijing.aliyuncs.com";public const string Bucket = "文件夹-gf-test-0";}

using System.Collections;
using UnityEngine;
using XLua;/// <summary>
/// 加载下载好的 Lua 文件
/// </summary>
public class LoadLua : MonoBehaviour
{private LuaEnv _luaEnv;/// <summary>/// AB包/// </summary>private AssetBundle ab;/// <summary>/// 加载Lua文件并执行/// </summary>private void Awake(){_luaEnv = new LuaEnv();StartCoroutine(LoadABPackage6("Load"));}/// <summary>/// 释放lua方法/// </summary>private void OnDisable(){StartCoroutine(LoadABPackage6("Dispose"));}/// <summary>/// 释放Lua虚拟机/// </summary>private void OnDestroy(){_luaEnv.Dispose();}IEnumerator LoadABPackage6(string fileName){AssetBundle obj = AssetBundle.LoadFromFile(@"F:\GaoSaiFi\UnityTools\XLua\xLua-master\Assets\StreamingAssets\luascript.assetsbundle"); //加载我们的AB包TextAsset ta = obj.LoadAsset(fileName + ".lua.txt") as TextAsset;yield return 1;_luaEnv.DoString(ta.text);}
}

三、AsstesBundle

Editor文件夹下添加脚本

using UnityEditor;
using System.IO;
using UnityEngine;public class LoadAB
{private static readonly string AbPath = Application.streamingAssetsPath;[MenuItem("Tools/CreateAB")]static void CreateAbPack(){BuildPipeline.BuildAssetBundles(AbPath, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneWindows64);AssetDatabase.Refresh();}
}

把打包出来的文件上传阿里云即可。

Unity+XLua+阿里云热更代码相关推荐

  1. Unity Xlua之Hotfix热补丁 (一)

    Unity Xlua之Hotfix热补丁 (一) 一.第一个热补丁 想要打热补丁的类前需要加上[Hotfix]特性 第一次打热补丁需要加上宏HOTFIX_ENABLE 点击生成代码 点击注入热补丁 例 ...

  2. 阿里云热修复sophix详解

    现在网上有几种常用的app热修复技术,个人感觉阿里云热修复操作比较简单,主要几个步骤,创建app---下载sdk---集成(AS和eclipse)---生成补丁---发布补丁(可以本地调试).下面详细 ...

  3. 阿里云上克隆代码的两种方法

    阿里云上克隆代码的两种方法 Https:在git Bash里直接输入git clone +https地址,便可以把代码克隆到本地了: SSH:要配置SSH Key: a. 首先检查c盘User-> ...

  4. 阿里云code下载代码和更新代码

    1- 本地新建一个文件夹,进入文件夹下面右击打开git 2- Git init初始化一个.git文件夹 3- Git clone git@code.aliyun.com:username/space- ...

  5. Unity接入 阿里云OSS 腾讯云Cos的SDK,实现上传文件功能

    概念 Bucket(存储空间):Bucket是用户用来管理所存储Object的存储空间.每个用户可以拥有多个Bucket.Bucket的名称在OSS的范围内必须是全局唯一的,一旦创建之后无法修改名称. ...

  6. 我在阿里云做前端代码智能化

    作为一个整天以代码为伴的码农,避免不了会接触到各种代码提示工具,但是呢,用久了之后会发现他们都有个共同点,那就是 模型巨大,动辄几百兆:并且模型大必然需要更多的计算,同样会导致电脑内存占用高,风扇呼呼 ...

  7. 通过API访问阿里云效Codeup代码库,检查某个文件是否存在更新并下载的方法,顺带介绍一下阿里云OpenAPI

    需求 家里有个NAS,每日定时执行脚本. 脚本在其他电脑上编写,并用git进行版本管理,git托管为Codeup(阿里云效)上创建的私有代码库. 现在需求是,每次执行前,从Codeup上检查脚本是否更 ...

  8. 微信头像下载并上传到阿里云OSS,PHP文件上传到阿里云OSS简单代码(OSS文件上传,微信头像下载,CURL下载文件,微信头像链接过期)

    (就这么个小事,有多少公司多少项目没做到!!) 微信公众号项目,后端获取到授权用户的微信头像后,要自行下载保存,不下载的话,微信返回的头像链接会在一段时间后过期,无法访问! 下面是我写的两个简单实用方 ...

  9. 使用Git命令行推送代码到远程仓库,阿里云效Codeup代码管理平台

    项目提交暂存.提交本地仓库.拉取.推送: [本步骤是新项目流程]请自行根据自有项目分辨是否需要跳过前两步. 右键点击项目根文件夹,选中Git Bash Here,打开命令行. (1)初始化项目命令: ...

最新文章

  1. 利用Maven搭建Spring开发环境 【转】
  2. js表单验证控制代码大全
  3. java proxy
  4. linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md
  5. java中break和return的区别_java 中return和break的区别
  6. 不加入域不能访问域资源
  7. LeetCode-Minimum Path Sum[dp]
  8. logstash multiline
  9. fzu 2037 Maximum Value Problem
  10. HTML5: HTML5 Geolocation(地理定位)
  11. educoder 1-1Python 计算思维训练——公式编程
  12. 接口测试平台代码实现15:基于生态考虑的菜单重构+意见反馈功能设计
  13. 开环控制系统与闭环控制系统
  14. python使用h5py写h5文件,写入tuple元组类型
  15. age estimation阅读整理(一)
  16. 蓝牙耳机通话降噪哪个效果好?目前降噪效果最好的耳机推荐
  17. java实现单一登录 踢人效果
  18. 通用 OCR API 接口
  19. Kubernetes资源调度之污点与Pod容忍度
  20. java: 非法字符: ‘\ufeff‘解决方法

热门文章

  1. 计算机系统基础-缓冲区溢出攻击
  2. Spring 面试题(二)
  3. “一张车票,万般无奈”上网购票频频崩溃!12306再次排队等待中...还是技术惹的祸....
  4. SEO优化:输出优质原创文章
  5. ASP.NET——CodeBehind 引起的遐思
  6. Unity EventTrigger
  7. VC 比拼 Delphi(1)!
  8. return的使用方法
  9. 使用wol远程唤醒linux主机,动手实现Ubuntu系统WOL远程唤醒
  10. IIS中实现HTTPS的自动跳转