Unity游戏运行资源的制作与下载

我们的游戏制作完发布出去提供给玩家,为了给玩家带来更好的游戏体验,要做各种的优化以及设计,首先,游戏资源的加载就是一个非常重要的方面(尤其是网页游戏)。由于我们的游戏资源比较大,不能一下全部加载出来,如果是这样,可能会造成玩家长时间的等待。所以我们应该采取动态加载的方式,让玩家在玩游戏的过程中来一点一点从服务器加载游戏资源。要实现这样的效果,首先就必须要制作用于一点点加载的游戏资源。

(注:本文只是谈及这些游戏资源的制作和下载,关于游戏运行中的动态加载不做讨论)

(再注:本文涉及到的代码都是以C#语言来编写的)

 

开发环境:

Windows 7

Unity3D 3.5.1f2

 

本文中将会涉及到以下的内容:

1、  UnityEditor命名空间

2、  Editor模式下窗口制作

3、 导出功能的具体实现

4、 资源的下载

5、 下载后使用

 

1、 UnityEditor命名空间

这个命名空间下的类是在Unity的编辑模式下使用的,我们可以用它来制作各种小工具来辅助开发,提高开发效率。这里的所有的类都不能在Unity的运行时里使用。只能在编辑器下使用,并且在使用他们的时候还必须要放到项目Project视图下的Editor文件夹中。需要注意一点的就是,我们的项目代码里如果有使用到UnityEditor命名空间时,在项目的最后编译是不能通过的,必须要移除他们。

我们来看一个我们即将使用到的一个Attribute:

MenuItem是UnityEditor命名空间下的一个属性标志,它可以定义出一个菜单条目,并添加在Unity编辑器的菜单栏中,语法:

[MenuItem(“Tools/Export”)]

我们来新建一个工程看一下效果(具体创建步骤这里真的不说了)

(注:我的项目中加了很多装饰性的东西,这里就不一一说明怎么实现了哈)

完成之后,先在Project下创建Editor文件夹并创建一个脚本文件,输入以下内容:


using UnityEditor;
using UnityEngine;
using System.Collections;

/// <summary>
/// author : qyxls
/// </summary>
public class ExportTools : MonoBehaviour 
{
	[MenuItem("Tools/Export")]
	static void Execute () 
	{
		Debug.Log("Menu is selected !!");
	}
}
当我们点击菜单栏上的对应菜单选项:ToolsàExport时,

菜单项会调用静态的Execute()方法,即可在Console面板中打印出”Menu is selected”。


这里要注意两点:

1、 引入UnityEditor命名空间。

2、 MenuItem要调用的方法需要是static的。

关于UnityEditor的更多详细内容,请参照官方文档,这里不做重点讲解。

 

2、Editor模式下窗口制作

       要制作一个小工具,提供出一个友好界面是很有必要的。UnityEditor下的类可以很方便的完成这一需求。我们通过这些类,可以实现各种不同的控件:


怎么样,还算丰富吧?这些控件的具体实现我不想说,请自行查看API吧。

这里我还是遵循本文的主旨,围绕本文的中心思想(本文我们是要导出资源到服务器,并在游戏中下载这个资源过来使用)实现一个界面。

用例描述:

导出场景中的一个模型,并带着默认材质,如果该模型有多个可替换的贴图,也把这些贴图作为该模型的资源一并导出到一个资源包中。

按照这个需求,我猜想界面应该是这样的:

一个导出模型的口,一个提供可选贴图数量的口,根据用户输入的可选数量,给提供出对应的贴图导出口,最后填写完毕之后有一个按钮用于导出交互。


大笑,不好意思,这哪里是猜想,我其实早就写好了。其实也没骗你了,我在写之前是猜想的!

要实现上面这个窗口,我该怎么做呢?

       首先,定义一个继承EditorWindow的类,然后,重写OnGUI方法即可。我们这里在之前的代码基础上做修改添加:

using UnityEditor;
using UnityEngine;

/// <summary>
/// author : qyxls
/// </summary>
public class ExportTools : EditorWindow 
{
	[MenuItem("Tools/Export")]
	static void Execute () 
	{
// 实例化一个Window窗口 //
		ExportTools windows = EditorWindow.GetWindow<ExportTools>(true, "Export Tools");
	}
	
	void OnGUI()
	{
		
	}
}

这里要注意的就是将原来的脚本有继承自MonoBehaviour 修改为继承自EditorWindow。并在Execute ()方法中对当前的Window实例化。这时我们就可以得到一个Window窗口了:

其次,就是向我们生成的窗口中添加不同的控件,这些控件的生成都是在OnGUI()方法中实现的。和MonoBehaviour的OnGUI方法一样,EditorWindow的OnGUI()方法也主要是处理UI的,我们关于UI控件的生成处理都要写在这个方法里。OnGUI()这个方法每帧调用好几次(每个事件一次),所以一些逻辑处理要避免在这里调用。

	private string savePath;
	private GameObject exportObject;
	private int optionalCount = 0;
	private Texture2D[] optionalTexture = new Texture2D[0];
	
	void OnGUI()
	{
		/*
		 * ObjectField:
		 * 是这里的第一个控件,它可以允许用户拖拽将一个Object的对象赋给它。
		 * 如果要限制可接收的对象类型,可以通过第三个参数来限制类型这里表示直接收GameObject类型
		 * 第四个bool型的参数标志能否接受当前scene里的对象,true表示接受
		 * 这个方法返回的是一个Object类型的值,最后要将它转化为需要的类型
		 */
		exportObject = EditorGUILayout.ObjectField("Export Object", exportObject, 
													typeof(GameObject), true) 
													as GameObject;
		// 就相当于提供一个换行,用于格式化控件的 //
		EditorGUILayout.Space();
		// IntField:该控件只能输入 int 类型的值//
		optionalCount = EditorGUILayout.IntField("Optional Count", optionalCount);
		for(int i=0; i<optionalCount; i++)
		{
			if(optionalTexture.Length != optionalCount)
			{
				optionalTexture = new Texture2D[optionalCount];
			}
			
			EditorGUILayout.Space();
			// 这里将 ObjectField 限制只接受Texture2D类型的值 //
			optionalTexture[i] = EditorGUILayout.ObjectField("Optional Textures " + i, optionalTexture[i], 
															  typeof(Texture2D), false) 
															  as Texture2D;
		}
		
		EditorGUILayout.Space();
		EditorGUILayout.Space();
		
		EditorGUILayout.BeginHorizontal();
		EditorGUILayout.Space();
		// 导出按钮 //
		if(GUILayout.Button("EXPORT", GUILayout.Width(100), GUILayout.Height(20)))
		{
			
		}
		
		EditorGUILayout.EndHorizontal();
	}

这里一些必要的东西我都添加都注释理了,就不重复了。

到这里这个窗口就基本算是完成了。

3、导出功能的具体实现

以上只是实现出了这样一个窗口,具体响应功能,以及必要的逻辑实现还都不具备,这里我们将为这个窗口添加具体的功能实现代码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值