2015-02-08 17:24:04 u014678046 阅读数 1670
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4715 人正在学习 去看看 张刚

对于Unity3d的资源管理已经研究了很久,大概是从大学毕业到现在,依然在不断的探索着,这期间不断的在网上查看各位大神们的讲解,然后自己就研究,也做部分实验,发现其实要很好地管理起来是很容易的,资源更新,加载,卸载对于一款游戏来说是十分重要的,首先我从资源更新说起。

一、资源更新现在有很多的办法,Unity3d提供了很多种资源管理方式。1、你可以将资源存放在工程目录的Resource文件夹下面,这个文件夹下面的资源会随着你导出平台安装包的时候加密到你的安装包里面,unity程序在运行的时候会根据自己的资源加载思路将场景里面用到的资源进行加载,但是这部分资源是不能够及时更新的,也就是说,资源跟新不能考虑这个文件夹;2、unity工程下面还有一个特殊的文件夹,就是StreamingAssets文件夹,这个文件夹会在你导出的时候原封不动的考到安装包里面,在释放到平台上面,注意一点,他是原封不动的,这就需要你采用自己的加密方式,要不会很容易被破解的,这部分资源在各个平台上是可以访问到,安卓手机上面用WWW类进行读取,PC,以及iPhone可以用File类进行读取,很方便。上述两个文件夹是unity提供给我们的,很方便,哈哈。
我自己在研究了那么久之后,决定将大部分用到的,可能需要经常更新的资源存放到了StreamingAssets目录下面,有用到的ngui的图集,以及预设等等,由于iPhone不支持代码更新,我们就在脚本中运用了lua代码,我们采用的是ulua,这都是跟着群里面的大神学习的,首先游戏安装到设备上头一回运行的时候,会将StreamingAssets下面的资源进行复制,释放到平台上面我们自己指定的目录,需要获得读写权限,这个路径Application.streamingAssetsPath就是平台上面的StreamingAssets所在的位置,然后在安卓手机上面访问内置sd卡或sd卡1的路径为/mnt/sdcard,在4.1以后也可用路径/storage/sdcard0这个路径,最后在这个历经下面建立文件夹,存放自己的资源。在iPhone以及PC上面完全可以使用Application.persistentDataPath这个目录进行资源的存放。资源存放好了就可以准备更新了,www可以访问你自己的资源服务器,游戏资源存放得当之后便可以调用new WWW(地址);来进行下载,我们的做法是资源释放到了本地,然后会从服务器上面下载最新的资源配置文件,lua太伟大了,既可以写程序也可以作为配置文件,哈哈,我就将资源的名称以及他们的md5值存放在lua的table里面,然后就是表的遍历了,方法很多,ulua在这方面已经完全可以胜任,支持安卓PC以及iPhone,wp推荐用nlua,nlua我不会,哈哈,怎样打assetbundle类型的资源包网上教程很多,也很详细,如果资源包过大,也可以考虑一下采用压缩,有7z,网上有宣雨松的例子,很好。遍历配置表格,进行md5比对,不同的就进行下载,最终进入游戏。建议是资源尽量分的细一些,这样既方便局部资源的整体替换,同时也有利于团队分工开发,后期的更新维护也会很简单,你可以参考一下别人的安装包,解压看看里面的资源是怎么布置的,看看就好呀,哈哈。共同学习。
二、下面就是资源的加载了,建议大家对Resource类进行适当的利用然后写出一个自己能够方便使用的资源加载类,首先可以从Resource目录下面方便的加载,然后还要很方便的从assetbundle里面进行加载,assetbundle里面的资源你想要用的时候要提前加载,建议做在loading界面里面,这样用户体验会好一些,因为此时用户的耐心是最大的,你一卡一卡的,老板都会揍你,哈哈,这个加载类可以加载assetbundle里面的东西,并将加载的assetbundle交给全局的加载对象管理器,以便进行及时的释放,关于assetbundle的完全释放,网上讲的很多,也很好,我这里面总结一下整体的过程,仅供参考:
1.首先记录下已经加载的assetbundle,以便你好释放;
2.将预设或者图集,图片从里面加载出来,记录;
3.将在第2步里面加载的东西放到场景的某个对象上面,或者直接实例化预设,将这个放到场景里面的这个对象记录下来,因为它上面有对asser的引用;
4.在一个assetbundlle里面所有的用到的资源都加在出来之后,执行语句Resources.UnloadUnusedAssets();会将不用了的asset占用的内存释放出来;
5.场景中通过某一个assetbundle创建的对象或者依附的对象没什么用处的时候,将对象进行Destroy(对象);这个方法,这样对象会从场景里面消失,同时它所引用的资源就没有存在的意义了;
6.将销毁的对象所用的assetbundle执行assetbundle.Unload(false);,这样就会将已经记录的资源包所占用的内存镜像会完全卸载;
7.Resources.UnloadUnusedAssets();卸载没有用到的资源;
8.将记录的加载过的预设,等资源设置为null;
9.Resources.UnloadUnusedAssets();释放资源,
10.调用系统的垃圾回收站清理函数GC.Collect();
通过上面十个步骤,就可以将引用的assetbundle进行彻底的释放,由于在代码里面我与用到了lua脚本,就可能会存在lua的引用,这时需要在第8个步骤里面调用一下lua自身的垃圾回收函数collectgarbage();然后再进行第9步,实验证明是可以的。
我在实际的过程中就是采用的如此的资源更新,加载,以及释放的过程,很方便,没有提到的就是工程里面要有一个对象管理器,就是对象池,需要你对对象进行比较明确的管理,时刻明白场景里面哪些是有用的,哪些是可以释放卸载掉的,这样,unity3d的游戏在平台上才不会内存一直飙高,可能引起的游戏闪退等现象,卡顿也会避免。
最后,大家加油呀!快过年了,程序员还没放假,哈哈
下面是我自己的部分代码,很简单的,只供参考,嘿嘿

