在Unity3D中加载外部图片的两种方法
2015-11-15 16:40
573 查看
喜闻乐见的WWW方式
喜闻乐见的WWW方式之所以喜闻乐见,这是因为这是我们最为熟悉的一种,我们都知道通过WWW可以从网络上加载文本、图片、音频等形式的内容,那么通过WWW能否加载本地外部(相对于应用程序)资源呢?答案是肯定的,这是因为WWW可以支持http和file两种协议。我们通常接触到的WWW默认都是指http协议,现在我们来说说file协议,该协议可以用来访问本地资源(绝对路径)。例如我们希望加载文件D:\TestFile\pic001.png这个文件,则此时对应的C#脚本为:1 2 3 4 5 6 7 8 9 | //请求WWW WWW www = new WWW("file://D:\\TestFile\\pic001.png); yield return www; if(www != null && string.IsNullOrEmpty(www.error)) { //获取Texture Texture texture=www.texture; //更多操作... } |
亘古不变的传统IO方式
好了,下面我们隆重推出亘古不变的传统IO方式,这种方式相信大家都没有接触过,所以这里将这种方法和大家分享。既然是传统的IO方式,那么无非就是各种IO流的处理啦。好,我们一起来看下面这段代码:1 2 3 4 5 6 7 8 910 | //创建文件读取流 FileStream fileStream = new FileStream(screen, FileMode.Open, FileAccess.Read); fileStream.Seek(0, SeekOrigin.Begin); //创建文件长度缓冲区 byte[] bytes = new byte[fileStream.Length]; //读取文件 fileStream.Read(bytes, 0, (int)fileStream.Length); //释放文件读取流 fileStream.Close(); fileStream.Dispose(); fileStream = null; //创建Texture int width=800; int height=640; Texture2D texture = new Texture2D(width, height); texture.LoadImage(bytes); |
到目前为止我们解决了如何从外部加载图片到Unity3D中,现在我们回到最开始的问题,我们从外部读取到这些图片以后需要将它们加载到游戏界面中。比如当我们使用UGUI的时候,UGUI中的Image控件需要一个Sprite来作为它的填充内容,那么此时我们就需要将Texture转化为Sprite.号了,下面我们给出一个简单的例子:
1 2 3 4 5 6 7 8 910 | using UnityEngine; using System.Collections; using UnityEngine.UI; using System.IO; public class TestLoading : MonoBehaviour { /// <summary> /// Image控件 /// </summary> private Image image; void Start () { image = this.transform.Find("Image").GetComponent<Image>(); //为不同的按钮绑定不同的事件 this.transform.Find("LoadByWWW").GetComponent<Button>().onClick.AddListener ( delegate(){LoadByWWW();} ); this.transform.Find("LoadByIO").GetComponent<Button>().onClick.AddListener ( delegate(){LoadByIO();} ); } /// <summary> /// 以IO方式进行加载 /// </summary> private void LoadByIO() { double startTime = (double)Time.time; //创建文件读取流 FileStream fileStream = new FileStream("D:\\test.jpg", FileMode.Open, FileAccess.Read); fileStream.Seek(0, SeekOrigin.Begin); //创建文件长度缓冲区 byte[] bytes = new byte[fileStream.Length]; //读取文件 fileStream.Read(bytes, 0, (int)fileStream.Length); //释放文件读取流 fileStream.Close(); fileStream.Dispose(); fileStream = null; //创建Texture int width = 300; int height = 372; Texture2D texture = new Texture2D(width, height); texture.LoadImage(bytes); //创建Sprite Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); image.sprite = sprite; startTime=(double)Time.time-startTime; Debug.Log("IO加载用时:" + startTime); } /// <summary> /// 以WWW方式进行加载 /// </summary> private void LoadByWWW() { StartCoroutine(Load()); } IEnumerator Load() { double startTime = (double)Time.time; //请求WWW WWW www = new WWW("file://D:\\test.jpg"); yield return www; if(www != null && string.IsNullOrEmpty(www.error)) { //获取Texture Texture2D texture=www.texture; //创建Sprite Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); image.sprite = sprite; startTime = (double)Time.time - startTime; Debug.Log("WWW加载用时:" + startTime); } } } |
相关文章推荐
- Unity3D 有限状态机(一)
- Unity中用到的C#补充(三)-字符串
- Unity3D 委托和事件的优点(一)
- 【笨木头Unity】入门之旅008:Demo之四处找死(三)_触发器
- UnityEditor中新建一个窗口,在Hierarchy中点击一个GameObject时,窗口中就显示相应的GameObject名称和Position
- 002-unity 资源及资源类型 srt字幕文件
- Unity4、Unity5移动平台多线程渲染在部分安卓手机上会造成闪退
- 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)
- 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)
- Unity中用到的C#补充(二)-面向对象
- Unity3D播放视频
- [Unity热更新]lua基础(四)
- Unity3D屏幕模糊Sharder
- unity 在移动平台中,文件操作路径详解
- Unity Android加密dll
- Unity3D内置运行函数
- Unity中用到的C#补充(一)-C#基础
- 在unity3D里建立leap motion API的过程
- [Unity热更新]lua基础(三)
- unity Instantiate后立刻SetActive(false)会执行的方法