从服务器端获取资源动态加载到场景

上传人:第*** 文档编号:32743438 上传时间:2018-02-12 格式:DOCX 页数:44 大小:425.02KB
返回 下载 相关 举报
从服务器端获取资源动态加载到场景_第1页
第1页 / 共44页
从服务器端获取资源动态加载到场景_第2页
第2页 / 共44页
从服务器端获取资源动态加载到场景_第3页
第3页 / 共44页
从服务器端获取资源动态加载到场景_第4页
第4页 / 共44页
从服务器端获取资源动态加载到场景_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《从服务器端获取资源动态加载到场景》由会员分享,可在线阅读,更多相关《从服务器端获取资源动态加载到场景(44页珍藏版)》请在金锄头文库上搜索。

1、unity3d从服务器端获取资源动态加载到场景分类: 编程语言/ C 语言/ 文章 我们的游戏制作完发布出去提供给玩家,为了给玩家带来更好的游戏体验,要做各种的优化以及设计,首先,游戏资源的加载就是一个非常重要的方面(尤其是网页游戏)。由于我们的游戏资源比较大,不能一下全部加载出来,如果是这样,可能会造成玩家长时间的等待。所以我们应该采取动态加载的方式,让玩家在玩游戏的过程中来一点一点从服务器加载游戏资源。要实现这样的效果,首先就必须要制作用于一点点加载的游戏资源。(注:本文只是谈及这些游戏资源的制作和下载,关于游戏运行中的动态加载不做讨论)(再注:本文涉及到的代码都是以 C#语言来编写的)开

2、发环境:Windows 7Unity3D 3.5.1f2本文中将会涉及到以下的内容:1、 UnityEditor 命名空间2、 Editor 模式下窗口制作3、 导出功能的具体实现4、 资源的下载5、 下载后使用1、 UnityEditor 命名空间这个命名空间下的类是在 Unity 的编辑模式下使用的,我们可以用它来制作各种小工具来辅助开发,提高开发效率。这里的所有的类都不能在 Unity 的运行时里使用。只能在编辑器下使用,并且在使用他们的时候还必须要放到项目 Project 视图下的 Editor 文件夹中。需要注意一点的就是,我们的项目代码里如果有使用到 UnityEditor 命名空

3、间时,在项目的最后编译是不能通过的,必须要移除他们。我们来看一个我们即将使用到的一个 Attribute:MenuItem 是 UnityEditor 命名空间下的一个属性标志,它可以定义出一个菜单条目,并添加在 Unity 编辑器的菜单栏中,语法:csharp view plaincopy 1. MenuItem(“Tools/Export”) 我们来新建一个工程看一下效果(具体创建步骤这里真的不说了)(注:我的项目中加了很多装饰性的东西,这里就不一一说明怎么实现了哈)完成之后,先在 Project 下创建 Editor 文件夹并创建一个脚本文件,输入以下内容:csharp view pla

4、incopy 1. using UnityEditor; 2. using UnityEngine; 3. using System.Collections; 4.5. / 6. / author : qyxls 7. / 8. public class ExportTools : MonoBehaviour 9. 10.MenuItem(Tools/Export) 11.static void Execute () 12. 13.Debug.Log(Menu is selected !); 14. 15. 当我们点击菜单栏上的对应菜单选项:ToolsExport 时,菜单项会调用静态的 Ex

5、ecute()方法,即可在 Console 面板中打印出”Menu is selected”。这里要注意两点:1、 引入 UnityEditor 命名空间。2、 MenuItem 要调用的方法需要是 static 的。关于 UnityEditor 的更多详细内容,请参照官方文档,这里不做重点讲解。2、Editor 模式下窗口制作要制作一个小工具,提供出一个友好界面是很有必要的。UnityEditor 下的类可以很方便的完成这一需求。我们通过这些类,可以实现各种不同的控件:怎么样,还算丰富吧?这些控件的具体实现我不想说,请自行查看 API 吧。这里我还是遵循本文的主旨,围绕本文的中心思想(本文我

6、们是要导出资源到服务器,并在游戏中下载这个资源过来使用)实现一个界面。用例描述:导出场景中的一个模型,并带着默认材质,如果该模型有多个可替换的贴图,也把这些贴图作为该模型的资源一并导出到一个资源包中。按照这个需求,我猜想界面应该是这样的:一个导出模型的口,一个提供可选贴图数量的口,根据用户输入的可选数量,给提供出对应的贴图导出口,最后填写完毕之后有一个按钮用于导出交互。,不好意思,这哪里是猜想,我其实早就写好了。其实也没骗你了,我在写之前是猜想的!要实现上面这个窗口,我该怎么做呢?首先,定义一个继承 EditorWindow 的类,然后,重写 OnGUI 方法即可。我们这里在之前的代码基础上做

7、修改添加:csharp view plaincopy 1. using UnityEditor; 2. using UnityEngine; 3.4. / 5. / author : qyxls 6. / 7. 关闭关闭public class ExportTools : color:#ff0000;EditorWindow 8. 9. MenuItem(Tools/Export) 10.static void Execute () 11. 12./ 实例化一个 Window 窗口 / 13.ExportTools windows = EditorWindow.GetWindow(true,

8、Export Tools); 14. 15.16.void OnGUI() 17. 18.19. 20. 这里要注意的就是将原来的脚本有继承自 MonoBehaviour 修改为继承自 EditorWindow。并在 Execute ()方法中对当前的 Window 实例化。这时我们就可以得到一个 Window 窗口了:其次,就是向我们生成的窗口中添加不同的控件,这些控件的生成都是在 OnGUI()方法中实现的。和 MonoBehaviour 的 OnGUI 方法一样,EditorWindow 的 OnGUI()方法也主要是处理UI 的,我们关于 UI 控件的生成处理都要写在这个方法里。OnG