--关闭面板(Lua脚本),将场景里面的已将创建的面板进行销毁--GameObjectMgr是我自己写的一个很简单的管理器
function CloseWindow(args)
    if(args==nil)then
        print('ERROR    变量未正确赋值');
        return;
    end

    local   _iswindestory       =args['_iswindestory']
    local   _winname            =args['_winname']
    local   _isassetdestory =args['_isassetdestory']
    local   _assetname          =args['_assetname']
    local   _ispbdestory        =args['_ispbdestory']
    local   _prefabname         =args['_prefabname']

    if(GameObjectMgr.IsObjCreated(_winname)==false)then
        print("指定窗口不存在,不需要关闭 :",_winname);
        return;
    end

    args =nil;

    if(_ispbdestory)then
        GameObjectMgr.AdddestoryPerfabList (_prefabname);
    end
    if(_iswindestory)then
        print('销毁窗口');
        GameObjectMgr.AdddestoryObjNameList (_winname);
    else
        print('窗口隐藏');
        GameObjectMgr.SetObjActivePority(_winname,false);
    end
    if(_isassetdestory)then
        GameObjectMgr.AdddestoryABList (_assetname);
    end
    collectgarbage();
    --下面将会进行对象销毁,内存释放内存释放
    GameObjectMgr.FreeMemory ();

end

改日把我的GameObjectMgr也加进来,供大家参考,周末愉快,下周末我也就放假啦,哈哈哈,开心的等待着

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameObjectMgr{

    public static       Dictionary<string,GameObject>           loadedPerfabList        =null;      //存放已经加载的预设资源
    public static       Dictionary<string,AssetBundle>          loadedAssetList         =null;      //存放AB包
    public static       Dictionary<string,GameObject>           createdObjList          =null;      //存放创建的对象

    public static       string[]                                destoryPerfabList       =null;      //销毁的预设
    public static       string[]                                destoryAssetList            =null;      //销毁的AB包,unload(false);
    public static       string[]                                destoryObjNameList      =null;      //销毁的对象;
    //设置是否显示
    public static void SetObjActivePority(string _name,bool _active){
        if (createdObjList == null) {
        } else {
            foreach(string key in createdObjList.Keys){
                if(key==_name){
                    if(createdObjList[key]!=null){
                        createdObjList[key].SetActive(_active);
                    }else{
                        createdObjList.Remove(_name);
                    }
                }               
            }   
        }

    }
    //获得一个已经创建的对象
    public static GameObject GetGameObjectByName(string _name){    
        if (createdObjList == null) {
            return null;
        } else {
            foreach(string key in createdObjList.Keys){
                if(key==_name){
                    if(createdObjList[key]!=null){
                        return createdObjList[key];
                    }else{
                        createdObjList.Remove(_name);
                        return null;
                    }
                }               
            }   
        }
        return null;
    }
    //获得一个已经加载的预设
    public static GameObject GetPrefabByName(string _name){    
        if (loadedPerfabList == null) {
            return null;
        } else {
            foreach(string key in loadedPerfabList.Keys){
                if(key==_name){
                    if(loadedPerfabList[key]!=null){
                        return loadedPerfabList[key];
                    }else{
                        loadedPerfabList.Remove(_name);
                        return null;
                    }
                }               
            }   
        }
        return null;
    }

    //查看预设是否加载
    public static bool IsPerfabLoaded(string _name){
        if (loadedPerfabList == null) {
            return false;
        } else {
            foreach(string key in loadedPerfabList.Keys){
                if(key==_name){
                    if(loadedPerfabList[key]!=null)
                        return true;
                    else{
                        loadedPerfabList.Remove(_name);
                        return false;
                    }
                }               
            }   
        }
        return false;
    }
    //对象是否已经被创建
    public static bool IsObjCreated(string _name){
        if (createdObjList == null) {
            return false;
        } else {
            foreach(string key in createdObjList.Keys){
                if(key==_name){
                    if(createdObjList[key]!=null){
                        return true;
                    }else{
                        createdObjList.Remove(_name);
                        return false;
                    }
                }               
            }   
        }
        return false;
    }

    //添加已经创建
    public static void AddCreatedObjList(string _name, GameObject _obj){
        if (createdObjList == null) {
            createdObjList = new Dictionary<string, GameObject>();  
        }
        if(createdObjList.ContainsKey(_name)){
            return ;
        }
        createdObjList.Add (_name,_obj);
    }
    //添加已经加载的assetbundle
    public static void AddloadedAssetList(string _name, AssetBundle _obj){
        if (loadedAssetList == null) {
            loadedAssetList = new Dictionary<string, AssetBundle>();    
        }
        if(loadedAssetList.ContainsKey(_name)){
            return ;
        }
        loadedAssetList.Add (_name,_obj);
    }

    //添加已经加载的预设
    public static void AddloadedPerfabList(string _name, GameObject _obj){
        if (loadedPerfabList == null) {
            loadedPerfabList = new Dictionary<string, GameObject>();    
        }
        if(loadedPerfabList.ContainsKey(_name)){
            return ;
        }
        loadedPerfabList.Add (_name,_obj);
    }

    //添加预设名字
    public static void AdddestoryPerfabList(string _name){
        if (destoryPerfabList == null) {
            destoryPerfabList = new string[1];
            destoryPerfabList[0] = _name;
            return;
        } else {
            int j = destoryPerfabList.Length;
            destoryPerfabList[j] = _name;
            return;
        }
    }

    //添加对象名字
    public static void AdddestoryObjNameList(string _name){
        if (destoryObjNameList == null) {
            destoryObjNameList = new string[1];
            destoryObjNameList[0] = _name;
            return;
        } else {
            int i=destoryObjNameList.Length;
            destoryObjNameList[i] = _name;
            return;
        }
    }
    //添加assetbundle名字
    public static void AdddestoryABList(string _name){
        if (destoryAssetList == null) {
            destoryAssetList = new string[1];
            destoryAssetList[0] =_name;
            return;
        } else {
            int j = destoryAssetList.Length;
            destoryAssetList[j] = _name;
            return;
        }
    }
    //清理内存
    public static void FreeMemory(){
        if (destoryObjNameList == null&&destoryPerfabList.Length== null&&destoryAssetList== null) {
            Debug.Log("不需要释放资源");   
            return;
        }
        int i = 0;
        if (destoryObjNameList != null) {
            i = destoryObjNameList.Length;
            for(int j = i-1;j>=0;j--){
                if(destoryObjNameList[j]!=null)
                if(createdObjList.ContainsKey(destoryObjNameList[j])){
                    GameObject obj=createdObjList[destoryObjNameList[j]];
                    createdObjList.Remove(destoryObjNameList[j]);
                    GameObject.Destroy(obj);
                }
                destoryObjNameList[j]=null;
            }   
        }

        destoryObjNameList = null;
        if (destoryPerfabList != null) {
            i = destoryPerfabList.Length;
            for(int j = i-1;j>=0;j--){
                if(destoryPerfabList[j]!=null)
                if(loadedPerfabList.ContainsKey(destoryPerfabList[j])){
                    loadedPerfabList[destoryPerfabList[j]]=null;
                    loadedPerfabList.Remove(destoryPerfabList[j]);
                }
                destoryPerfabList[j]=null;
            }   
        }

        destoryPerfabList = null;

        if (destoryAssetList == null || destoryAssetList.Length == 0) {
        } else {
            i = destoryAssetList.Length;
            for(int j =i-1;j>=0;j--){
                if(destoryAssetList[j]!=null)
                    if(loadedAssetList.ContainsKey(destoryAssetList[j]))
                        AssetBundle asset = loadedAssetList[destoryAssetList[j]];
                        loadedAssetList.Remove(destoryAssetList[j]);
                        asset.Unload(false);
                    }
                destoryAssetList[j]=null;
            }
        }

        destoryAssetList = null;
        Resources.UnloadUnusedAssets ();
        System.GC.Collect ();
    }
}
2013-03-05 10:43:54 GaaMian 阅读数 2025
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4715 人正在学习 去看看 张刚

