- A+
Unity提供了一个很好的Assetbundle给我们,可以存放图片文本等资源。当然的,也可以存放dll文件(后缀改成.bytes),这样就可以通过加载AssetBundle里面的dll在通过反射技术来实现代码的热更新。但是反射慢,同时也不支持到ios平台,所有这里使用的ToLua,不是运行时反射机制,而是一种事先准备好的机制,就是说白了就是把Unity的类变成lua的(猜的),然后就能在lua中使用了
这里不会说ToLua的使用方法(可能以后会写),这里其他说多的是思想,还有平常的加载和运行
一、首先看看,我准备了一个这样的场景结构
通过热更新,来控制按钮的图片,通过热更新的代码来修改按钮的文字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; using LuaInterface; public class LoadImageAndRegister : MonoBehaviour { public string url = "file://F:/testAsset/";//假装是远程目录 void Awake(){ StartCoroutine (Load()); } IEnumerator Load(){ using(WWW www = new WWW(url+"1.txt")){ yield return www; //版本对不上,进行下载,不然加载本地 using(WWW www2 = WWW.LoadFromCacheOrDownload(url+"1.assetbundle",Int32.Parse(www.text))){ yield return www2; AssetBundle asset = www2.assetBundle; //获取图片,更改按钮的资源 Sprite sprite = asset.LoadAsset<Sprite>("1"); Image img = GameObject.Find ("Button").GetComponent<Image> (); img.sprite = sprite; //加载代码 运行lua代码 TextAsset luaString = asset.LoadAsset<TextAsset> ("1Lua"); LuaState lua = new LuaState (); lua.Start(); LuaBinder.Bind (lua); lua.DoString (luaString.text); lua.CheckTop (); lua.Dispose (); asset.Unload (false); } } } } |
其实代码很简单,主要要搞懂的是怎么样热更新和加载更改还有运行代码。首先,代码通过加载一个文本文件,获取文本的内容(资源的版本号,要更新资源时人工修改),通过这个版本号,去用LoadFromCacheOrDownload()去下载目标AssetBundle,加载过的版本号,会加载本地的,而不是下载,因为有缓存。
这个时候,想一想就通了,程序这样设定后,如果想要改变资源,只要把远程服务端的AssetBundle换掉,在修改一下文本文件里面的版本号,这样就会自动更新资源了,而不需要更换游戏包
二、看一下假装是远程目录的结构
三、再来说一下代码,这里面通过两个WWW获取到资源后,就是AssetBundle。首先获取一个Sprite图片精灵,修改按钮的图片背景。再获取一个文本文件,其实是Lua代码,注意的是Unity不认识.lua后缀哈,所有使用.txt后缀,再通过ToLua的LuaState去运行这个文本文件里面的lua代码,看看lua代码
1 2 3 4 5 |
--修改按钮显示的文本 GameObject = UnityEngine.GameObject TextUI = GameObject.Find("Text"):GetComponent(typeof(UnityEngine.UI.Text)) TextUI.text = "hw不好,换成这个" |
也是很简单的代码,通过GameObject的静态方法Find()找到Text,可以上去看看场景结构。再通过实例方法获取到组件Text,修改Text的属性text(就是按钮上的文字)。注意的是这里用到了UnityEngine.UI.Text,ToLua默认是没有包装到lua环境中的。所以需要在配置中加上去,修改文件
ToLua的还是不多说了
四、最后看看效果,先运行一遍,再将资源换点,版本号换掉
中间是原样
好啦,热更新逻辑(按钮的文字修改),热更新资源(图片),其实也没那么神奇哈