由于Unity是一个脚本化开发的引擎,所以实现一个具体功能的代码往往非常简短。
我刚开始写的时候总会碰到一个头疼的问题,当游戏变得越来越大,场景内的物体越来越多,各种繁杂的脚本互相交错,最后当需求变更或者发现BUG的时候,我发现有茫茫多的代码需要检查和修改。
关于怎么样来架构Unity3D中的脚本,详细的可以看一下雨松momo的这篇文章
http://www.xuanyusong.com/archives/1851
总结来讲主要是三个点:
1、运用单例脚本来控制一类工作
2、一个脚本不要管和自己无关的内容
3、将UI和逻辑分开
至于这其中的协作方式,无论你通过SendMessage还是直接调用方法,抑或使用回调或者委托,都是可以的。
再来说下属性的运用,假如在一个打飞机游戏中有一个类Plane,我建议这样设计(部分):
public class Plane { public PlaneType type { get; private set; } public double HP { get; private set; } public void SetType(PlaneType type) { this.type = type; } public void Damaged(double damage) { HP -= damage; } }
大家都知道使用private set可以确保HP这个属性只在类内部被修改,使用Damaged方法来扣血比较符合逻辑。
但我以前一直觉得,如果我谨慎对待变量HP,确保所有的修改都是我有意为之而不是意外,是不是就可以直接使用public变量在其他地方修改,这样做还有没有其他的好处?
有!假如现在我需要一个功能,要求统计在整个游戏中造成的总伤害,那么基于上面的类设计,我可以非常简单的在Damaged方法中加入一个判断,当类型为敌人的时候,把当次攻击的数值加到统计值上即可。
但如果我用的是public变量,并且是在其他地方直接修改了HP值,即使我知道所有的修改都是我有意为之,但要实现这个功能我还是得查看所有HP被引用的地方,逐个修改,并且免不了担心是否有遗漏。
所以我建议在Unity3D的脚本中,尽量使用属性来替代公共变量并且设为private set,使用方法来修改属性值,即使这个类在当前看来非常简单(比如一个Player类,只有一个变量Money时,往往会为了方便设计成全局静态变量,但其实以后很容易出类似的问题)