Unity3D资源下载:

1、2013最新unity3d4.0.1下载

http://unity3d.com/unity/download/

 

2、2013最新unity3d4.0.1 f2 pro 完美破解补丁

http://download.csdn.net/detail/gaamian/5098723

 

3、2013最新unity3d中文教程手册大全 参考手册,脚本手册,组件手册

http://download.csdn.net/detail/gaamian/5098779

 

4、Unity3D坦克大战 源代码(3D)游戏开发

http://download.csdn.net/detail/gaamian/5098820

 

5、Unity3D坦克大战3D中文视频教程及源代码下载BT种子

http://download.csdn.net/detail/gaamian/5099103

 

Unity3D中文视频教程:

1、       Unity3D 愤怒的小鸟 坦克大战 3中文视频教程 附带项目源码

详情及下载地址:

http://item.taobao.com/item.htm?id=22934948906

 

2、       Unity3D 游戏开发 从入门到精通 5 中文视频教程 零基础入门

详情及下载地址:

http://item.taobao.com/item.htm?id=17389198327

 

3、       Unity3D Playmaker 基础入门 中文视频教程

详情及下载地址:

http://item.taobao.com/item.htm?id=17389258273

 

Unity3D中文PDF文档教程:

1、       Unity3D中文参考脚本手册脚本入门 中高级手册入门到精通5PDF

详情及下载地址:

http://item.taobao.com/item.htm?id=17399641138

2、       Unity3D FPS游戏教程 C#完全学习手册 中文版

详情及下载地址:

http://item.taobao.com/item.htm?id=17399561935

 

Unity3D经典项目源码包:

1、       Unity3D制作的2D游戏Ximista the Warrior  项目源码包

详情及下载地址:

http://item.taobao.com/item.htm?id=22940412558

 

2、       Unity3D 经典源码包 3rd Pesron Shooter Kit 第三人称射击游戏包

详情及下载地址:

http://item.taobao.com/item.htm?id=22935408899

 

3、       Unity3D Demo Industrial Arena 工程场景源码包 游戏开发

详情及下载地址:

http://item.taobao.com/item.htm?id=17399701276

 

4、       Unity3D 价值90美元的Unity的环境素材包 全套源代码包

详情及下载地址:

http://item.taobao.com/item.htm?id=19136599556

 

5、       Unity3D 粒子效果教程 源码版 游戏开发

http://download.csdn.net/detail/gaamian/5103864

 

6、       Unity3D游戏开发FBX模型载入与人物行走动画的播放

http://download.csdn.net/detail/gaamian/5099974

 

7、       Unity3D制作的汽车竞技游戏 源码包 游戏开发

http://download.csdn.net/detail/gaamian/5106138

 

8、       Unity3D 宝石迷阵 源代码 游戏开发 附简短视频

http://download.csdn.net/detail/gaamian/5106159

 

 

9、 传智播客Unity3D公开课视频下载地址
http://www.pipipan.com/file/17591726
下载提取码:100231       

  

 

 

 

 

 

 

 

 

 

 

2019-04-10 18:13:24 yffgamestart 阅读数 3090
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4715 人正在学习 去看看 张刚

