如何在unity3d assetbundle中打开asset store

4688人阅读
Unity技术向(7)
技术闲谈(5)
& & & & 我前一阵写了个插件叫 MagicVoxel Qubicle To Unity,地址:&上架已经半个月了。今天就来说一下将写好的插件发布到
Unity 的 AssetStore 需要注意些什么。
●&发布之前
& & &确保你的插件是自己原创的,绝对不能盗用别人的成果,即使是发布免费插件也要原创。
& & &你的插件里不能出现商标,跑车可以有,但法拉利车不行、手机可以但苹果手机不行。
& & &开一个新工程来测试插件,确保用新工程导入package之后,你的插件能够毫无阻碍的正常运转。
& & &美工类插件也要做测试,确保材质球都能正常连接,模型要做好面数优化;
& & &音效类素材最好提供多种文件格式与音质;
& & &代码类插件别报Error,需要API的一定写好超详细的API;
& & &任何代码类的插件都需要写ReadMe,不管需不需要都得写,不写过不了审核;
& & &如果你的插件需要打开自己的Editor窗口,必须把开启窗口的选项放在Tools标签里(如图),如果你把自己的标签放在了根目录下,就过不了审核了。注意是Tools,T要大写,单词最后的 s 不能丢。
& & & & &&
& & &你的package里需要有Demo,可以是场景,也可以是拖拽即用的prefab,总之,要让用户能够毫无开发成本的测试一下你的插件,证明你的插件是货真价实的。
& & &代码类插件必须用自己的命名空间,脚本文件不能用常用的文件名,比如AudioManager.cs、Utility.cs 等都是不能用的,要改成XXX_AudioManager.cs(XXX是插件名的缩写)。
& & &确保你的插件放在Assets文件夹下的任何位置都能用,有些用户喜欢把外部插件放在同一个文件夹下(而不是Assets根目录),所以,你不能把路径写死,要在用户改变插件位置时重新Cache资源路径。
& & &插件的UI一定要符合正常人的思维方式,能用代码做的事情就不能弹出个窗口去叫用户做。需要等待(比如转换文件格式、生成模型等)时一定要有进度条,完成时要弹出窗口提示,要让用户明确的知道发生了什么,把用户搞的一脸懵逼的话人家会给差评的。。。
●&准备发布
····第一次发布的话,需要把Unity账号转成开发者账号(免费)。先打开这个网址:publisher./login.html,登陆你的普通Unity账号,一番套路之后就能转为开发者账号,这步并不需要复杂的信息,任何人都能免费转型。完成后再次打开刚才的网址并登陆相同的账号即可,以后管理插件就在这里,所以最好收藏一下。
····登陆开发者账号后,我们就要创建一个草稿了。在插件正式提交之前,你可以随意的修改里面的内容,这时的插件被定义为草稿(draft)。按照下图提示,点击packages,然后点击Create New Package。
你将看到下图界面,你的Title将是Utitled,点击提示的位置写个标题吧。
在下图这里写标题。写完点Save保存信息。
下图中的Description对应你在AssetStore里看到的产品描述,KeyWords是搜索用的关键词,产品描述一定要好好写,确保用户能看出你的插件是干什么用的、怎么用的。
写好上述MetaData后,点GoBack回到下图这里。
先把版本写好,这个别写乱了就行,确保版本号不会倒退,Unity官方是不会帮你检查的;
然后是插件类型,别忘了选,选错会被退回来;
价格,默认免费,根据插件的规模与质量合理定制,不要低估或高估,具体价格参考AssetStore里的其它插件即可。
最后别忘了点保存按钮。
····写好信息后,就改上传插件了。
····先下载Unity官方的AssetStoreTools插件(免费),需要用这货传插件。
地址:,它的本质其实就是普通的插件,和AssetStore里的其它插件都是一类事物。这个插件的作用就是“把Assets文件夹里的一个指定文件自动打包成package,并上传到刚才的网站上”。
····下载完后,新建一个空的工程(必须),导入你的插件和上述AssetStoreTools。你的导航栏会多一个选项(如图),(他们自己的插件都没把选项放在Tools里怎么过的审?)
····点击PackageUpload,弹出下图窗口,启动的可能有点慢。然后选择一个草稿,选择你的插件所在的文件夹,选择要在AssetStore的Preview里显示的文件,最后点上传。
····传完后,你会发现这里会显示上传的时间。
····上传插件截图。
····在下图处点击Screenshots,可以上传AssetStore里看到的那些截图。视频在Audio/Video那里上传,视频永远排在截图前面。顺便视频要传到YouTube上,然后给连接,翻墙什么的自行解决。
····最重要的是KeyImage,在这里/files/asset-store/asset-store-key-image-templates.zip 下载官方样板,然后按照样板的提示来设计插件的 封面、小封面和图标这三张图,注意不要超过样板中的界限。这三张图一定要精心设计,因为会关系到之后的销量,最好多花的时间。
····确保所有的信息都填对后,就可以正式提交啦~~
····注意,一旦提交就会开始审核,需要等7~10天才会出结果。出结果之前是不能再修改的,虽说可以再提交一份,但这样会让你的package管理界面非常乱,所以一定要谨慎核对信息后,再确定发布。
····Unity官方会在审核开始和结束后给你发送电子邮件,注意查收。如果审核没有通过,拒绝的理由会写在邮件里。
····通过了审核后,你就可以在published里看到package了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19141次
排名:千里之外
评论:13条修改 Unity Asset Store 的下载路径说明 - 公开课,泰课公开课 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho1303人阅读
unity3d(18)
AssetStore一直是Unity开发者又爱又恨的东西。首先这个生态绝对是先进的,并且越来越能够吸引高质量的开发者开发或开源他们的插件。它的缺点可能是大陆开发者尤为头疼的。
1、付费,客观的看99%的资源价格都在100刀以内,先不论个人开发者能否完成同样功能的开发,即使可以,也绝对值回工时费了。
2、网络,没有验证过在国外是否都能流畅下载,至少使用电信、网通的“局域网”都十分痛苦。
3、断点续传,AssetStore的资源下载过程中一旦网络异常或关闭Unity,都只能“从0开始”。
我们都知道AssetStore下载到Windows本地的路径是C:\Users\用户名\AppData\Roaming\Unity\Asset Store-5.x\开发者公司名\插件名\xxx.unitypackage。
下载过程中会有如下2个文件生成,在目录下持续F5,TMP文件体积会增长。
而JSON文件由url和key组成。
{&download& : {&url& : &http://d2ujflorbtfzji.cloudfront.net/download/950fd1fa-e786-f83f057c52&, &key& : &b21d35e84cedafcf06ae73cf07c589dbcdeaed&}}
url很明显可以拷贝到任何下载器中下载,但下载完的文件即使手动添加后缀.unitypackage,也无法导入unity中使用。
后来查阅,发现可以通过key来解码,代码如下。&
using System.R
namespace Babybus.Framework.ExtensionMethods
public static class AccessExtensions
public static T InvokeConstructor&T&(this Type type, Type[] paramTypes = null, object[] paramValues = null)
return (T)type.InvokeConstructor(paramTypes, paramValues);
public static object InvokeConstructor(this Type type, Type[] paramTypes = null, object[] paramValues = null)
if (paramTypes == null || paramValues == null)
paramTypes = new Type[] { };
paramValues = new object[] { };
var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, paramTypes, null);
return constructor.Invoke(paramValues);
public static T Invoke&T&(this object o, string methodName, params object[] args)
var value = o.Invoke(methodName, args);
if (value != null)
return (T)
return default(T);
public static T Invoke&T&(this object o, string methodName, Type[] types, params object[] args)
var value = o.Invoke(methodName, types, args);
if (value != null)
return (T)
return default(T);
public static object Invoke(this object o, string methodName, params object[] args)
Type[] types = new Type[args.Length];
for (int i = 0; i & args.L i++)
types[i] = args[i] == null ? null : args[i].GetType();
return o.Invoke(methodName, types, args);
public static object Invoke(this object o, string methodName, Type[] types, params object[] args)
var type = o is Type ? (Type)o : o.GetType();
var method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, types, null);
if (method == null)
method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
return method.Invoke(o, args);
public static T GetFieldValue&T&(this object o, string name)
var value = o.GetFieldValue(name);
if (value != null)
return (T)
return default(T);
public static object GetFieldValue(this object o, string name)
var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
return field.GetValue(o);
public static void SetFieldValue(this object o, string name, object value)
var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
field.SetValue(o, value);
public static T GetPropertyValue&T&(this object o, string name)
var value = o.GetPropertyValue(name);
if (value != null)
return (T)
return default(T);
public static object GetPropertyValue(this object o, string name)
var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null)
return property.GetValue(o, null);
public static void SetPropertyValue(this object o, string name, object value)
var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null)
property.SetValue(o, value, null);
using UnityE
using Babybus.Framework.ExtensionM
using UnityE
class DecryptUtility
[MenuItem(&Utility/DecryptFile&)]
static void DecryptFile()
var inputFile = Application.dataPath + &/950fd1fa-e786-f83f057c52&;
var key = &b21d35e84cedafcf06ae73cf07c589dbcdeaed&;
var unityEditor = typeof(Editor).A
var assetStoreUtils = unityEditor.GetType(&UnityEditor.AssetStoreUtils&);
assetStoreUtils.Invoke(&DecryptFile&, inputFile, inputFile + &.unitypackage&, key);
这里注意修改inputFile的路径,需要解码的文件名和key值,我的代码对应路径是项目的project文件夹。点击Menu上新增的Utility→DecryptFile,执行上面的代码。进度条读完,一个同名的unitypackage已经生成在目录下了。
把这个unitypackage文件拷到C:\Users\用户名\AppData\Roaming\Unity\Asset Store-5.x\开发者公司名\插件名\&
路径下,Unity内打开AssetStore,可以看见即使文件没有重命名,系统已经识别该文件存在。
另外笔者实验将不相关的unitypackage重命名靠过来,或低版本的该插件导进来,系统都能识别,结果分别是导入按钮变灰色,及显示更新。key值或许就控制了这些奥妙。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8647次
排名:千里之外
原创:19篇
(2)(2)(2)(6)(4)(3)GUI Generator
GUI Generator is an easy to use tool for quickly creating high quality user-interface skins for use within Unity using the GUI system of your choice. Create fantastic looking panels, buttons & other user-interface elements within minutes.
Sound Generator
Sound Generator is a visual & runtime software audio synthesis suite for Unity. Create new sounds visually within Unity or even at runtime in your code. Apply filters and modifications to existing sounds for an infinite variation of sounds every time you use them.
Screenshot Creator
Screenshot Creator creates screenshots at any resolution directly within Unity. Add multiple overlay images, scale and position overlays with pixel accuracy. Take screenshots from any scene camera at any time whether in edit or play mode. Realtime preview window follows your view & allowing you to perfectly align your images.
Sound Reactor
Sound Reactor allows you to react to your music in-game. This is ideal for Guitar Hero style games or infinite runners where you would like, in-game, to alter your environment dependant on whatever music is currently playing.
Unity Asset Store
View all DarkArts Studios products within the Unity Asset Store

我要回帖

更多关于 unity3d asset store 的文章

 

随机推荐