unity momo unity3d怎么设置中文还原设置

/archives/2373
Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。
& & & & &Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件、游戏脚本、材质都封装在一起。当从服务器上将Assetbundle下载以后直接Instantiate就可以放入游戏中。
& & & & &试想一下,如果只能将原始的二进制资源文件放在服务器上下载,当资源文件下载完毕后,需要动态的创建游戏对象、然后动态的将脚本绑定在游戏对象、动态的将贴图赋予游戏对象等等各种动态的操作。。所以强烈建议使用Prefa,不解释!!!!!
& &另外,我在举个例子,因为模型有可能会带很多动画文件,那么这样一组模型资源就可能是多个FBX 文件 和 若干png贴图文件 材质文件。这时我只需要把原始模型放入Prefab中,它就会包含这个模型的所有组件、甚至包括它的动画资源、贴图。那么如下图所示,Mode就是模型的Prefab文件,那么我仅仅只需要把Mode这个预设打包成Assetbundle即可。 当我在服务器上下载这个Assetbundle并且载入游戏中就可以直接使用了,切换动画、换贴图都可以。。
2.二进制文件
& & & &也并不是Assetbundle中全都要用预设,Assetbundle它也可以将二进制文件直接封装在里面,比如图片、声音、文本信息等等。
&3.场景文件
& & 在Unity中可以将一个场景保存在Scene中,Scene就会包含这个场景中的所有,那能不能把Scene也封装成Assetbundle中?答案是能,但是它不能在移动平台上用,因为移动平台上是不能更新脚本的,换句话来说就是即使将脚本绑定在Prefab中,然后下载Assetbundle后,所有脚本是不会执行的,后面说另外一种巧妙用法。
4.移动平台
& & & & 上面MOMO已经将Assetbundle 的使用原理大致介绍了一下 ,我们在谈谈移动平台。脚本不能更新是移动平台下最大的伤,这就意味着开发者无法绕过App store和 google Play这种在线商店升级应用程序。唯一能做到的就是更新资源、举个例子,游戏中在处理版本升级时,一般会有个大版本号和一个小版本号,大版本号就是 2.0、3.0这种 版本需要在AppStore中更新,大版本主要是升级游戏脚本,然后当小版本号,比如2.0.1 或2.0.2这种只是更新游戏中的资源,通过自己游戏的服务器就可以完成,通过Assetbundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本,或不得不更新脚本那么只能在Appstore或者google Play去更新大版本。
& & 移动平台上不能更新脚本,那么Prefab上绑定的脚本怎么办?在任何平台上都可以把脚本添加到Prefab上,然后打包成Assetbundle,只有移动平台上有点特殊,比如将Test.cs这条脚本绑定在Prefab中,最后程序通过服务器下载这个Assetbundle ,当载入工程中这条脚本是不会被执行的。
& & & & & 但是如果本地工程有Test.cs这条脚本,那么Unity会自动将这条脚本绑定在下载的Prefab中,并且他们执行的非常好。如果本地工程中没有Test.cs这条脚本,那么Prefab上的脚本是永远都不会执行的。有时我们会在脚本中写一些Public的变量,有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。
5.移动优化
& & & & 之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。
& & & &服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。
对游戏中所有资源进行打包,比如按类型分为五个大部分& 界面,模型,特效,声音,场景,脚本。
界面部分:
公用资源包(可复用的资源包)和 每个界面独有得资源包(不可复用的资源包)统一使用Prefab 打包成.assetbundle 二进制格式。
模型部分:
按角色分类,统一使用Prefab 打包成.assetbundle 二进制格式。 模型部分包括模型文件与动画文件,每一个模型文件对应一组动画文件。(如果模型需要换装还需提供对应换装的模型与贴图) ,因为unity4的重定向动画不支持动态加载,所以目前不需要考虑 不同大小 不同规格 不同性别 的模型重定向动画。
特效部分: 统一使用Prefab 打包成.assetbundle 二进制格式。&
声音部分: 统一使用Prefab 打包成.assetbundle 二进制格式。&
场景部分:场景和前面的有点区别,场景需要导出烘培的光信息并且只能烘培场景之上永远不动的模型,但是这些永远不动的模型有可能会同时在多个场景中使用,所以场景烘培完毕后要把重复使用的对象删除,(运行游戏在动态的加载进来)场景中只保留该场景中永远不会变的模型,以及烘培的光照信息。 打包场景后会生成.unity3D 二进制格式,它和 assetbundle 打包方式是不同的。(另外,也可以考虑 json xml 二进制 来动态组装场景)。 &
脚本部分:如果Prefab上是带脚本打包Assetbundle的话& 脚本是不会被运行的(移动平台), 但是unity有一个技巧,Prefab上的脚本 如果本地有的话它会把本地的同名脚本绑定在Prefab对象上,它会很好的执行。&
Prefab打包技巧: Prefab打包时自身是不占多少空间的 &=1KB& 但是Prefab上是可以关联& 这五大部分 &界面,模型,特效,声音,场景,脚本&以及在Hierarchy视图中 坐标/缩放/旋转。 关联这些信息以后就会很大,所以为了避免资源的浪费尽量避免Prefab重复关联。
一个prefab下面可以同时关联多个游戏对象 ,这里举个例子如果你的 Prefab下面放了一个模型 它的大小可能是500k& ,在 Prefab下面放了十个完全相同模型 它的大小可能是501k 。 如果Prefab下面放了两个不同的模型,它的大小可能就会是 500k x 2 的size& ,也就是说Prefab与关联的数量是无关的 。&
加密部分: assetbundle 是可以转换成 字节数组 ,客户端与服务器约定一组解密 字节数组的算法就可以实现资源加密。
大版本升级:&
unity的版本升级其实主要是升级主程序中的脚本。 因为所有的资源都是assetbundle 和 .unity3d & 这些资源放在本地或者服务器 解包的方式是完全一样,所以理论上我们的主程序包的大小可以做到很小,可以很好设置把多少资源放在包里 或者把所少资源放在服务器上。在运行的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
小版本升级:
小版本升级也就是更新资源,因为不能更新脚本, 在登陆的时候服务端应该把所有 assetbundle 和 .unity3d的资源文件的下载地址列表返回给客户端。
还有个需要考虑的地方,比如现在大版本是2.0.0 ,小版本已经是2.0.5 ,用户的手机上是一个1.5.0的包。 此时用户在打开游戏的时候 应当强制它去appstore中去下载大版本2.0.0 ,当用户下载完毕后登陆游戏,此时服务器告诉客户端现在已经是2.0.5的小版本了,这时候客户端去下载对应小版本的所有& assetbundle 和 .unity3d文件地址列表。
增量更新:理论上增量更新是可行的。因为unity不能更新脚本,所以在处理增量更新的话 需要在代码中做可以兼容增量更新的可能。
因为Assetbundle这块的代码比较多,我还是决定分成两篇文章来写,这篇文章先说原理、下篇文章说代码。欢迎大家来讨论!
前几天我和Unity鑫哥聊天,他告诉我IOS上是无法运行时更新脚本、但是Android上是可以运行时更新脚本,我回家也试了一下但是没能成功,后来我考虑即使成功了项目中我也不打算那么做,因为这样Android和IOS 做起来的差别就太多了, 另外Unity商店中有一个处理运行时更新脚本的插件&unityLua 大家可以去研究研究。
阅读(...) 评论()程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之使用Animation编辑器编辑动画(五十四)
Unity3D研究院之使用Animation编辑器编辑动画(五十四)
围观147731次
编辑日期: 字体:
Unity提供了Animation编辑器,它可以为我们编辑物理动画。举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互。如果这个秋千也用代码来写控制它来回摇动,会感觉小题大做。此时完全可以使用Animation编辑器来完成。但是它目前还不能编辑 FK 和 IK动画,所以编辑器中编辑动画的种类还是有限的,如果有一天FK 和 IK动画都可以在Unity中编辑了 那就给力了嚯嚯。。。如下图所示,首先在Hierarchy视图中创建一个游戏对象,这里我就创建一个立方体Cube对象。鼠标保持选中状态,然后在Unity导航菜单栏中选择Window-&Animation将呼出动画编辑窗口。
如下图所示,Animation窗口弹出后,点击左上角那个“小红点”按钮。因为默认新建的Cube对象是没有动画的,所以这里将弹出创建动画窗口。在窗口中点击Save,此时一个名叫New Animation的动画文件将被保存在Project视图中。
如下图所示,此时动画将处于编辑中模式, 在右上方空白处点击鼠标右键,即可添加一个Frame , 点击Frame就会出现一道竖向的红线,上面对应着Frame的时间,这时候在左侧Transform中可以修改每一帧模型的位置,或者在编辑器中也可以修改,数值同样会被保存在每一帧的Transform中。
当你的帧编辑完成后,点击上图左上角那个运行的按钮。你可以在游戏视图中看到这个立方体对象已经按照我们设定的每帧的位置在播放动画了。图中左下角Show:all右侧可以设置动画的播放类型。为了看的清楚,这里我选择PING PONG让动画来回一直播放。动画编辑完成后,点击图中左上角“小红点”按钮 退出动画编辑模式。
退出动画编辑模式后,如下图所示,将刚刚编辑完的动画剪辑拖拽至立方体对象的Animation中,勾选Play Automatically自动播放。此时运行游戏你会发现立方体对象已经按照之前编辑的方式播放动画。
上面介绍的方式我没有写任何一行代码,如果你想动态的监听一些播放事件, 比如当播放几秒的时候执行几行代码。此时你可以使用动画的事件来完成。先创建一条普通的脚本。把它绑定在Cube对象身上。在脚本中我写了两个方法 Event0()和Event1()。
123456789101112131415
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour{ void Event0() {
Debug.Log("Event0"); }& void Event1() {
Debug.Log("Event1"); }}
我们继续呼出Animation编辑窗口,如下图所示,在时间轴的空白处单机鼠标右键可以添加一个动画事件。 然后会弹出Edit Animation Event窗口,中间有一个Function的选项,Event0()就会对应到上面代码中 Event0的方法。你还可以在脚本中继续添加方法,在Function:的下拉菜单中都会看到。图中我在0:10处添加了一个动画事件,对应在Event0方法中,那么当动画播放0.10s的时候程序将会进入Event0方法中。
怎么样?动画事件还是比较好理解吧。讲到这里你是不是想问我?能不能让美术把动画都在Unity中来完成。答案是否定的,因为它不支持FK 和IK动画,骨骼连带动画还是得在3DMAX 或maya中来完成。如下图所示你也可以打开一个美术在3DMAX 或者 maya中做的动画,这里会显示Read-only表示只读,你不能继续修改它。
Animation编辑器只能修改当前节点的动画,如果你想编辑它的子节点动画的话。只需现在父节点中找到某个子节点对象,然后在window-&Animation中呼出编辑器窗口即可开始编辑。
一口气写了这么多,最后祝大家学习愉快。哇咔咔。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之提取游戏资源的三个工具支持Unity5(八十四)
Unity3D研究院之提取游戏资源的三个工具支持Unity5(八十四)
围观117805次
编辑日期: 字体:
这两天无意间又发现了两个提取Unity游戏资源的工具,这会儿刚好有时间我就码点字总结一下。
一、disunity
因为之前写过了所以这里就不介绍了 。Unity3D研究院之mac上从.ipa中提取unity3D游戏资源(六十六)
二、UnityAssetsExplorer
下载地址:
百度云下载地址:
如果你想解Unity5的游戏包,请使用 UnityAssetsExplorer 1.5 以上版本。
百度云下载地址:
如下图所示,OpenAssets-File 选一个 .asset 或者一个.assetbundle 然后Extract All即可导出,感觉只是在disunity上增加了一个可视化的功能。
三、UnityStudio
其实我觉得这个工具非常牛逼、前面两个都只能把资源解开,预览图片资源得用别的工具才能打开。然而UnityStudio可以直接在自己的软件上查看图片、shader、文本、还能直接播放音频、甚至还能看场景Hierarchy视图的树状结构。强烈推荐用UnityStudio啊。
下载地址:
百度云下载地址:
UnityStudio最新版本下载 支持unity5.x
直接预览图片
直接播放音频
查看场景树状结构
查看Shader代码。
查看文本内容
如果你想解Unity5的游戏包,请使用 UnityAssetsExplorer 1.5 以上版本。
百度云下载地址:
因为Unity提供资源的工具很多,所有有些团队为了避免别人提取所以对资源进行了加密,最近又发现了一个神器基于硬件层面查看内存贴图,这样就直接无视对方加密了。。
下载地址在这里
下载Tegra Graphics Debugger
支持Mac Linux Windows
安装好以后连上安卓机器, 这里安卓的机器得是Tegra 机型查询
然后要选一个abd的路径,在android的sdk里platform-tools/adb
接着选择一个游戏包名,Lanch一下就会自动启动游戏,并且开始分析。
点击Capture Frame 截取一帧,然后选择Texture就可以看内存了, 给力吧。。
如果没有Tegra的手机,用高通的也可以,高通这个给力可以批量导出所有图片
下载地址:
参考资料: 
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之查找资源被哪里引用了
Unity3D研究院之查找资源被哪里引用了
围观16151次
编辑日期: 字体:
Unity提供了一个方法 AssetDatabase.GetDependencies(),但是它只能查找这个资源引用了那些资源。 但是我想要的是查找某个资源被那些资源引用了,这是两种相反的查找公式。 其实网上也有很多这样的插件了,似乎代码量都太多了。昨天晚上加班时脑洞打开,想到了一个简单的方法。通过GUID全局搜索匹配。。几行代码就能搞定~~
如下图所示,右键随便选择一个资源,点击 Find References。
然后开始匹配资源。
匹配结束后会把匹配到的资源Log出来。以下代码直接放到你的工程里就可以直接用。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
using UnityEngine;using System.Collections;using UnityEditor;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Collections.Generic;&public class FindReferences{&&&&&&[MenuItem("Assets/Find References", false, 10)]&&&&static private void Find()&&&&{&&&&&&&&EditorSettings.serializationMode = SerializationMode.ForceText;&&&&&&&&string path = AssetDatabase.GetAssetPath(Selection.activeObject);&&&&&&&&if (!string.IsNullOrEmpty(path))&&&&&&&&{&&&&&&&&&&&&string guid = AssetDatabase.AssetPathToGUID(path);&&&&&&&&&&&&List withoutExtensions = new List(){".prefab",".unity",".mat",".asset"};&&&&&&&&&&&&string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories)&&&&&&&&&&&&&&&&.Where(s =& withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();&&&&&&&&&&&&int startIndex = 0;&&&&&&&&&&&&&EditorApplication.update = delegate()&&&&&&&&&&&&{&&&&&&&&&&&&&&&&string file = files[startIndex];&&&&&&&&&&&&&&&&&&&&&&&&&&&& bool isCancel = EditorUtility.DisplayCancelableProgressBar("匹配资源中", file, (float)startIndex / (float)files.Length);&&&&&&&&&&&&&&&&&if (Regex.IsMatch(File.ReadAllText(file), guid))&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&Debug.Log(file, AssetDatabase.LoadAssetAtPath&Object&(GetRelativeAssetsPath(file)));&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&startIndex++;&&&&&&&&&&&&&&&&if (isCancel || startIndex &= files.Length)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&EditorUtility.ClearProgressBar();&&&&&&&&&&&&&&&&&&&&EditorApplication.update = null;&&&&&&&&&&&&&&&&&&&&startIndex = 0;&&&&&&&&&&&&&&&&&&&&Debug.Log("匹配结束");&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&};&&&&&&&&}&&&&}&&&&&[MenuItem("Assets/Find References", true)]&&&&static private bool VFind()&&&&{&&&&&&&&string path = AssetDatabase.GetAssetPath(Selection.activeObject);&&&&&&&&return (!string.IsNullOrEmpty(path));&&&&}&&&&&static private string GetRelativeAssetsPath(string path)&&&&{&&&&&&&&return "Assets" + Path.GetFullPath(path).Replace(Path.GetFullPath(Application.dataPath), "").Replace('\\', '/');&&&&}}
美中不足的地方就是查找速度了。。其实正则表达式匹配的速度还是很快,慢的地方是File.ReadAllText(file) 如果大家有更好的办法,欢迎推荐~
今天我无意发现了一个更快的方法,可惜只能在mac上用。比我上面的方法要快N倍啊,快的丧心病狂啊~欢迎大家用啊~~。。。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
using UnityEngine;using System.Collections;using UnityEditor;using System.Collections.Generic;&public class FindProject {
#if UNITY_EDITOR_OSX
[MenuItem("Assets/Find References In Project", false, 2000)] private static void FindProjectReferences() {
string appDataPath = Application.dataPath;
string output = "";
string selectedAssetPath = AssetDatabase.GetAssetPath (Selection.activeObject);
List&string& references = new List&string&();
string guid = AssetDatabase.AssetPathToGUID (selectedAssetPath);
var psi = new System.Diagnostics.ProcessStartInfo();
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
psi.FileName = "/usr/bin/mdfind";
psi.Arguments = "-onlyin " + Application.dataPath + " " + guid;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = psi;
process.OutputDataReceived += (sender, e) =& {
if(string.IsNullOrEmpty(e.Data))
string relativePath = "Assets" + e.Data.Replace(appDataPath, "");
// skip the meta file of whatever we have selected
if(relativePath == selectedAssetPath + ".meta")
references.Add(relativePath);
process.ErrorDataReceived += (sender, e) =& {
if(string.IsNullOrEmpty(e.Data))
output += "Error: " + e.Data + "\n";
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit(2000);
foreach(var file in references){
output += file + "\n";
Debug.Log(file, AssetDatabase.LoadMainAssetAtPath(file));
Debug.LogWarning(references.Count + " references found for object " + Selection.activeObject.name + "\n\n" + output); }
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之使用初始化游戏脚本
Unity3D研究院之使用初始化游戏脚本
围观7433次
编辑日期: 字体:
以前我只能做一个初始化场景, 在这个场景进行初始化工作, 并且保证这个场景在游戏运行中只能进一次。现在好了,unity5提供了初始化回调方法。[RuntimeInitializeOnLoadMethod]
这样初始化就和传统游戏开发初始化一样了。 没有场景 没有 游戏对象 的初始化 启动脚本。
1234567891011121314151617
using UnityEngine;using System.Collections;using System.Runtime.Hosting;&public class Instance : MonoBehaviour {&&&&&&[RuntimeInitializeOnLoadMethod]&&&&static void Initialize()&&&&{
GameObject.DontDestroyOnLoad(new GameObject("Instance",typeof(Instance)) {
hideFlags = HideFlags.HideInHierarchy
Debug.Log( "RuntimeInitializeOnLoadMethod" );&&&&}}
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 罗技momo设置 的文章

 

随机推荐