一个致力于unity游戏,模型,等资源的淘宝店铺,里面有unity3d成品游戏,场景资源,模型资源等,一切资源都特别优惠,店铺链接:【unity3D素材包/unity3d中世纪村庄包Medieval Village Pack】https://m.tb.cn/h.eaENjDH?sm=2b946c 点击链接,再选择浏览器咑閞;或復·制这段描述¥kIKkbAV3c3C¥后到?淘♂寳♀?

店铺链接:
【峰回路转设计之巅】,復·制这段描述¥Rdl0bARAdpZ¥后咑閞?手机淘宝?或者用浏览器咑閞https://m.tb.cn/h.eZyY9BV?sm=f141d2查看

2017-07-16 20:10:17 dark00800 阅读数 16335
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4715 人正在学习 去看看 张刚

Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?

这介绍这些改进之前先放出下载地址:Unity 2017.1
有趣的是通过Unity产品蓝图我们可以发现Unity 2017.2 beta已经提供下载测试并且Unity 2017.3也已经在制作中了。
这里写图片描述
Unity 2017.2 beta下载地址:Unity 2017.2 beta

以下关于Unity2017.1的介绍内容来自Unity官方中文社区,原帖地址:[官方] Unity 2017.1正式版发布

Unity 2017.1中包含大量新功能与改进。主要内容如下:

  • 艺术家和设计师们:全新的叙事和游戏视频创作工具
    Unity 2017.1为艺术家和设计师们提供了全新的工具,使用Timeline,Cinemachine和Post-processing工具,可以创造令人惊叹的影视内容,合成精美相机镜头,描绘更好的视觉故事。
    Timeline是一款强大的可视化新工具,可用于创建影视内容,例如过场动画、预告片、游戏试玩视频等等。
    Cinemachine是一个高级相机系统,您可以像电影导演一样,在Unity中合成镜头,无需编写任何代码,引领您进入程序化摄影时代。
    Post-processing可以很方便地为场景应用各种逼真滤镜,使用电影工业级技术、控件和颜色空间格式来创造高质量视觉效果,让画面更生动、更逼真,助您描绘更好的视觉故事。
  • 效率:协作、实时操作分析、工具
    我们发布了Unity Teams,它由一系列简化创作者协作流程的功能和解决方案组成,包含Collaborate多人协作(现已发布)和Cloud Build云构建。
    实时操作分析系统引入了新的、更简单的方法,帮助您理解用户,并在不需要重新部署的情况下,对游戏做出动态的反应和调整。
    最重要的是,Unity 2017.1对编辑器进行了大量更新,包括对FBX导入、动画工作流程、2D功能、Asset Bundle工作流和Visual Studio集成的改进。
  • 图形与平台:全面改进
    Unity 2017.1对粒子系统和Progressive Lightmapper进行了大量改进,提供了更多选择来实现您的艺术愿景并控制性能。不同平台可采用不同的渲染品质,例如iOS平台上的Deferred Rendering,和PC上的NVIDIA VRWorks。
    这些都只是Unity 2017.1的亮点概念,下面将介绍完整丰富的细节内容!

Unity 2017.1新看点

艺术家叙事工具: Timeline和Cinemachine介绍

设计师、艺术家或动画师们可以使用新的集成叙事工具,自己制作影视内容和游戏视频,而不用依赖程序员。这意味着开发效率更高,而节约沟通与排队成本。

Timeline是一款强大的可视化新工具,可用于创建影视内容(例如短片Adam)。通过编排游戏对象、动画、声音和场景,来创建过场动画、游戏视频等等。有了Timeline,您可以专注于叙事和电影艺术创作,而非编码。

Timeline基于轨道的序列工具,使用“拖放”操作来编排动画、声音、事件、视频等元素,以更快地创建漂亮的过场动画和程序化内容。Timeline有许多功能,例如动画、音频、自动关键帧,以及可以锁定或静音特定轨道的多轨道界面。Timeline可通过Playable API进行扩展,支持创建自定义轨道,来驱动游戏中的任意系统。您可以制作一个Timeline剪辑来表示几乎所有内容——并且可以重复播放、缩放和混合这些剪辑,所有这些都可在Timeline中实现。
这里写图片描述

Cinemachine 是多年游戏和电影摄像机的构建经验凝聚而成的结晶。现在,它将业界领先的摄像操作置于所有人手中,引领了程序化摄影的时代。

这是一套智能摄像机,可以动态的根据场景组成和交互,在最佳时间拍摄最佳镜头。使您摆脱无尽的手工动画、摄像机编程以及修订的过程。

Cinemachine可以在Asset Store资源商店中下载,现在就添加到您的项目中。

从第一人称射击游戏到第三人称动作冒险,您可以用Cinemachine彻底改变游戏内摄像机。很容易地:

  • 像电影导演那样,使用高级摄像机工具及真实的摄像机设置,来控制视频序列。
  • 合成镜头,把重点放在艺术方向上,而非实现细节。给Cinemachine智能摄像机一个简单的指示,比如跟随人物的头部,如果动画发生变化,镜头会自动更新并继续正常工作。
    这里写图片描述

    在Unity 2017.1中,我们为Cinemachine增加了很多新功能,比如:

  • 多个目标对象:以多个对象为目标,并设置它们的权重。它基于任意数量的对象创建一个逻辑组,根据其成员的位置来定位自己。在跟踪一组对象时,可以将其用作LookAt和Follow方法的目标。对2D场景也非常适用。
  • 动态取景多个对象:该功能将基于对象的位置自动取景一组目标。如果对象散开,Cinemachine将根据您创建的一套规则调整FOV或推拉(或两者同时进行)
  • 全新开放API:轻松定制Cinemachine配置,获得项目需要的摄像机行为。
  • 推拉轨道:创造出像电影一样的推拉镜头,让摄像机在游戏世界里平滑移动。适合于电影序列,或当您希望摄像机沿着一组轨道跟踪拍摄对象时。
  • 安全镜头:安全镜头会根据镜头优先级与质量,动态选择最佳的摄像机。有东西进了取景框,破坏了镜头?没问题,Cinemachine会切换到下一个最佳摄像机。尤其适用于回放或任何一个可变场景的电影序列。

