unity3d水资源包下载的资源怎么有效的整理

Unity3D如何有效地组织代码?
Unity3D可以说是高度的Component-Based Architecture,同时它的库提供了大量的全局变量。这些都和我曾接触到的cocos2d-x,和非游戏框架有很大出入,请问各位前辈有没有什么好的方法、模式、框架来组织代码呢?谢谢!
准确地说,代码作为Unity项目里的一种资源,此问题应该扩展到如何组织Unity资源。简单说说我们的经验:- Unity有一些自身的约定,譬如项目里的Editor,Plugins等目录作为编辑器,插件目录等等。知名的插件会自己存放一个目录,譬如NGUI等。
所以我们自己的代码,一般目录名会以下划线开头,譬如 "_Scripts", "_Prefabs"等。
对于场景,文档等目录,用两条下划线,以便他们能排在最顶部。- 代码用C#,别用JS。必要的话用namespace将自己的代码括起来。我们是用namespace把自己积攒的公用库包住。- C#的注释要认真写,打///就能帮你补全了,没理由偷懒。- 每个程序文件开头要用一段注释写修改Log,谁改过什么简单留一条说明。就算用了Unity的版本管理或者Git,那些log终究会丢失,只有认真把log写在代码里,才会有意识去认真优化它。- Unity的脚本逻辑,就功能而言大体分为两种,一种是比较独立的,譬如爆炸之后1秒钟消失,这种单独写个脚本绑定到目标上即可。
更多的是脚本里与其它的脚本进行交互。Unity里提供了一种万金油的方法是SendMessage, 这种方法性能略差,如果你调用的频率不高,随便用也无妨。另一种方法是直接通过对象的实例去调用。
我们的做法是写几个公用的控制器,让它们各司其职,负责各自的事情:- 写一个一个GlobalManager.cs来控制游戏的全局变量及全局方法。静态类模式。譬如当前玩到第几大关第几小关,玩家的金币数量等。- 写一个GameController.cs来控制当前关的游戏进程。单实例模式。游戏的主循环也是用它控制。初始化,胜利、失败判定等等。- 写一个InputController.cs来控制所有的用户输入。单实例模式。鼠标、键盘、触摸屏,我们做游戏是保证同时支持这三种输入的,因为大部分时间是在PC上测试。
关于GameController与InputController的联系,有点让人纠结。一般来讲是在InputContoller里调用GameController.Instance.Foo()执行方法。或者直接对Input写成Listener的模式,让GameController去监听。- 其它的类似菜单控制器,声音控制器,成就控制器,IAP虚拟道具控制器等等,也是采用类似的方法管理。- 关于PlayerPref的操作,统一写成静态类的get/set模式,程序中哪里要用则直接读写。- 如果你的项目里场景的数量少(&5),那么拖入场景的资源可以很随意。如果场景数量很多(几十个,有的解谜游戏每个关卡就是一个场景),那么拖入场景的prefab数量一定要少。- 设计你的prefab资源里,你要想像当其他人拿到这些资源,是否直接拖入一个空场景里就能run,顶多再简单设置几下。如果你设计的资源不能做到这些,那么得好好重新想想。写了这些,感觉写不下去了。想吃透Unity,起码得真做出几款产品放上线才行。真正做产品的过程中会碰到各种各样意想不到的问题,代码不断地被重构和妥协,不存在什么最佳的方案。暂时就写这些吧,希望能抛砖引玉。
Unity除了挂在Game Object上的代码比较难找,这一点跟其他工具做项目不同外,其他就是每个公司自己的管理风格了。在实际操作中,无非就是文件夹/文件夹/.../文件,名字要起的好。这样就在源代码级别管理好了自己的代码。至于楼主所提的Component-based architecture,个人在管理过程中会习惯去适应unity的脚本概念,虽然与C++等代码做的项目一样,一样有源代码级的很多manager,但是这些manager的启动不再需要自己做一个类似main一样的入口手动启动,只要挂在某个Game Object上,在Start()中启动就可以。配合Unity的script execution order,慢慢脚本的概念就会扎入你的心里。用Unity,因为逃不开在Game Object上挂脚本,所以,个人觉得还是习惯这种方式,的确在概念上也很简单。唯一要注意的是,一定要对Game Object的名字有一定的约束,养成很好的命名习惯。然后自己再写一些查找工具用来查找用到某个名字的脚本的Game Object,配合起来就会理解Unity这样工具的设计理念:基于脚本的对象化。举个例子,单机版的一些存储,如果配合Unity的playerprefs和Unity的回调机制(OnApplicationPause(),OnApplicationQuit()),你会发现你不用为save/load去设计存储格式,去设计一个基于虚函数的OnSave()、OnLoad(),更不用需要去考虑各个模块的存储先后问题。Unity都给你做好了。我不知道有哪些模式,只知道也曾经用C++等熟悉的语言来组织自己的逻辑(因为当初刚开始untiy),但是当我做项目多了,发现其实unity的方式挺简单,也很好用。如果所谓的脚本能做好一件事情,你会发现小即是美。
今天看到unity官微发送2015技术讲座,第一个就是代码架构,看完之后很有启发。
我的代码大概遵循这么几条原则吧(想到哪儿写哪儿不分先后):1.逻辑脚本基于场景划分2.抽离静态配置数据、全局管理数据以及对局临时数据的管理3.使用单例模式创建不依赖于场景的游戏对象及其上的全局管理器4.避免使用GameObject.Find以及SendMessage,声明对象引用以显示标明脚本之间的依赖性,活用delegate解耦合5.多用组合少用继承(Component的架构真的是太棒了)6.数据行为与逻辑表现分离,即V与MC的分离,换句话说多写class少写MonoBehavior。(通常初期在快速开发原型时会把一个功能全部实现写在一个继承于MonoBehavior的脚本中,尽早进行重构,抽离出负责数据管理与控制的类,这对于后期功能的增加与修改时很有必要的)7.善用Coroutine(Coroutine真是太方便了)8.尽量能够使用自定义的配置文件辅助Prefab上脚本参数的配置。总的来说记得知乎上看到谁说过cocos2d是程序员友好的,而Unity3D是设计师友好的,写了这么多年Unity3D代码我真是觉得我的思考方式越来越像策划而不是程序员了,使用Unity3D开发,写代码应该只占了大概50%的工作,另外50%都在编辑器上,如果你用过相信你懂得。
我的建议是:不要在开头去想如何组织代码,而是先让代码跑起来。不过既然lz问了,还是大概说下吧。。。与unity相比,cocos2d顶多只能算是一个跨平台图形库,他基本没有游戏引擎相关的代码,而unity里component-based design就是为了能更灵活地去处理游戏内的逻辑。
说的controller,inputManager的概念(其实这些在游戏编程里很普遍)都狠详细,但这些东西在你没有实际详尽的认识之前,其实并不好理解。我建议lz去大致系统的看一下unity方面的书籍,然后实际照着去写,把设计先放在后头,等做出形了再重构。无止境的重构是做不出东西的。
并没有啥本质区别,以前写cocos的时候也可以写成component based。所以主要的矛盾并不是unity vs cocos,而是component vs inheritance。非常推荐game programming patterns书中的component章节()unity自己有一些蹩脚的地方比如全局的dt,没有全局统一入口,update顺序不确定等等,都还是比较容易克服的。
1.代码目录分分好, 保持良好的层次关系2.尽量不要使用全局变量
有句话,我总会仔细的跟很多朋友讲到做游戏,牛逼的不是实现某一个功能,而是把成百上千的功能放到一起,却不乱。而我认为,这条路,必须自己不断总结反思。别人给的经验,往往并不一定合适具体的项目。不管别的,有几个标准可以检验你的代码是否合理1:美术资源 提交后,策划配表提交后,不需要程序变换,即可立马看到结果。
比如,一个图标变了,美术可以打包图集,提交。 策划变了一个配表,他可以直接提交配表。 一个新的怪物出现了,让美术自己提交怪物资源.....
最后他们自己跑游戏里一看,发现东西是OK 的。
不管你程序如何设计,这事是最重要的一条。
简单来说就是 让美术和策划能够提交后直接看到结果。2:游戏暂停时,能否直接通过 视图窗口,看到尽量多的游戏当前状态。以我做的ARPG为例,再某一下,我一刀挥出去,打到一个怪物了。
再怪物受击的那一瞬间,我点击暂停。这个时候我点击怪物这个GameObject,可以看到怪物当前正在播放那个动画,重力是多少,重力加速度是多少,受击的效果有哪几个,数值分别是多少...
可以通过视图窗口看到当前怪物移动组件是否使用中,AI 组件是不是被停滞掉了.........这个点是存在争议的,诸多从C++过来的朋友,cocos写得多的朋友。并不习惯组件化这样的东西3:是否一个类只干一件事这个同样很重要甚至可以说是需要被确保的。组件化或许这点有些爽。就是基本确保了你写的某个组件只干一件事。4:,,,,,
已有帐号?
无法登录?
社交帐号登录20:59 提问
关于Unity3d WWW 加载本地资源的问题
WWW www = new WWW ("file://E:/项目/Assets/StreamingAssets/Actor.assetbundle");
WWW www = new WWW ("file:///E:/项目/Assets/StreamingAssets/Actor.assetbundle");
两种都试过都不行
You are trying to load data from a www stream which had the following error when downloading.
Couldn't open file /项目/Assets/StreamingAssets/Actor.assetbundle
UnityEngine.WWW:get_assetBundle()c__Iterator17:MoveNext() (at Assets/EffectScripts/ABC.cs:20)
求教大神 如何破解
按赞数排序
格式错了 最好中文路径去掉,然后改成WWW www = new WWW (@"file:///E:/项目/Assets/StreamingAssets/Actor.assetbundle")就行了
不要使用中文路径。。。。
路径格式不能识别。
1723关注|449收录
其他相似问题【Unity3D】关于资源包更新的问题
[问题点数:40分,结帖人aspp12333]
【Unity3D】关于资源包更新的问题
[问题点数:40分,结帖人aspp12333]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Unity 2D稀有开发资源整理 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了1598字,被90人关注,获得了269个喜欢
Unity 2D稀有开发资源整理
Unity开发3D游戏的功能很强大,但是用来开发2D游戏也很厉害。特别是4.5版本以后,原生支持了2D开发的功能。
Unity2D的开发资料不多,这是所有我能找到的,整理在此,欢迎补充和交流。
泰然网翻译教程
Raywenderlich Unity4.5的教程 Unity New GUI Tutorial)
Raywenderlich Unity4.3的教程
游戏蛮牛 Unity4.6 2D教程
Unity写的2048
Unity官网教程
wroopie教程
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
分享推进技术
· 16人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 unity3d场景资源包 的文章

 

随机推荐