• 在将图片拖入到Assets后发现更本不能将图片拖入到UI中: 新建Image后在Source Image中也不能找到图片: 那是因为你没把图片设置为Sprite,图片只是Texture而已,只能作为贴图使用。 可以将图片设置为Sprite: ...

    在将图片拖入到Assets后发现根本不能将图片拖入到UI中:


    新建Image后在Source Image中也不能找到图片:


    那是因为你没把图片设置为Sprite,图片只是Texture而已,只能作为贴图使用。

    可以将图片设置为Sprite:


    这样一切就正常了:


    在Source Image也可以找到了:


    在UI中也出来了:


    展开全文
  • 原zxing.unity.dll不支持中文的二维码读写,我修改了源码重新编译后可以支持中文了,用在Unity3d开发中,使用方法非常简单,我的Unity demo中包含根据输入字符串生成二维码图片、存储图片到本地目录以及从图片读取并...
  • 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。...



    1.首先呢。就是必要的一些软件工具了。 不用说unity3d这个是必要的(觉得这是不是废话)。然后就是。我们的一些运行的环境了。  Java(jdk).  Android模拟器(sdk)[当然你有真机也可以]。这些你可以从网上下载。 
    在这里我给大家提供一个 Android模拟器(sdk)    Java(jdk)就不提供了吧。度娘一下就出来了。Unity3d 
    就更不用说了吧(诶。还是有点废话)。呵呵。 

    2. 安装 

    一.Java的安装。 
    这个非常简单。打开你下载好的选择个路径安装就可以了。 
    在个就是环境配置。右击我的电脑-属性-高级-环境变量-新建三个路径(变量名有的话直接在上面操作就可以了)。 

       1.变量名JAVA_HOME   
         变量值Crogram FilesJavajdk1.7.0_03 (这个可能没有你必须新建。 注意:Crogram FilesJavajdk1.7.0_03这是我的。你的可能是D:......,,E:......) 这是我的java路径 
     

     


    2.变量名CLASSPATH   
    变量值 .;%JAVA_HOME%lib        ools.jar;%JAVA_HOME%libdt.jar;%JAVA_HOME%in;Crogram FilesJavajdk1.7.0_03jrelibextQTJava.zip   
     


    3.变量名Path     变量值Crogram FilesJavajdk1.7.0_03in( 这个可能先前已经有了。这段路径你放在前后都无所谓。如果你放在后面C:...前面要有个分号隔开。如果有了就不用了。) 


     


    注意。这上面都是我个人的。你要清楚你的java安装路径。 



    二.Android模拟器(sdk)的安装。 
    这个非常简单。你下载下来后。直接解压就可以了。解压以后就是这样的。别忘了。这个也需要 环境设置。将你的模拟器platform-tools文件夹路径添加到上面讲的Path变量值下。我的是G:adt-bundle-windows-x86platform-tools 
     


    可以点击sdk Manager.exe 
     


    里面已经有我下载安装好的Android版本,2.3.3   3.0  3.1.(所以你下载的才那么大600多M)。 
     


    如果你需要更高的版本。可以运行更新你想要的更多版本。 
    好。这个就先放这。让后点击AVD Manager.exe. 
     


    运行以后。出现这个界面。 
     


    划红线的是我已经新建好的不同的Android版本。别担心。一会你的也会有的。 
    你要做的是。点击右边的new按钮。 
    出现下面的界面。 
     


    填写好你的AVDname 这个可以任意。再选择Device。这是设置屏幕大小的。你可以选择一个都可以。在个就是。Target 点击下拉箭头。看到没有。;里面的内容就是你安装的各个Android版本。你可以选择自己需要的。最后别忘了。SD Card选择大小。好了。点击OK。再ok. 看到没有。你的AVD界面。是不是已经有了一个Android版本了?你可以多建几个版本。选择一个Android版本。点击右下角的Start接着继续点击Launch。等一会。 
    真机(虚拟机)就出来了。大功告成。哈哈哈哈。好吧。现在环境已经配置完成了 

    3.发布apk 
             
      打开你的unity3d .至于你要发布什么。做的是什么。我们在这里就不说了吧。我们现在只讨论发布过程。 
     


    假如你应经做好了东西。准备发布。那就开始吧。 
      首先。设置一下你的模拟器路径。点击菜单栏中的Edit-Preferences 
     


    看Android SDK Location这个选项 浏览你的模拟器路径。 
    图片:图片13.jpg

     



    我的是 
     

    这个设置完成后。我们继续。 
    点击 File-Build Settings 
     


    然后再 点击Add Current 添加你的场景。再 点击Switch platform 确保你的那个unity小图标在Android一行, 再点击Play Settings.... 
     

     
     
    要注意的是划红线的部分。如果你原先没设置。第一个红线出你的应该是com.Company.Productname. 记住要把Company改成别的。只要不是Company就可以了。不让发布不了。 
    另外就是第二个划红线处。这是选择你要发布的apk文件的运行环境。也是最低环境。这里我们选择2.3  每一个unity版本都有一个发布最低版本的限制。我这个已经是最低限制了。 
    更高的unity版本发布的最低Android系统版本限制也就会越高。 
       特别要注意的是。你发布的Android版本如果你的模拟器里面没有这个版本的。那就会出现发布错误。还有就是假如说你发布了一个3.0的版本。你的模拟器里只有一个很高的4.0的版本。那也是会发布错误的。所以这一点要特别的注意。我原来就只在这里碰壁的。 
    好了。这个设置完就可以真的发布了。点击Build按钮。就可以发布出apk文件了。 
    最后教大家一下发布的apk文件怎么安装。 
    这个就简单了。 
    把你的apk文件放在D盘的根目录下(你也可以放在别的盘根目录下。因为我的除了C盘只有D盘了。郁闷啊)。 
    为什么要放在盘的根目录下呢?。这是为了安装方便。下面你就知道了。 
    然后打开:“命令提示符” 
    你也可以点击 开始-运行 输入cmd 也可以打开命令提示符。 
    你打开命令提示附后。 在上面输入 D:回车(这样就是在d根目录下找到你的apk文件。如果你放在更深的文件里。那就很麻烦了。) 
    然后在输入 
    adb install  xxx.apk  回车(xxx是你apk文件的文件名) 
    你就会看到。 他正在安装。 



       
    注意的是。安装以前你的Android虚拟机要运行这。 
    安装完成后。你在你的虚拟机屏幕上就可以看到。你的东西了。 是不是很激动啊。 
    慢慢享受吧。。。。。。。 
    本文章属于个人原创文章。如果有什么不足的地方。还望大家不吝赐教。 
    这一夜有你们真好。愿这一夜你们过得愉快。 



    展开全文
  • Unity3D动态生成模型

    2020-07-11 23:31:39
    本文实现的是简单的隧道模型,如果对于复杂的模型,需要精细的数学知识扩充,但对于unity3d的使用则无两样,均通过指定的一些方法实现。这个需求,在非静态工厂的监控很为强烈,因为场景经常变化,不可能让工程人员...
  • 教我们初步的破解unity3d资源的基本方法 附上原帖的链接: http://www.xuanyusong.com/archives/2584 下面我会从头介绍一下提取的全过程: 步骤一:首先从 https://github.com/ata4/disunity/releases ...

    首先感谢 雨松MOMO 的一篇帖子 教我们怎么提取 .ipa 中的游戏资源。教我们初步的破解unity3d资源的基本方法
    附上原帖的链接:
    http://www.xuanyusong.com/archives/2584

    下面我会从头介绍一下提取的全过程:

    步骤一:首先 https://github.com/ata4/disunity/releases 下载 DisUnity v0.3.1
    也可以直接用工具下载 https://github.com/ata4/disunity/releases/download/v0.3.1/disunity_v0.3.1.zip
    我解压到了D:\disunity_v0.3.1 这个路径 大家根据自己的需求来选择自己的路径吧

    步骤二:确保安装了 Java JDK 7
    下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
    检测是否安装成功 在cmd输入 java -version 可以打印出版本号 说明应该没问题了。如果没有成功这里就不详细介绍了 问下度娘或者google一下(虽然最近google有些杯具了),请大家见谅。

    步骤三:获取可以破解的源文件 首先我们需要Android的 .apk 或者 IOS的 .ipa  或者网页游戏的.unity3d  和 .boundle 文件
    Android:  先看看 Android 的 apk 安装包吧,把下好的文件后缀名.apk 直接改成 .rar 解压到单独的文件夹  可以反编译的文件的路径就在:解压后的文件夹\assets\bin\Data
    IOS: ios的 ipa的安装包 也是同样的原理 把.ipa 改成 .rar 然后解压到单独的文件夹 可以反编译的文件的路径就在: 解压后的文件夹\Payload\godoflight.app\Data  (这里我用的是神之光举例子 所以是 godoflight.app)
    网页:  这个我们重点讲一下

    下面我讲一下如何提取unity3d做的网页游戏的资源

    首先我们先要下载 火狐浏览器 http://www.firefox.com.cn/ 这是官方网站 请大家自行下载吧。

    然后安装 FireBug 插件 上图了

    然后搜索 Firebug 找到后点安装

    安装成功后这里会有个虫子的图标

    准备工作完成了,下面我们找一个unity3d开发的网页游戏 这里我们用 《冰火破坏神》 来举例,算是给完美做广告了 虽然他们一定会恨我的(坏笑)。


    先登录游戏,然后打开firebug  如图 点 [网络] -> [全部] 如果目前网页中有unity的资源的话 就会在下面的列表里出现

    这里我先清理了一下因为里面有很多不是unity的资源文件 列表清空了之后 我点 【进入游戏】 就进入了一个加载界面列表里开始加载新的资源


    有.boundle 和 .unity3d 的资源 这就是我们需要的 至于其他的资源 我也是刚刚才尝试出来的估计就这两种有用的文件吧 如果不是还请大家补充 大家共同研究哈。

    这里已经加载了不少资源了 然后就是蛋疼的下载 因为一直没有很好的批量下载的方法 我目前还是一个一个的下载 如果大家有好的方法的话 希望可以分享一下 感激不尽。

    复制链接 然后我用工具下载下来就可以了(我用的QQ旋风)。

    到此需要做的准备基本完成下面我们开始反编译。

    步骤四:
      打开cmd 进入步骤一中的 D:\disunity_v0.3.1 文件夹中

    下面是disunity_v0.3.1中的目录结构

    然后我们可以用命令 disunity extract 需要反编译的文件的路径\*.* 就可以了
    我的反编译文件放在了E:\Downloads\szgPJB(jb51.net)\assets\bin\Data 这个文件夹中 用 *.* 就可以把里面的文件全部反编译 当然无法识别的文件是没法反编出来的  

    从.ipa和.apk中解压出来的资源 貌似只有 .assets 文件可以反编译出来


    从网页上下载的.boundle和.unity3d 文件也可以放到一个文件夹 用上面的方法 反编译出来。
    当然 单个文件的话 把*.* 替换成想要反编译的文件就可以了

    以上就是整个反编译的过程

    反编译出来的文件  会分几个类别  分别放到以下文件夹中

    audioclip 是音频文件
    dubemap这不太清楚 里面存放的好像是贴图文件
    font 是 字体
    mesh 是 模型文件 .obj
    shader 是 里面是.shader文件
    Texture2d 是 贴图文件

    好了 先写到这里吧 有什么错误和不合适得地方请大家 批评指正  这是我写过的最长的一篇帖子了 还请大家多多支持。 
    原文地址:http://bbs.9ria.com/thread-401140-1-1.html

    展开全文
  • 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。...

    最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大这里写下关于Unity3D对于内存的管理与优化.

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大。 Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的。

    其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你自动完成了。

    详细说一下细节概念:
    AssetBundle
    运行时加载:
    来自文件就用CreateFromFile(注意这种方法只能用于standalone程序)这是最快的加载方法
    也可以来自Memory,CreateFromMemory(byte[]),这个byte[]可以来自文件读取的缓冲,www的下载或者其他可能的方式。
    其实WWWassetBundle就是内部数据读取完后自动创建了一个assetBundle而已
    Create
    完以后,等于把硬盘或者网络的一个文件读到内存一个区域,这时候只是个AssetBundle内存镜像数据块,还没有Assets的概念。
    Assets
    加载:
    AssetBundle.Load(Resources.Load) 这才会从AssetBundle的内存镜像里读取并创建一个Asset对象,创建Asset对象同时也会分配相应内存用于存放(反序列化)
    异步读取用AssetBundle.LoadAsync
    也可以一次读取多个用AssetBundle.LoadAll
    AssetBundle
    的释放:
    AssetBundle.Unload(flase)
    是释放AssetBundle文件的内存镜像,不包含Load创建的Asset内存对象。
    AssetBundle.Unload(true)
    是释放那个AssetBundle文件内存镜像和并销毁所有用Load创建的Asset内存对象。

    一个PrefabassetBundleLoad出来 里面可能包括:Gameobject transform mesh texture material shader script和各种其他Assets
     Instaniate一个Prefab,是一个对Assets进行Clone(复制)+引用结合的过程,GameObject transform Clone是新生成的。其他mesh / texture / material / shader 等,这其中些是纯引用的关系的,包括:TextureTerrainData,还有引用和复制同时存在的,包括:Mesh/material /PhysicMaterial。引用的Asset对象不会被复制,只是一个简单的指针指向已经LoadAsset对象。这种含糊的引用加克隆的混合, 大概是搞糊涂大多数人的主要原因。
    专门要提一下的是一个特殊的东西:Script Asset,看起来很奇怪,Unity里每个Script都是一个封闭的Class定义而已,并没有写调用代码,光Class的定义脚本是不会工作的。其 实Unity引擎就是那个调用代码,Clone一个script asset等于new一个class实例,实例才会完成工作。把他挂到Unity主线程的调用链里去,Class实例里的OnUpdate OnStart等才会被执行。多个物体挂同一个脚本,其实就是在多个物体上挂了那个脚本类的多个实例而已,这样就好理解了。在new class这个过程中,数据区是复制的,代码区是共享的,算是一种特殊的复制+引用关系。
    你可以再Instaniate一个同样的Prefab,还是这套mesh/texture/material/shader...,这时候会有新的GameObject等,但是不会创建新的引用对象比如Texture.
    所以你Load出来的Assets其实就是个数据源,用于生成新对象或者被引用,生成的过程可能是复制(clone)也可能是引用(指针)
    当你Destroy一个实例时,只是释放那些Clone对象,并不会释放引用对象和Clone的数据源对象,Destroy并不知道是否还有别的object在引用那些对象。
    等到没有任何 游戏场景物体在用这些Assets以后,这些assets就成了没有引用的游离数据块了,是UnusedAssets了,这时候就可以通过 Resources.UnloadUnusedAssets来释放,Destroy不能完成这个任 务,AssetBundle.Unload(false)也不行,AssetBundle.Unload(true)可以但不安全,除非你很清楚没有任何 对象在用这些Assets了。
    配个图加深理解:


    Unity3D占用内存太大怎么解决呢?

    虽然都叫Asset,但复制的和引用的是不一样的,这点被Unity的暗黑技术细节掩盖了,需要自己去理解。

    关于内存管理
    按照传统的编程思维,最好的方法是:自己维护所有对象,用一个Queue来保存所有object,不用时该Destory的,该Unload的自己处理。
    但这样在C# .net框架底下有点没必要,而且很麻烦。
    稳妥起见你可以这样管理

    创建时:
    先建立一个AssetBundle,无论是从www还是文件还是memory
    用AssetBundle.load加载需要的asset
    加载完后立即AssetBundle.Unload(false),释放AssetBundle文件本身的内存镜像,但不销毁加载的Asset对象。(这样你不用保存AssetBundle的引用并且可以立即释放一部分内存)
    释放时:
    如果有Instantiate的对象,用Destroy进行销毁
    在合适的地方调用Resources.UnloadUnusedAssets,释放已经没有引用的Asset.
    如果需要立即释放内存加上GC.Collect(),否则内存未必会立即被释放,有时候可能导致内存占用过多而引发异常。
    这样可以保证内存始终被及时释放,占用量最少。也不需要对每个加载的对象进行引用。

    当然这并不是唯一的方法,只要遵循加载和释放的原理,任何做法都是可以的。

    系统在加载新场景时,所有的内存对象都会被自动销毁,包括你用AssetBundle.Load加载的对象和Instaniate克隆的。但是不包括AssetBundle文件自身的内存镜像,那个必须要用Unload来释放,用.net的术语,这种数据缓存是非托管的。

    总结一下各种加载和初始化的用法:
    AssetBundle.CreateFrom.....:创建一个AssetBundle内存镜像,注意同一个assetBundle文件在没有Unload之前不能再次被使用
    WWW.AssetBundle:同上,当然要先new一个再 yield return 然后才能使用
    AssetBundle.Load(name): 从AssetBundle读取一个指定名称的Asset并生成Asset内存对象,如果多次Load同名对象,除第一次外都只会返回已经生成的Asset 对象,也就是说多次Load一个Asset并不会生成多个副本(singleton)。
    Resources.Load(path&name):同上,只是从默认的位置加载。
    Instantiate(object):Clone 一个object的完整结构,包括其所有Component和子物体(详见官方文档),浅Copy,并不复制所有引用类型。有个特别用法,虽然很少这样 用,其实可以用Instantiate来完整的拷贝一个引用类型的Asset,比如Texture等,要拷贝的Texture必须类型设置为 Read/Write able。

    总结一下各种释放
    Destroy: 主要用于销毁克隆对象,也可以用于场景内的静态物体,不会自动释放该对象的所有引用。虽然也可以用于Asset,但是概念不一样要小心,如果用于销毁从文 件加载的Asset对象会销毁相应的资源文件!但是如果销毁的Asset是Copy的或者用脚本动态生成的,只会销毁内存对象。
    AssetBundle.Unload(false):释放AssetBundle文件内存镜像
    AssetBundle.Unload(true):释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存对象
    Reources.UnloadAsset(Object):显式的释放已加载的Asset对象,只能卸载磁盘文件加载的Asset对象
    Resources.UnloadUnusedAssets:用于释放所有没有引用的Asset对象
    GC.Collect()强制垃圾收集器立即释放内存 Unity的GC功能不算好,没把握的时候就强制调用一下

    在3.5.2之前好像Unity不能显式的释放Asset

    举两个例子帮助理解
    例子1:
    一个常见的错误:你从某个AssetBundle里Load了一个prefab并克隆之:obj = Instaniate(AssetBundle1.Load('MyPrefab”);
    这个prefab比如是个npc
    然后你不需要他的时候你用了:Destroy(obj);你以为就释放干净了
    其实这时候只是释放了Clone对象,通过Load加载的所有引用、非引用Assets对象全都静静静的躺在内存里。
    这种情况应该在Destroy以后用:AssetBundle1.Unload(true),彻底释放干净。
    如果这个AssetBundle1是要反复读取的 不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和这个npc有关的Asset都销毁。
    当然如果这个NPC也是要频繁创建 销毁的 那就应该让那些Assets呆在内存里以加速游戏体验。
    由此可以解释另一个之前有人提过的话题:为什么第一次Instaniate 一个Prefab的时候都会卡一下,因为在你第一次Instaniate之前,相应的Asset对象还没有被创建,要加载系统内置的 AssetBundle并创建Assets,第一次以后你虽然Destroy了,但Prefab的Assets对象都还在内存里,所以就很快了。

    顺便提一下几种加载方式的区别:
    其实存在3种加载方式:
    一是静态引用,建一个public的变量,在Inspector里把prefab拉上去,用的时候instantiate
    二是Resource.Load,Load以后instantiate
    三是AssetBundle.Load,Load以后instantiate
    三种方式有细 节差异,前两种方式,引用对象texture是在instantiate时加载,而assetBundle.Load会把perfab的全部assets 都加载,instantiate时只是生成Clone。所以前两种方式,除非你提前加载相关引用对象,否则第一次instantiate时会包含加载引用 assets的操作,导致第一次加载的lag。

    例子2:
    从磁盘读取一个1.unity3d文件到内存并建立一个AssetBundle1对象
    AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d");
    从AssetBundle1里读取并创建一个Texture Asset,把obj1的主贴图指向它
    obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as Texture;
    把obj2的主贴图也指向同一个Texture Asset
    obj2.renderer.material.mainTexture =obj1.renderer.material.mainTexture;
    Texture是引用对象,永远不会有自动复制的情况出现(除非你真需要,用代码自己实现copy),只会是创建和添加引用
    如果继续:
    AssetBundle1.Unload(true) 那obj1和obj2都变成黑的了,因为指向的Texture Asset没了
    如果:
    AssetBundle1.Unload(false) 那obj1和obj2不变,只是AssetBundle1的内存镜像释放了
    继续:
    Destroy(obj1),//obj1被释放,但并不会释放刚才Load的Texture
    如果这时候:
    Resources.UnloadUnusedAssets();
    不会有任何内存释放 因为Texture asset还被obj2用着
    如果
    Destroy(obj2)
    obj2被释放,但也不会释放刚才Load的Texture
    继续
    Resources.UnloadUnusedAssets();
    这时候刚才load的Texture Asset释放了,因为没有任何引用了
    最后CG.Collect();
    强制立即释放内存
    由此可以引申出论坛里另一个被提了几次的问题,如何加载一堆大图片轮流显示又不爆掉
    不考虑AssetBundle,直接用www读图片文件的话等于是直接创建了一个Texture Asset
    假设文件保存在一个List里
    TLlist<string> fileList;
    int n=0;
    IEnumerator OnClick()
    {
    WWW image = new www(fileList[n++]);
    yield return image;
    obj.mainTexture = image.texture;

    n = (n>=fileList.Length-1)?0:n;
    Resources.UnloadUnusedAssets();
    }
    这样可以保证内存里始终只有一个巨型Texture Asset资源,也不用代码追踪上一个加载的Texture Asset,但是速度比较慢
    或者:
    IEnumerator OnClick()
    {
    WWW image = new www(fileList[n++]);
    yield return image;
    Texture tex = obj.mainTexture;
    obj.mainTexture = image.texture;

    n = (n>=fileList.Length-1)?0:n;
    Resources.UnloadAsset(tex);
    }
    这样卸载比较快

     

     

    Hog的评论引用:

    感觉这是Unity内存管理暗黑和混乱的地方,特别是牵扯到Texture
    我最近也一直在测试这些用AssetBundle加载的asset一样可以用Resources.UnloadUnusedAssets卸载,但必须先AssetBundle.Unload,才会被识别为无用的asset。比较保险的做法是
    创建时:
    先建立一个AssetBundle,无论是从www还是文件还是memory
    用AssetBundle.load加载需要的asset
    用完后立即AssetBundle.Unload(false),关闭AssetBundle但不摧毁创建的对象和引用
    销毁时:
    对Instantiate的对象进行Destroy
    在合适的地方调用Resources.UnloadUnusedAssets,释放已经没有引用的Asset.
    如果需要立即释放加上GC.Collect()
    这样可以保证内存始终被及时释放
    只要你Unload过的AssetBundle,那些创建的对象和引用都会在LoadLevel时被自动释放。

     

    全面理解Unity加载和内存管理机制之二:进一步深入和细节
    Unity几种动态加载Prefab方式的差异:
    其实存在3种加载prefab的方式:
    一是静态引用,建一个public的变量,在Inspector里把prefab拉上去,用的时候instantiate
    二是Resource.Load,Load以后instantiate
    三是AssetBundle.Load,Load以后instantiate
    三种方式有细节差异,前两种方式,引用对象texture是在instantiate时加载,而assetBundle.Load会把perfab的全部 assets都加载,instantiate时只是生成Clone。所以前两种方式,除非你提前加载相关引用对象,否则第一次instantiate时会 包含加载引用类assets的操作,导致第一次加载的lag。官方论坛有人说Resources.Load和静态引用是会把所有资源都预先加载的,反复测试的结果,静态引用和Resources.Load也是OnDemand的,用到时才会加载。

    几种AssetBundle创建方式的差异:
    CreateFromFile:这种方式不会把整个硬盘AssetBundle文件都加载到 内存来,而是类似建立一个文件操作句柄和缓冲区,需要时才实时Load,所以这种加载方式是最节省资源的,基本上AssetBundle本身不占什么内 存,只需要Asset对象的内存。可惜只能在PC/Mac Standalone程序中使用。
    CreateFromMemory和www.assetBundle:这两种方式AssetBundle文件会整个镜像于内存中,理论上文件多大就需要多大的内存,之后Load时还要占用额外内存去生成Asset对象。

    什么时候才是UnusedAssets?
    看一个例子:
    Object obj = Resources.Load("MyPrefab");
    GameObject instance = Instantiate(obj) as GameObject;
    .........
    Destroy(instance);
    创建随后销毁了一个Prefab实例,这时候 MyPrefab已经没有被实际的物体引用了,但如果这时:
    Resources.UnloadUnusedAssets();
    内存并没有被释放,原因:MyPrefab还被这个变量obj所引用
    这时候:
    obj  = null;
    Resources.UnloadUnusedAssets();
    这样才能真正释放Assets对象
    所以:UnusedAssets不但要没有被实际物体引用,也要没有被生命周期内的变量所引用,才可以理解为 Unused(引用计数为0)
    所以所以:如果你用个全局变量保存你Load的Assets,又没有显式的设为null,那 在这个变量失效前你无论如何UnloadUnusedAssets也释放不了那些Assets的。如果你这些Assets又不是从磁盘加载的,那除了 UnloadUnusedAssets或者加载新场景以外没有其他方式可以卸载之。

    一个复杂的例子,代码很丑陋实际也不可能这样做,只是为了加深理解

    IEnumerator OnClick()

    {

    Resources.UnloadUnusedAssets();//清干净以免影响测试效果

    yield return new WaitForSeconds(3);

    float wait = 0.5f;

    //用www读取一个assetBundle,里面是一个Unity基本球体和带一张大贴图的材质,是一个Prefab

    WWW aa = new WWW(@"file://SpherePrefab.unity3d");

    yield return aa;

    AssetBundle asset = aa.assetBundle;

    yield return new WaitForSeconds(wait);//每步都等待0.5s以便于分析结果

    Texture tt = asset.Load("BallTexture") as  Texture;//加载贴图

    yield return new WaitForSeconds(wait);

    GameObject ba = asset.Load("SpherePrefab") as  GameObject;//加载Prefab

    yield return new WaitForSeconds(wait);

    GameObject obj1 = Instantiate(ba) as GameObject;//生成实例

    yield return new WaitForSeconds(wait);

    Destroy(obj1);//销毁实例

    yield return new WaitForSeconds(wait);

    asset.Unload(false);//卸载Assetbundle

    yield return new WaitForSeconds(wait);

    Resources.UnloadUnusedAssets();//卸载无用资源

    yield return new WaitForSeconds(wait);

    ba = null;//将prefab引用置为空以后卸无用载资源

    Resources.UnloadUnusedAssets();

    yield return new WaitForSeconds(wait);

    tt = null;//将texture引用置为空以后卸载无用资源

    Resources.UnloadUnusedAssets();

    }

    这是测试结果的内存Profile曲线图


    Unity3D占用内存太大怎么解决呢?

    图片:p12.jpg

    很经典的对称造型,用多少释放多少。

    这是各阶段的内存和其他数据变化


    说明:
    1        初始状态
    2        载入AssetBundle文件后,内存多了文件镜像,用量上升,Total Object和Assets增加1(AssetBundle也是object)
    3        载入Texture后,内存继续上升,因为多了Texture Asset,Total Objects和Assets增加1
    4        载入Prefab后,内存无明显变化,因为最占内存的Texture已经加载,Materials上升是因为多了Prefab的材质,Total Objects和Assets增加6,因为 Perfab 包含很多 Components
    5        实例化Prefab以后,显存的Texture Memory、GameObjectTotal、Objects in Scene上升,都是因为实例化了一个可视的对象
    6        销毁实例后,上一步的变化还原,很好理解
    7        卸载AssetBundle文件后,AssetBundle文件镜像占用的内存被释放,相应的Assets和Total Objects Count也减1
    8        直接Resources.UnloadUnusedAssets,没有任何变化,因为所有Assets引用并没有清空
    9        把Prefab引用变量设为null以后,整个Prefab除了Texture外都没有任何引用了,所以被UnloadUnusedAssets销毁,Assets和Total Objects Count减6
    10        再把Texture的引用变量设为null,之后也被UnloadUnusedAssets销毁,内存被释放,assets和Total Objects Count减1,基本还原到初始状态

    从中也可以看出:
    Texture加载以后是到内存,显示的时候才进入显存的Texture Memory。
    所有的东西基础都是Object
    Load的是Asset,Instantiate的是GameObject和Object in Scene
    Load的Asset要Unload,new的或者Instantiate的object可以Destroy

     

    Unity 3D中的内存管理

    Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极 差的体验。类似这种情况并不少见,但是绝大部分都是可以避免的。虽然理论上Unity的内存管理系统应当为开发者分忧解难,让大家投身到更有意义的事情中 去,但是对于Unity对内存的管理方式,官方文档中并没有太多的说明,基本需要依靠自己摸索。最近在接手的项目中存在严重的内存问题,在参照文档和 Unity Answer众多猜测和证实之后,稍微总结了下Unity中的内存的分配和管理的基本方式,在此共享。

    虽然Unity标榜自己的内存使用全都是“Managed Memory”,但是事实上你必须正确地使用内存,以保证回收机制正确运行。如果没有做应当做的事情,那么场景和代码很有可能造成很多非必要内存的占用, 这也是很多Unity开发者抱怨内存占用太大的原因。接下来我会介绍Unity使用内存的种类,以及相应每个种类的优化和使用的技巧。遵循使用原则,可以 让非必要资源尽快得到释放,从而降低内存占用。

     

    Unity中的内存种类

    实际上Unity游戏使用的内存一共有三种:程序代码、托管堆(Managed Heap)以及本机堆(Native Heap)。

    程序代码包括了所有的Unity引擎,使用的库,以及你所写的所有的游戏代码。在编译后,得到的运行文件将会被加载到设备中执行,并占用一定内存。

    这部分内存实际上是没有办法去“管理”的,它们将在内存中从一开始到最后一直存在。一个空的Unity默认场景,什么代码都不放,在iOS设备上占 用内存应该在17MB左右,而加上一些自己的代码很容易就飙到20MB左右。想要减少这部分内存的使用,能做的就是减少使用的库,稍后再说。

    托管堆是被Mono使用的一部分内存。Mono项目一个开源的.net框架的一种实现,对于Unity开发,其实充当了基本类库的角色。

    托管堆用来存放类的实例(比如用new生成的列表,实例中的各种声明的变量等)。“托管”的意思是Mono“应该”自动地改变堆的大小来适应你所需要的内存,

    并且定时地使用垃圾回收(Garbage Collect)来释放已经不需要的内存。关键在于,有时候你会忘记清除对已经不需要再使用的内存的引用,

    从而导致Mono认为这块内存一直有用,而无法回收。

    最后,本机堆是Unity引擎进行申请和操作的地方,比如贴图,音效,关卡数据等。Unity使用了自己的一套内存管理机制来使这块内存具有和托管堆类似的功能。

    基本理念是,如果在这个关卡里需要某个资源,那么在需要时就加载,之后在没有任何引用时进行卸载。听起来很美好也和托管堆一样,

    但是由于Unity有一套自动加载和卸载资源的机制,让两者变得差别很大。自动加载资源可以为开发者省不少事儿,

    但是同时也意味着开发者失去了手动管理所有加载资源的权力,这非常容易导致大量的内存占用(贴图什么的你懂的),

    也是Unity给人留下“吃内存”印象的罪魁祸首。


     

    优化程序代码的内存占用

    这部分的优化相对简单,因为能做的事情并不多:主要就是减少打包时的引用库,改一改build设置即可。

    对于一个新项目来说不会有太大问题,但是如果是已经存在的项目,可能改变会导致原来所需要的库的缺失(虽说一般来说这种可能性不大),

    因此有可能无法做到最优。

     

    当使用Unity开发时,默认的Mono包含库可以说大部分用不上,在Player Setting(Edit->Project Setting->Player或者Shift+Ctrl(Command)+B里的Player Setting按钮)

    面板里,将最下方的Optimization栏目中“Api Compatibility Level”选为.NET 2.0 Subset,表示你只会使用到部分的.NET 2.0 Subset,不需要Unity将全部.NET的Api包含进去。接下来的“Stripping Level”表示从build的库中剥离的力度,每一个剥离选项都将从打包好的库中去掉一部分内容。你需要保证你的代码没有用到这部分被剥离的功能,

    选为“Use micro mscorlib”的话将使用最小的库(一般来说也没啥问题,不行的话可以试试之前的两个)。库剥离可以极大地降低打包后的程序的尺寸以及程序代码的内存占用,唯一的缺点是这个功能只支持Pro版的Unity。

    这部分优化的力度需要根据代码所用到的.NET的功能来进行调整,有可能不能使用Subset或者最大的剥离力度。

    如果超出了限度,很可能会在需要该功能时因为找不到相应的库而crash掉(iOS的话很可能在Xcode编译时就报错了)。

    比较好地解决方案是仍然用最强的剥离,并辅以较小的第三方的类库来完成所需功能。

    一个最常见问题是最大剥离时Sysytem.Xml是不被Subset和micro支持的,如果只是为了xml,完全可以导入一个轻量级的xml库来解决依赖(Unity官方推荐这个)。

    关于每个设定对应支持的库的详细列表,可以在这里找到。关于每个剥离级别到底做了什么,Unity的文档也有说明。

    实际上,在游戏开发中绝大多数被剥离的功能使用不上的,因此不管如何,库剥离的优化方法都值得一试。


     

    托管堆优化

    Unity有一篇不错的关于托管堆代码如何写比较好的说明,在此基础上我个人有一些补充。

    首先需要明确,托管堆中存储的是你在你的代码中申请的内存(不论是用js,C#还是Boo写的)。

    一般来说,无非是new或者Instantiate两种生成object的方法(事实上Instantiate中也是调用了new)。

    在接收到alloc请求后,托管堆在其上为要新生成的对象实例以及其实例变量分配内存,如果可用空间不足,则向系统申请更多空间。

    当你使用完一个实例对象之后,通常来说在脚本中就不会再有对该对象的引用了(这包括将变量设置为null或其他引用,超出了变量的作用域,

    或者对Unity对象发送Destory())。在每隔一段时间,Mono的垃圾回收机制将检测内存,将没有再被引用的内存释放回收。总的来说,

    你要做的就是在尽可能早的时间将不需要的引用去除掉,这样回收机制才能正确地把不需要的内存清理出来。但是需要注意在内存清理时有可能造成游戏的短时间卡顿,

    这将会很影响游戏体验,因此如果有大量的内存回收工作要进行的话,需要尽量选择合适的时间。

    如果在你的游戏里,有特别多的类似实例,并需要对它们经常发送Destroy()的话,游戏性能上会相当难看。比如小熊推金币中的金币实例,按理说每枚金币落下台子后

    都需要对其Destory(),然后新的金币进入台子时又需要Instantiate,这对性能是极大的浪费。一种通常的做法是在不需要时,不摧毁这个GameObject,而只是隐藏它,

    并将其放入一个重用数组中。之后需要时,再从重用数组中找到可用的实例并显示。这将极大地改善游戏的性能,相应的代价是消耗部分内存,一般来说这是可以接受的。

    关于对象重用,可以参考Unity关于内存方面的文档中Reusable Object Pools部分,或者Prime31有一个是用Linq来建立重用池的视频教程(Youtube,需要FQ,上,下)。

    如果不是必要,应该在游戏进行的过程中尽量减少对GameObject的Instantiate()和Destroy()调用,因为对计算资源会有很大消耗。在便携设备上短时间大量生成和摧毁物体的

    话,很容易造成瞬时卡顿。如果内存没有问题的话,尽量选择先将他们收集起来,然后在合适的时候(比如按暂停键或者是关卡切换),将它们批量地销毁并 且回收内存。Mono的内存回收会在后台自动进行,系统会选择合适的时间进行垃圾回收。在合适的时候,也可以手动地调用 System.GC.Collect()来建议系统进行一次垃圾回收。

    要注意的是这里的调用真的仅仅只是建议,可能系统会在一段时间后在进行回收,也可能完全不理会这条请求,不过在大部分时间里,这个调用还是靠谱的。


     

    本机堆的优化

    当你加载完成一个Unity的scene的时候,scene中的所有用到的asset(包括Hierarchy中所有GameObject上以及脚本中赋值了的的材质,贴图,动画,声音等素材),

    都会被自动加载(这正是Unity的智能之处)。也就是说,当关卡呈现在用户面前的时候,所有Unity编辑器能认识的本关卡的资源都已经被预先加 入内存了,这样在本关卡中,用户将有良好的体验,不论是更换贴图,声音,还是播放动画时,都不会有额外的加载,这样的代价是内存占用将变多。Unity最 初的设计目的还是面向台式机,

    几乎无限的内存和虚拟内存使得这样的占用似乎不是问题,但是这样的内存策略在之后移动平台的兴起和大量移动设备游戏的制作中出现了弊端,因为移动设 备能使用的资源始终非常有限。因此在面向移动设备游戏的制作时,尽量减少在Hierarchy对资源的直接引用,而是使用Resource.Load的方 法,在需要的时候从硬盘中读取资源,

    在使用后用Resource.UnloadAsset()和Resources.UnloadUnusedAssets()尽快将其卸载掉。总之,这里是一个处理时间和占用内存空间的trade off,

    如何达到最好的效果没有标准答案,需要自己权衡。

    在关卡结束的时候,这个关卡中所使用的所有资源将会被卸载掉(除非被标记了DontDestroyOnLoad)的资源。注意不仅是DontDestroyOnLoad的资源本身,

    其相关的所有资源在关卡切换时都不会被卸载。DontDestroyOnLoad一般被用来在关卡之间保存一些玩家的状态,比如分数,级别等偏向文 本的信息。如果DontDestroyOnLoad了一个包含很多资源(比如大量贴图或者声音等大内存占用的东西)的话,这部分资源在场景切换时无法卸 载,将一直占用内存,

    这种情况应该尽量避免。

    另外一种需要注意的情况是脚本中对资源的引用。大部分脚本将在场景转换时随之失效并被回收,但是,在场景之间被保持的脚本不在此列(通常情况是被附 着在DontDestroyOnLoad的GameObject上了)。而这些脚本很可能含有对其他物体的Component或者资源的引用,这样相关的 资源就都得不到释放,

    这绝对是不想要的情况。另外,static的单例(singleton)在场景切换时也不会被摧毁,同样地,如果这种单例含有大量的对资源的引用,也会成为大问题。

    因此,尽量减少代码的耦合和对其他脚本的依赖是十分有必要的。如果确实无法避免这种情况,那应当手动地对这些不再使用的引用对象调用Destroy()

    或者将其设置为null。这样在垃圾回收的时候,这些内存将被认为已经无用而被回收。

    需要注意的是,Unity在一个场景开始时,根据场景构成和引用关系所自动读取的资源,只有在读取一个新的场景或者reset当前场景时,才会得到清理。

    因此这部分内存占用是不可避免的。在小内存环境中,这部分初始内存的占用十分重要,因为它决定了你的关卡是否能够被正常加载。因此在计算资源充足

    或是关卡开始之后还有机会进行加载时,尽量减少Hierarchy中的引用,变为手动用Resource.Load,将大大减少内存占用。在 Resource.UnloadAsset()和Resources.UnloadUnusedAssets()时,只有那些真正没有任何引用指向的资源 会被回收,因此请确保在资源不再使用时,将所有对该资源的引用设置为null或者Destroy。

    同样需要注意,这两个Unload方法仅仅对Resource.Load拿到的资源有效,而不能回收任何场景开始时自动加载的资源。与此类似的还有 AssetBundle的Load和Unload方法,灵活使用这些手动自愿加载和卸载的方法,是优化Unity内存占用的不二法则~

    总之这些就是关于Unity3d优化细节,具体还是查看Unity3D的技术手册,以便实现最大的优化.

    原帖:http://www.onevcat.com/2012/11/memory-in-unity3d/

    展开全文
  • 4)Unity如何烘焙透贴阴影做出真实影子 5)iOS下打包AssetBundle出现错误 这是第187篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。 UWA ...

    1)NGUI与新版Prefab系统冲突问题
    2)关于HUD的问题
    3)RawImage设置DefaultHDR格式的RenderTexture后颜色异常
    4)Unity如何烘焙透贴阴影做出真实影子
    5)iOS下打包AssetBundle出现错误

    这是第187篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

    UWA 问答社区:answer.uwa4d.com
    UWA QQ群2:793972859(原群已满员)


    NGUI

    Q:Unity 2018.4.0,NGUI的预设物点击inspector中“Open Prefab”报错。

     

    A:我们的项目升级完成后也遇到了这个问题,据说是因为NGUI的部分代码与新的Prefab工作流不兼容,产生的原因没有深究过。

    对于这种不能在Prefab Mode中编辑的Prefab,如果想修改,我们的做法是在场景中生成Prefab的实例,然后断开Prefab关系,改好之后再覆盖回原来的Prefab。

     

    感谢BingLau@UWA问答社区提供了回答,欢迎大家转至社区交流:
    https://answer.uwa4d.com/question/5de0d4fe14ec712eefaf0226


    Rendering

    Q:请问如何让角色头顶名字(HUD)既能与场景中物体有正确遮挡关系,又不受场景后效的影响?

    我尝试过两个方案:
    1、使用两个相机,第一个相机渲染场景并附带后处理,第二个相机专门渲染HUD,并将Clear Flag 设置为 Don’t Clear。但是iOS平台开启MSAA后,第一个相机的depthBuffer就频繁出错。判断跟MSAA的Resolve有关,但不知道如何解决。
    2、单个相机渲染,然后使用Stencil来区分是否处理后效。但是Stencil在blit之后就没法正常使用了。(尝试过钱康来的https://www.qiankanglai.me/2015/03/07/unity-posteffect-stencil/在OnPostRender()中进行SetRenderTarget(),编辑器上正常,但到iPhone上就不行)

    A:关于在后处理之后用CommandBuffer绘制HUD,我想到:
    用DrawMesh(DrawRenderer不能用于Canvas Renderer)绘制,那么就要手动从后往前排序(这些HUD是半透明的)一个个绘制,并且在C#中手动计算位置Matrix。并根据场景中HUD出现和消失的情况、前后顺序的变化,频繁修改CommandBuffer去Drawmesh。不知道是否有更好的方法。

    感谢题主秦威@UWA问答社区提供了回答,欢迎大家转至社区交流:
    https://answer.uwa4d.com/question/5dc432f914ec712eefaf0179


    Shader

    Q:查看FrameDebugger发现,RenderTexture进入UI/Default Shader之前还是对的,经过这个Shader处理后颜色就异常了。

    具体效果如下图所示:

    本人对Shader不熟,请问大家知道是什么原因导致的吗?

    A:正常情况赋给RawImage的贴图,其Alpha值只为0或1,RenderTexture则是已经对Alpha值已经进行了处理。

    UI/Default Shader的Blend默认为SrcAlpha OneMinusSrcAlpha,对于RenderTexture相当于多乘了一次Alpha值,改为One Zero就会正常。

    感谢题主于翔@UWA问答社区提供了回答,欢迎大家转至社区交流:
    https://answer.uwa4d.com/question/5dea4dc373f93355f9667ed0


    Rendering

    Q:Unity烘焙透贴阴影可以做真实影子吗?现在想烘出比较真实的阴影,考虑省内存的情况下不用混合和实时,只用烘焙光来做怎么做到比较真实的阴影?(接近一点也可以,不要太模糊)

    A:对于常规方案来说,要想马儿不吃草,又想马儿跑得快是挺难的,各种方案总有取舍。
    要是只说烘焙,常规的做法有:
    1、提高Lightmap贴图尺寸,这个效果提升最直接,代价就是内存和包体。
    2、调整烘焙参数,这块细节很多,可以参考这篇文章:http://ixulin.com/2017/05/03/talk-bake-in-unity/,讲得挺好的。调整得好,可以让视角中心位置的阴影效果质量较高,而整体Lightmap的占用较为合理。
    3、关注下Lightmap的压缩方式,这块可能影响真机设备上的效果。

    感谢贾伟昊@UWA问答社区提供了回答,欢迎大家转至社区交流:
    https://answer.uwa4d.com/question/5d9f240af4053b206c80f87c


    Build

    Q:打包iOS下的AssetBundle的时候,出现错误。提示:

    Moving file failed

    Moving Temp/unitystream.unity3d to /Users/jufeng/Desktop/jufeng/trunk/src/Client/Game3D/Platform_ab/IOS/AssetBundles/effectcommon/water_fall: No such file or directory

    求助,怎么解决这个呢?同样的资源在Android平台没问题。(版本:Unity 2018.3.8f1)

    A:自己测试了,是因为对应的AssetBundle里面包含了dds格式的图片(美术提交时没注意)。这个在Android打就没问题,在iOS就报错了。把dds的改成了png就没问题了。

    感谢题主逃逸速度@UWA问答社区提供了回答,欢迎大家转至社区交流:
    https://answer.uwa4d.com/question/5dedb6ed73f93355f9667ed2

    封面图来源于网络


    今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

    官网:www.uwa4d.com
    官方技术博客:blog.uwa4d.com
    官方问答社区:answer.uwa4d.com
    UWA学堂:edu.uwa4d.com
    官方技术QQ群:793972859(原群已满员)

    展开全文
  • http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html 最简单的优化建议: 1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与...
  • 使用Unity3D制作真实地形的两种方法: 1、在SceneView中使用height tools直接绘制; 2、使用外部工具制作的heightmaps;   具体操作如下: 1、准备一块DEM数据,格式为img或tiff,并准备好Global Mapper和...
  • unity3d 各种优化综合

    2014-09-15 14:49:24
    [基础知识]Unity3d优化与检测方式   本帖最后由 诸葛高原 于 2014-5-21 11:34 编辑  检测方式:  一,unity3d 渲染统计窗口  Game视窗的Stats去查看渲染统计的信息: ...
  • Unity3D通过代码生成Prefab并导出UnityPackage首先要明确的问题Prefab的生成UnityPackage的导出 首先要明确的问题 不管是生成Prefab和导出UnityPackage都是只有在编辑器环境下才能使用(在编辑器下运行时也可以) ...
  • Unity3D点击UI图片生成模型预设物 目录 1、博客介绍 2、内容 (1)演示 (2)生成 (3)生成物体移动 3、推送 4、结语 1、博客介绍 翻出来了之前一个两年前Demo,顺手传上来了,通过点击按钮或者其他UI...
  • Unity3D .asset资源文件

    2018-02-26 14:07:20
    在游戏开发中,经常会用到一些配置文件保存一些数据,然后项目运行中读取这些配置文件中的数据在游戏中使用。如:配置血条:根据角色类型(人物、动物、怪物等)配置不同的血条,包括血条大小,血条名或血条预设,...
  • 选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1、 看到一个帖子: https://qiita.com/chocho/items/51b65c2601c67e5cc6d2 通过脚本克隆UI.Button时,也会复制onClick...
  • Unity3d 资料网站

    2015-05-20 12:16:49
    http://unity3d.com/ Unity 中文官方网: http://unity3d.com/cn 非官方: http://www.unity3d-cn.com/ 0、2014-Unity 发布中文版的手册,所有天朝人都可以享受官方提示的源汁源味的手册内容;...
  • 这个工具呢,博主在Unity3D游戏开发之反编译AssetBundle提取游戏资源这篇文章中其实已经提到过了,不过因为有些朋友对如何使用这个工具依然存在问题,所以博主决定特地写一篇文章来讲解如何使用disunity来提取Unity...
  • 转载自羽化 http://blog.csdn.net/libeifs/article/details/6612919 开发环境 Window 7 Unity3D 3.3.0 MB525 defy Android 2.1-update1 ...2.Unity3D环境搭建与Android软件生成 3.Unity3D
  • http://forum.china.unity3d.com/thread-13968-1-1.html http://blogs.unity3d.com/cn/2015/12/23/1k-update-calls/ Unity有个消息系统,它可以在运行中当发生指定事件时调用你在脚本中定义的那些魔术方法。这是...
  • Unity3d与Android通信

    2018-06-02 23:54:03
    先交代几点 1.u3d可以直接打包成APK或android项目(项目可以在androidIDE中直接运行)供android二次开发 2.android目前最新也是官方支持的方式是使用...一.Unity3d调用Android方法 先介绍一下u3d中调用android...
  • 在使用Unity3D进行开发时,我们通常需要生成自己的网格来进行控制,比如进行图像变形等等。本文将介绍如何在Unity3D生成一个网格。  首先,需要在空间中生成顶点,然后在定义三角面片顶点序号。生成网格的代码...
1 2 3 4 5 ... 20
收藏数 7,181
精华内容 2,872