Timeline和Cinemachine结合使用,您可以将叙事带入更高的层次。使用后处理栈来进一步创建特效,烘托场景氛围和戏剧效果。
这里写图片描述

改进Post-processing栈(测试)

Post-processing将全屏滤镜和特效应用于摄像机的图像缓冲区,然后再将其显示在屏幕上。您可以使用图像后处理特效来模拟物理摄像机和电影效果。

最新版的Post-processing栈测试版可以在此下载。最终版预计将于今年夏季发布。(注意:上一个稳定版本可以在Asset Store资源商店中下载)

改进后的后处理栈将一组完整的图像效果整合到单个后期处理流程中,并带有一系列高质量的摄像机效果:

  • Screen-space anti-aliasing
  • Auto Exposure
  • Motion Blur
  • Bokeh Depth of Field
  • Bloom
  • Color Grading
  • Chromatic Aberration
  • Film Grain
  • Vignette

您可以将多个特效组合到单个Pass中,使用基于Asset的预设配置系统管理特效也非常轻松。

颜色分级效果是一种支持Academy Color Encoding System (ACES)的全HDR颜色管线,低端平台可以使用LDR管线。该栈有两个屏幕空间的光照特效,即环境光遮蔽和屏幕空间反射。

这个新版本还提供了一个基于体积的混合特性,您可以在场景中定义区域(任何类型的网格),并在玩家进入区域时设置特定的氛围/外观。Unity会自动在体积之间进行混合,以实现流畅的外观转换。
这里写图片描述

Unity Collaborate多人协作已正式发布!现为Unity Teams一员

Unity Collaborate多人协作已结束测试,与Cloud Build云构建一起成为Unity Teams的一部分,仅用一个解决方案一套功能,即可帮助您更快速地进行团队协作。Unity Teams将可免费使用至2017年10月。

点击了解有关Unity Teams的更多内容。

对于Collaborate多人协作,我们在Unity 2017.1中发布的首个发布版本优先处理了Beta用户提供的反馈。除了性能改进、稳定性和Bug修复之外,我们还增加了一组新功能:选择性推送、更佳的Asset浏览器集成和一个新的“In Progress”功能,用以标志团队成员在某个场景或预制件上有未发布的本地更改。
这里写图片描述

