问题:

  Unity3D可以说是高度的Component-Based Architecture,同时它的库提供了大量的全局变量。如何来组织代码呢?

答:

  - 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,起码得真做出几款产品放上线才行。真正做产品的过程中会碰到各种各样意想不到的问题,代码不断地被重构和妥协,不存在什么最佳的方案。

Unity3D如何有效地组织代码?(转)相关推荐

  1. 如何有效地进行代码 Review?

    研发都知道代码 Review 的重要性,在腾讯代码 Review 也越来越受大家重视,作为腾讯专有云平台研发的一员,我参与了大量的代码 Review,明显地感受到有效的代码 Review 不但能提高代 ...

  2. DDD:订单管理 之 如何组织代码

    背景 系统开发最难的是职责的合理分配,或者叫:"如何合理的组织代码",今天说一个关于这方面问题的示例,希望大家多批评. 示例背景 参考数据字典 需求 OrderCode必须唯一. ...

  3. 如何有效地进行代码 Review

    前言 作为公司代码委员会 golang 分会的理事,我 review 了很多代码,看了很多别人的 review 评论.发现不少同学 code review 与写出好代码的水平有待提高.在这里,想分享一 ...

  4. 抽象、低内聚、难变更,你还在用“堆栈”组织代码?

    更多内容关注微信公众号:fullstack888 在企业代码库中,目前最流程的代码组织方式是按照技术栈的层次对所有类进行分组,即"堆栈"(stack)风格.但这种风格存在抽象不恰当 ...

  5. Androud 如何有效减少重复代码

    前言 重复的代码一直都是可维护性的大敌,重构的重要任务之一也就是要去除掉重复的代码,有效的减少重复代码,可以大大提高软件的扩展性. 在Android开发中,很容易产生重复的代码.因为Android是组 ...

  6. 【Unity3D自学记录】代码获取隐藏游戏对象

    很多人把游戏物体的active改成false后,用GameObject.Find()就找不到游戏对象了. 我来告诉大家一个巧妙的方法,借鉴的是雨松大神的方法~ 首先创建一个父级OBJ,OBJ的acti ...

  7. 如何有效阅读他人代码(一)

    原文为繁体中文,地址:http://www.ithome.com.tw/itadm/article.php?c=47717 下文为经过Google翻译过的简体中文版,有翻译不准确的地方,请参照原文一起 ...

  8. 【Unity3D】10行代码实现一个简单的角色移动旋转脚本

    一.前言 今天分享一个简单的角色移动脚本,主要用到碰撞器和刚体组件,代码简单易懂,复用性.扩展性较强,跟我一起来看看吧. 二.效果图 三.代码 using UnityEngine;public cla ...

  9. Unity3D Value噪声算法代码实现

    噪声算法 上一期我们讲了最经典的perlinNoise算法的实现 其实漏讲了一点就是噪声算法的一些规则.虽然并没有很严格的规定,但噪声算法大致都要符合以下几点,才能说是一个'有用的',看上去'正确'的 ...

最新文章

  1. idea springmvc_SSM三大框架使用Maven快速搭建整合(SpringMVC+Spring+Mybatis)
  2. python生成简单的FTP弱口令扫描
  3. c3p0 数据库连接池
  4. VR原理讲解及开发入门
  5. tensorflow随笔-constant
  6. “指向指针的指针”的作用和应用
  7. 如何在计算机课上渗透德育教育初探,在《道德与法治》课中德育渗透的案例初探...
  8. bootstrap 栅格系统实现类似table跨行
  9. Kubernetes 小白学习笔记(31)--kubernetes云原生应用开发-istio架构和安装
  10. 银联在线支付B2C UnionPay.NET
  11. 计算机毕业论文性能测试怎么写,计算机专业毕业论文写作指导方法
  12. LoadRunner视频教程地址
  13. 收藏!全国计算机二级 Python 题库破解
  14. Android5.1.1-高通msm8916平台添加Etehrnet。(驱动+上层framworks)
  15. 如何判断一棵树是否是满二叉树
  16. 兑吧解决Windows 组件存储已损坏,0x80073712错误
  17. 阿里云国际版ECS云服务器Windows系统手动搭建WordPress
  18. 小根堆 的调整算法
  19. QTP_QTP学习笔记(1)
  20. 对 Nginx 的初步了解

热门文章

  1. 1112 Stucked Keyboard
  2. 字符串中最后一个词组的长度 Length of Last Word
  3. C# Winfom 中ListBox的简单用法
  4. 我的Android进阶之旅------Android中高低API版本兼容使用@TargetApi或者@SuppressLint(NewApi)...
  5. traceroute和mtr
  6. 表修改语法之列的增删改
  7. Centos5.5安装使用Xen
  8. iOS中定时器NSTimer的使用
  9. PHP函数 -字符串函数
  10. 使用System Center Operations Manager监视Exchange 2007客户端连通性(二)