说明:
本篇文章使用的是ULua中的SimpleFramework_UGUI-0.4.1,根据其中的一下Example学习之后自己处理的,很简单,随便学习一下。
简单介绍一下lua与Unity相结合,并做到热更新UI图片的使用,主要有如下几点:
- Lua脚本内容
- 服务器下载lua脚本,并解析内容
- 热更新图片
Lua脚本内容:
PicName="Test2.jpg"
PicURL="http://drb.boss1388.com/DrB_Android/Important/Test1.jpg"
return PicName,PicURL
其中PicName——获取图片名称,用于之后方便查找并添加;PicURL——获取存于服务器地址上的图片 服务器下载lua脚本,并解析内容:
/// <summary>
/// 下载Lua文件
/// </summary>
/// <returns></returns>
IEnumerator wait_LoadFile()
{
WWW www = new WWW("http://drb.boss1388.com/DrB_Android/Important/NewLua.lua");
yield return www;
if (www.isDone)
{
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//lua文件保存的路径
string FilePath = Application.persistentDataPath + "/NewLua.lua";
//以文件方式输入lua文件
File.WriteAllBytes(FilePath, www.bytes);
if (File.Exists(FilePath))
{
//解析lua文件
LuaState luastate = new LuaState();
var t = luastate.DoFile(FilePath);
PicName = t[0].ToString();
PicURL = t[1].ToString();
//向UI上添加图片
StartCoroutine(wait_LoadTexture(PicName));
}
}
}
}
热更新图片:
/// <summary>
/// 更新图片
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
IEnumerator wait_LoadTexture(string Path)
{
//判断本地是否存在图片,存在直接加载,不存在从服务器下载新的图片
if (File.Exists("file://" + Application.persistentDataPath + "/" + Path))
{
WWW www = new WWW("file://" + Application.persistentDataPath + "/" + Path);
yield return www;
if (www.isDone)
{
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//获取添加的图片
var t = www.texture;
//将加载的图片Texture转换为Sprite类型
var spr = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero);
//向UI添加图片
ShowTexture.GetComponent<Image>().sprite = spr;
}
}
}
else
{
WWW www = new WWW(PicURL);
yield return www;
if (www.isDone)
{
if (www.error ==null)
{
//将图片保存到本地
File.WriteAllBytes(Application.persistentDataPath + "/" + PicName,www.bytes);
var t = www.texture;
var spr = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero);
ShowTexture.GetComponent<Image>().sprite = spr;
}
}
}
}
总的代码展示:
using UnityEngine;
using System.Collections;
using LuaInterface;
using UnityEngine.UI;
using System.IO;
public class LuaTest : MonoBehaviour
{
public GameObject ShowTexture;
string PicName;
string PicURL;
void Start()
{
StartCoroutine(wait_LoadFile());
}
/// <summary>
/// 更新图片
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
IEnumerator wait_LoadTexture(string Path)
{
//判断本地是否存在图片,存在直接加载,不存在从服务器下载新的图片
if (File.Exists("file://" + Application.persistentDataPath + "/" + Path))
{
WWW www = new WWW("file://" + Application.persistentDataPath + "/" + Path);
yield return www;
if (www.isDone)
{
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//获取添加的图片
var t = www.texture;
//将加载的图片Texture转换为Sprite类型
var spr = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero);
//向UI添加图片
ShowTexture.GetComponent<Image>().sprite = spr;
}
}
}
else
{
WWW www = new WWW(PicURL);
yield return www;
if (www.isDone)
{
if (www.error ==null)
{
//将图片保存到本地
File.WriteAllBytes(Application.persistentDataPath + "/" + PicName,www.bytes);
var t = www.texture;
var spr = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero);
ShowTexture.GetComponent<Image>().sprite = spr;
}
}
}
}
/// <summary>
/// 下载Lua文件
/// </summary>
/// <returns></returns>
IEnumerator wait_LoadFile()
{
WWW www = new WWW("http://drb.boss1388.com/DrB_Android/Important/NewLua.lua");
yield return www;
if (www.isDone)
{
if (www.error != null)
{
Debug.Log(www.error);
}
else
{
//lua文件保存的路径
string FilePath = Application.persistentDataPath + "/NewLua.lua";
//以文件方式输入lua文件
File.WriteAllBytes(FilePath, www.bytes);
if (File.Exists(FilePath))
{
//解析lua文件
LuaState luastate = new LuaState();
var t = luastate.DoFile(FilePath);
PicName = t[0].ToString();
PicURL = t[1].ToString();
//向UI上添加图片
StartCoroutine(wait_LoadTexture(PicName));
}
}
}
}
}
Unity中设置:
服务器上存放情况:
总结:
只是简单的应用了Ulua中的点点知识,其中的内容可自行修改