以下是我们为Collaborate多人协作添加的一些新功能:

  • In Progress标志
    为场景和预制件添加了In Progress标志,以指示团队中其他人已对某个场景或预制件做出了一些未发布的本地更改。这个特性有助于协作者协调对场景和预制件的更改。
    这里写图片描述
    这里写图片描述

  • 右键单击选择发布
    我们添加了右键单击操作,现在您可以在项目浏览器中直接发布、恢复、查看差异,解决文件冲突。这是一个主要的用户痛点源头,我们希望使Collaborate的行为与其他项目浏览器的行为更加一致。请注意,这种UX允许您选择性地发布已更改的Asset。之前的版本中,您必须发布所有更改。
    这里写图片描述

  • 浏览体验更佳
    在项目浏览器的“收藏”中添加了新的过滤器,包括“所有修改”、“所有被排除”和“所有冲突”,这样用户就可以看到他们所有修改过的文件、所有正在修改的文件、带有冲突的文件和忽略的文件。特别要留意的是“All in Progress(一切都在进行中)”,这让您可以实时看到Collaborate团队中的其他人正在处理哪些Asset(稍后将详细介绍)。
    这里写图片描述

  • 实时操作分析
    Unity 2017.1可以通过数据驱动的实时操作,随时获得丰富的分析数据。深入了解您的用户与您作品的互动情况,并实时做出相应的调整,迎合他们的习惯,无需重新部署新版本。在Unity 2017中,您可以更好地为用户提供更佳的游戏体验。
    通过Standard Events (目前是Beta版)可以进行更高效的洞察,它提供了一组精心设计的预定义事件,可揭示与您游戏相关的重要信息。使用新的Analytics Event Tracker,无需代码即可实现这些功能。
    这里写图片描述
    使用Remote Settings特性,可以即时更改游戏,无需重新部署,该特性已添加到Unity Analytics分析服务中。
    这里写图片描述

  • 2D改进
    在Unity 5.6中,我们为2D游戏开发者对工具和工作流程进行了重大改进。Unity 2017.1中引入了2D Sprite Atlas,这是一种新的Asset,将取代Sprite Packer。随着它的出现,新改进的工作流程可以在运行时更好地控制精灵的打包和使用。图集是Unity中2D工作流程的重要组成部分,而精灵图集不仅提供了更简单的图集创建和管理方式,还有相应的脚本API,可获得更多的控制和用途。
    这里写图片描述
    Sprite Masks用于在世界空间中隐藏或显示精灵或精灵组的一部分。精灵遮罩仅对拥有Sprite Renderer组件或粒子系统的对象生效。
    这里写图片描述
    在Unity 2017.1中,我们还为精灵编辑器添加了精灵物理形状。可以为精灵设置自定义的默认形状,以使用PolygonCollider2D生成碰撞器形状。

  • 动画改进
    我们对Animation窗口进行了全面修改,改进了关键帧的工作流程,使动画制作更方便和熟练,并支持与Animator状态机进行交互。Performance Recording是一个实验性功能。
    新的关键帧工作流程支持明确指定何时将哪帧变为关键帧,并在重新评估/预览动画时,将所有未修改且未关键帧化的属性值都丢弃。我们已经改变了在Animation窗口中编辑剪辑的默认行为(新的默认预览模式)、视觉反馈和全局关键帧操作热键。这些变化的目的是在Animation窗口之外为关键帧操作提供一个流畅的工作流程,同时预览动画剪辑无需处于自动关键帧或录制模式下。
    现在在编辑器中可以对状态机行为进行调试。
    我们还引入了GameObjectRecorder,这是一个新的实验性编辑器特性,它允许您记录GameObject和它子对象上的任何属性。这样就可以轻松地创建动画,将被记录的所有内容保存到一个动画剪辑中。欢迎访问论坛进行反馈。
    这里写图片描述

  • Playables已正式发布
    Playables API通过使用树状结构的PlayableGraph组织和评估数据来源,提供一种创建工具、特效或其他游戏机制的方法。PlayableGraph允许您混合和修改多个数据源,合成为单一输出后播放。
    Playables API支持动画、音频和脚本。Playables API还提供了通过脚本来与动画系统和音频系统进行交互的能力。
    Playable API是一个通用API,它最终将用于视频和其他系统。查看文档了解更多细节。

  • Ambisonic音频
    在Unity 2017.1中,我们增加了对环绕立体声音频剪辑的支持,这是全方位环绕音频技术,它(除了水平面外)还覆盖了听众上方和下方的声源。
    Ambisonics以多声道格式储存。它不是将每个通道都映射到一个特定的扬声器,而是以一种更通用的方式来表示声场。然后,根据聆听者的方向(即XR中用户的头部旋转),旋转声场。声场也可以被解码成一种与扬声器设置相匹配的格式。Ambisonics通常与360度视频结合使用,也可以用作音频天空盒,表现遥远的环境声音。
    我们还添加了Ambisonic解码器插件,而且现在也可以使用正开发中的API,在新的叙事工具Timeline中使用音频剪辑了。

  • 编辑器改进
    我们在UnityEditor.IMGUI.Controls中添加了一个新的ArcHandle类,它可以在场景视图中交互式地编辑弧线。还加入了名为SearchField的新IMGUI控件,它带有普通和工具栏用户界面风格,但也可以自行定制。
    这里写图片描述
    现在还支持使用JetBrains Rider作为外部脚本编辑器。
    其他改进还包括对所有播放器循环阶段添加分析器标签,改进Package Export加载状态,以及记录已连接玩家的日志信息,这些都将出现在编辑器控制台中,使调试更加轻松。

  • 改进了对Visual Studio的支持,包括Mac OS
    Unity安装程序现在可以选择在Windows上安装Visual Studio Community 2017(而非Visual Studio Community 2015)。安装速度显著提高也更轻量。
    Mac用户也别难过,现在可以使用Visual Studio了!微软发布了Mac版的Visual Studio和Tools for Unity。Visual Studio for Mac还提供了许多很酷的功能:一键调试,Unity消息的IntelliSense(完整Unity特定库代码),着色器代码高亮显示等等(点此查看详情)。

  • 场景与Asset Bundle改进
    我们对游戏中的场景和Asset Bundle进行了一些改进。更改底层架构使场景和Asset Bundle加载速度更快,从而使玩家体验更加流畅。我们还创建了一个工具,Asset Bundle浏览器——以帮助创建和优化Asset Bundle。

  • Asset Bundle浏览器
    Asset Bundle浏览器的Beta版与Unity 2017.1一同发布。该工具允许您在Unity项目中查看和编辑Asset Bundle的配置。它的目的是替换当前选择Asset的工作流,并在检视窗口中手动设置Asset Bundle的工作流程。现在您可以集中查看所有的Asset Bundle配置。通过使用上下文菜单和拖放功能,配置、修改和分析相关资源包。
    该工具将标记可能值得关注的警告,并提示将中断资源包创建的错误。从上层查看包集合,您可以更有效地组织Asset Bundle。在更低层查看单个Asset Bundle,您可以看到由于显式包含或依赖项的关系,哪些内容将会放入包中。
    更多细节请查阅文档
    这里写图片描述
    Asset Bundle浏览器可以从Asset Store资源商店下载。

  • 脚本运行时升级(实验性):畅享 C# 6和.NET 4.6
    在Unity 2017.1中,我们引入了实验性版本的脚本运行时内核,该内核已升级到Mono/.NET 4.6运行时。它包含了许多修复、性能改进,可以使用C# 6。我们相信它会提高游戏的整体性能。
    可以在Player Settings中启用.NET 4.6:
    这里写图片描述
    注意,更改该设置会在重启编辑器后生效,因为它会影响编辑器和播放器。对应的脚本API是PlayerSettings.scriptingRuntimeVersion属性。
    IL2CPP完全支持新的.NET 4.6 API,因此您仍可使用C#编写脚本,同时享有原生C++的性能优势。如果您发现任何问题,请访问论坛进行反馈。

  • 模型导入器改进
    从像Maya这样流行的数字内容创作(DCC)工具导入Asset的过程是首批重要的改进对象,这使得DCC工作流程变得更加轻松。最终提高了艺术家和设计师的生产力,减少了程序员的麻烦。
    现在Unity导入从Maya导出的FBX文件已支持Segment Scale Compensation,而且FBX SDK已升级至2016.1.2。
    在导入FBX文件时,我们还添加了计算加权法线的选项,如按面积、角度或二者皆有,以及硬边缘的固定法线生成。现在,可以从FBX文件中导入灯光和摄像机,Unity会自动在需要时为对象添加和配置摄像机和/或灯光组件。
    Unity现在可以使用“Import Visibility”属性从FBX文件中读取可见性属性。值和动画曲线将启用或禁用MeshRenderer组件:
    这里写图片描述

  • Progressive Lightmapper改进
    Unity 2017.1增加了Progressive Lightmapper中对烘焙LOD的支持。在烘焙LOD时,Enlighten和Progressive Lightmapper之间的主要区别在于,使用Progressive Lightmapper不必在LOD周围放置光照探针来获得反射光。在完全烘焙分辨率下,间接光照将为LOD提供更优质的烘焙光照贴图,您也可以避免为它们设置光照探针的繁琐过程。(Unity 5.6中也有此功能。)
    我们还在Progressive Lightmapper中增加了对双面材质的支持,通过添加新的材质设置,使光线与背面接触。启用后,在进行全局光照计算时几何体的两面都被包括在内。当从其他对象观察时,背面不会被认定为无效。背面渲染既不受该设置的控制,也不会在光照贴图中显示。背面使用与正面相同的自发光和漫反射设置反射光线。(该功能也可在Unity 5.6中使用)
    这里写图片描述

  • 实时阴影改进
    我们优化了在稳定模式下,级联定向光源阴影投射器的选择。这意味着生成阴影贴图时会产生更少的Draw Call。这增益是与场景和配置相关的。例如,在四个级联光的情况下,可以看到Draw Call数量显著下降。根据太阳/摄像机的方向,场景中可以减少50%的阴影投射器。下面是维京村庄的一个例子:
    下面的场景在Unity 5.6中有5718个阴影投射器。
    这里写图片描述
    在Unity 2017.1中,相同的场景,只有4807个阴影投射器。
    这里写图片描述
    Unity 2017.1还实现了实时阴影的Percentage Closer Filtering (PCF)。每个像素的深度值都是从当前像素周围的阴影贴图中取样,并所有的采样值进行比较。这使得光和影之间的线条更加平滑。您可以在下图中看到对比:
    这里写图片描述
    除了实时阴影改进,Shadowmask和Distance Shadowmask光照模式现在已成为Quality Setting中的参数,可以在运行时进行修改而无需任何成本。例如,可以在室内使用Shadowmask (实现柔和的阴影),并在相同关卡中的户外场景切换至distance Shadowmask。它也可以作为一个质量设置项。
    我们还添加了Custom Render纹理作为渲染纹理的扩展,可以很方便地用着色器来更新纹理。这有助于实现各种复杂的模拟,比如焦散光、雨滴涟漪模拟,墙面液体喷溅等等。它还提供了一个脚本和着色器框架,以便进行更复杂的配置,比如局部或多阶段更新,不同的更新频率等等。
    这里写图片描述
    有了新添加的LineUtility类和LineRenderer.Simplify函数,现在可以优化线条,用LineUtility创建由简单形状组成的简化版本。
    使用Metal/OpenGL ES3实现iOS上的Deferred Rendering
    我们为A8芯片和以后的iOS设备启用了一个使用Metal和OpenGL ES 3.0的延迟渲染路径。当使用延迟着色时,能够影响GameObject的灯光数量是没有限制的。所有的灯光都是按像素计算的,这意味着它们都能与法线贴图进行正确的交互等等。此外,所有的灯光都可以有剪影和阴影。

  • 粒子系统改进
    我们引入了精灵集成,粒子碰撞力(可以推动碰撞器),大量形状方面的改进,包括一个新的形状类型,噪音模块增加了新选项,以及其他一些较小的特性和增强。因为增加了新的控制和约束,例如速度与对齐,使得在2D中使用粒子更加轻松。可以使用粒子来获得比以往更多的特效和动画效果,包括光线的线条和尾迹。
    通过Texture Sheet Animation模块,我们在粒子系统中增加了对精灵使用的支持。这使粒子系统能更好地进行了图集处理和批处理,同时也在粒子系统中增加了大量与精灵相关的特性,例如不同大小的动画帧,以及每帧的轴心点。
    这里写图片描述
    这里写图片描述
    噪音模块提供了新的选项,可以更好地将噪音应用于粒子效果中。这个功能在Unity 5.5中第一次实现,噪音是被应用到粒子的位置属性。在2017.1中,我们可以将噪音应用到更多的地方:
    -位置
    -旋转
    -大小
    -使用Custom Vertex Streams的着色器(非常适合制作UV失真效果!)
    这里写图片描述
    在粒子系统形状模块的碰撞模式中,我们引入了一个新的甜甜圈粒子发射形状和编辑模式。模块内的Transform可以为粒子发射的形状应用自定义位置、旋转和缩放。
    其他的改进还包括将粒子与速度方向对齐的能力,以及允许在局部空间系统使用Emit over Distance。边缘粒子发射现在更加灵活,可以选择用来产生粒子的边缘厚度。
    粒子现在也可以使用碰撞模块对碰撞器进行施力。
    这里写图片描述

  • Windows Store现在改名为Universal Windows Platform
    Unity现在支持Windows商店的Universal Windows Platform(UWP)应用模式,支持为Xbox One、Windows 10、Windows Phone 10和HoloLens进行构建。
    请注意,对Windows混合现实PC设备的支持将在今年晚些时候发布。
    这里写图片描述
    我们增加了对UWP的多显示支持,现在Unity播放器二进制文件已做数字签名,增加了额外的一层安全性,可以防止对Unity运行时二进制文件进行篡改。
    最后,我们取消了对Windows 8.1和Windows Phone 8.1应用的支持,Unity 5.6是最后一个支持这两个平台的版本。

  • 索尼PS4的视频播放器
    我们在Unity 5.6中引入了一个全新的视频播放器,在Unity 2017.1中正式加入了对索尼PS4的支持,从而完成了对跨平台的支持。PS4的视频播放器使用索尼的AvPlayer库来加速h.264流的解码。解码h.264流(PS4的推荐格式)时,CPU开销非常低。可以同时对最多8个并发h.264流进行解码。它还支持对webm容器中的VP8格式流进行软件解码(更高的CPU开销)。最后,它支持多种视频渲染模式(直接渲染到摄像机的近/远平面,作为材质覆盖,或渲染纹理),音频流可以直接输出或发送到音频源进行混合。

  • 底层原生插件渲染扩展
    我们已经扩展了底层渲染插件API,并提供了一些很酷的新特性:
    -现在可以将用户数据发送到回调函数。
    -我们已经扩展了插件将接收回调的可能事件列表。
    -我们在着色器编译器进程中添加了钩子,可以在发送到编译器之前对着色器打补丁。支持创建自定义关键字所控制的自定义变体。
    -要想了解这些扩展的威力,请查看NVIDIA的VRWorks包,它是实现这一切的基石。

  • VR: NVIDIA VRWorks
    现在,在Unity 2017.1中,NVIDIA VRWorks通过以下特性,为虚拟现实提供了一种全新高度的视觉保真度、性能和响应能力:
    -Multi-Res Shading是一种用于VR的创新性渲染技术,它可以使图像的每一部分都能渲染在一个与镜头矫正图像像素密度相匹配的分辨率上。
    -Lens Matched Shading使用NVIDIA基于Pascal的GPU的新Simultaneous Multi-Projection架构,为像素着色提供潜在的性能改进。
    -Single Pass Stereo使用NVIDIA基于Pascal的GPU的新Simultaneous Multi-Projection架构,仅对几何体进行一次绘制,即可在双眼视图同时投射相同几何体。
    -VR SLI为虚拟现实应用程序提供更高的性能,其中两个GPU可以被指派给特定眼睛,极大地加速立体渲染。
    这里写图片描述
    为了更好地利用这些改进,应该在PC上使用GeForce 9系列或更高的GPU来进行回放。可以访问Asset Store资源商店下载NVIDIA VRWorks for Unity

  • 发布说明
    与往常一样,请查阅发布说明,以了解新特性、改进和修复的完整列表。