9、UI()这个方法每帧调用好几次(每个事件一次),所以一些逻辑处理要避免在这里调用。csharp view plaincopy 1. private string savePath; 2. private GameObject exportObject; 3. private int optionalCount = 0; 4. private Texture2D optionalTexture = new Texture2D0; 5.6. void OnGUI() 7. 8. /* 9. * ObjectField: 10.* 是这里的第一个控件,它可以允许用户拖拽将一个 Object 的对象赋

10、给它。 11.* 如果要限制可接收的对象类型,可以通过第三个参数来限制类型这里表示直接收GameObject 类型 12.* 第四个 bool 型的参数标志能否接受当前 scene 里的对象, true 表示接受 13.* 这个方法返回的是一个 Object 类型的值,最后要将它转化为需要的类型 14.*/ 15.exportObject = EditorGUILayout.ObjectField(Export Object, exportObject, 16.typeof(GameObject), true) 17.as GameObject; 18./ 就相当于提供一个换行,用于格式化控件

11、的 / 19.EditorGUILayout.Space(); 20./ IntField:该控件只能输入 int 类型的值/ 21.optionalCount = EditorGUILayout.IntField(Optional Count, optionalCount); 22.for(int i=0; iwhite-space:pre private void ExportAndSave(GameObject go) 2. 3. /该方法将打开保存对话框,选择导出文件的保存位置/ 4. savePath = EditorUtility.SaveFilePanel(Save, E:, g

12、o.name, unity3d); 5. Export(go, savePath); 6. 7.8. private void Export(GameObject go, string filePath) 9. 10./ IsPersistent 判断传入的对象是磁盘文件还是 场景文件(即是否是 Project 视图下的文件,是返回 true)/ 11.if(!EditorUtility.IsPersistent(go) 12. 13.GameObject tmp = GameObject.Instantiate(go) as GameObject; 14.go = GetPrefab(tmp

13、, go.name) as GameObject; 15. 16.Object asset = optionalTexture; 17.if(File.Exists(filePath) File.Delete(filePath); 18./* 19.BuildPipeline.BuildAssetBundle():该方法是将提供的对象导出成 Unity 能识别的二进制文件 20.第一个参数是提供一个要导出的对象,第二个参数是一个 Object类型,它可以将数据附加到第一个 21.参数定义的主数据一起整体导出.但是这两个参数要求必须是磁盘文件的格式,所以上面的 if 语句判断 22.是否是磁盘文

14、件类型,如果不是,先将其转化为 prefab,在 Assets 下临时保存一下。这个转化就是要 23.用到 PrefabUtility 类里的方法。 24.*/ 25.BuildPipeline.BuildAssetBundle(go, asset, filePath, BuildAssetBundleOptions.CollectDependencies, BuildTarget.StandaloneWindows); 26./ 将暂时生成的 prefab 文件使用完后删除 / 27.AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(g

15、o); 28. 29.30./ 31./ 该方法来产生临时 prefab 文件 32./ 33.private Object GetPrefab(GameObject go, string name) 34. 35.Object result = PrefabUtility.CreateEmptyPrefab(Assets/ + name + .prefab); 36.result = PrefabUtility.ReplacePrefab(go, result); 37.Object.DestroyImmediate(go); 38.return result; 39. 这里我又新添加了三个

16、方法来具体实现导出并保存的逻辑: private voidExportAndSave(GameObject go):在这个方法里只要关注一下怎么打开一个保存对话框就可以了csharp view plaincopy 1. /该方法将打开保存对话框,选择导出文件的保存位置。第二和第三个参数表示默认保存位置和默认文件名/ 2. savePath =EditorUtility.SaveFilePanel(Save, E:, go.name,unity3d); private void Export(GameObjectgo, string filePath)这个方法具体实现了导出二进制文件的功能。这里需要说明的是 Build

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号