以上内容来源Unity官方中文社区,原帖地址:http://forum.china.unity3d.com/thread-25171-1-1.html
本文仅做转载和整理。

by:蒋志杰

2015-04-01 16:33:24 ynnmnm 阅读数 6822
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4715 人正在学习 去看看 张刚

    一直没有总结过Unity的资源管理,都是随用随看文档。今天有人问起,总结一下,加深对Unity资源管理的理解。主要参考了Unity官方文档之ResourcesAssetBundle

    Unity有两种动态加载资源的方式,Resources.Load和AssetBundle。Resources.Load用于加载打进游戏包内Resources目录下的资源,AssetBundle用于加载包外自己打的资源包(使用BuildPipeline.BuildAssetBundle),常用于做动态更新。下面结合API具体说明:


加载:

Resources.Load:加载app包内Resources/目录的一个asset;

Resources.LoadAsync:Resources.Load的异步方法;

Resources.LoadAll:类似Resources.Load,但是用于加载某目录下所有asset;

Resources.LoadAssetAtPath:加载Asset/目录下的资源,只能用于编辑器模式,写打包工具时可能用到;

---------------------------------------------------------------------------------------------------------------------------------------

AssetBundle.CreateFromFile:从磁盘加载一个AssetBundle,这是加载AssetBundle最快的方式(只能加载uncompressed的AssetBundle)。Unity 5.x改为LoadFromFile,而且可以加载compressed的

AssetBundle.CreateFromMemory:从内存中创建一个AssetBundle,异步方法。Unity 5.x改为LoadFromMemoryAsync

AssetBundle.CreateFromMemoryImmediate:AssetBundle.CreateFromMemory的同步方法。Unity 5.x改为LoadFromMemory;

WWW.LoadFromCacheOrDownload:从缓存或网络上下载后加载AssetBundle,不需担心设备空间不足;

AssetBundle.LoadAsset:从AssetBundle中加载一个asset;

AssetBundle.LoadAssetAsync:AssetBundle.LoadAsset的异步方法;

AssetBundle.LoadAllAssets:加载AssetBundle中所有指定类型的asset;

AssetBundle.LoadAllAssetsAsync:AssetBundle.LoadAllAssets的异步方法;


卸载:

Resources.UnloadAsset(Object assetToUnload):卸载指定的asset,只能用于从磁盘加载的;如果场景中有此asset的引用,Unity会自动重新加载它;

Resources.UnloadUnusedAssets:卸载所有未被引用的asset,可以在画面切换时调用,或定时调用释放全局未使用资源;

---------------------------------------------------------------------------------------------------------------------------------------

AssetBundle.Unload(false):卸载AssetBundle的压缩文件数据(文件内存映像);

AssetBundle.Unload(true)卸载AssetBundle文件内存映像,并且释放所有已加载的asset;如果asset在场景中被引用,会丢失;

---------------------------------------------------------------------------------------------------------------------------------------

Object.Destroy:销毁一个GameObject、组件或asset;并不是立即销毁,而是在Update循环之后,渲染之前;

Object.DontDestroyOnLoad:标明一个对象在切换场景时不被销毁;

GC.Collect:强制垃圾收集器立即回收内存,可以根据需要使用,比如切换画面调用或定时调用;


通过看Unity的这些API说明,可以清晰地了解Unity的动态资源管理了。下面这幅图描绘的更清晰:


没有更多推荐了,返回首页