GameDesign 板


LINE

开发过稍微复杂一点的游戏的人大概都遇过这个状况: ●●● 写了一个负责掌控全局的脚本(许多人习惯命名为GameManager),它知道玩家现在几等、 目前是处於第几关、游戏是进行中or暂停中,所有需要使用它资讯的物件都必须在程式码 中宣告并引用之,并且还要开发者自己去拉reference(如图),如果线没牵好,游戏甚至 还有可能强制终止。 ●●● https://i.imgur.com/gqwJv0u.jpg 当你在其他脚本里撰写了public GameManager GM;,就会看到上图的画面。这个步骤本身 是正确且可行的,然而,在降低耦合性的程式设计原则下,这并不是工程师所崇尚的作法 。 既然自始至终,所有物件提到的GameManager都是指涉同一个对象,无一例外,那有没有 什麽方法可以避免这一再拉reference的步骤呢? 这时,我们可以藉助C#的一个特性,单例(Singleton)。 单例,顾名思义,就是在整个系统架构里面,这个脚本只会有唯一一个代表人,可以免去 手动指定的流程。 https://i.imgur.com/vPmOtZK.jpg 如图中第7行,我们创造了一个公开(public)但静态(static)的GameManager,并且命名为 Instance(这也是习惯上的命名,要取名做TheChosenOne也可以XD)。 再来看到第12行的Awake()函式,我们必须把Instance指向this,也就是GameManager它自 己。 经过这两个步骤,就完成单例的宣告了。 注:之所以将单例的指定放在Awake()里面,是为了让这一层关系早在其他脚本呼叫Insta nce前就搭建起来,避免其他脚本在Start()呼叫了Instance,却获得Instance是null的状 况。 https://i.imgur.com/Nnzp0NR.jpg 我们再开另外一个脚本来检查结果,当我按下键盘的S键时,就会在Console中显示当前的 关卡,而关卡资讯是来自GameManager.Instance.curStage。 https://i.imgur.com/e0ad8eL.jpg 如此一来就不再需要第7行的宣告,也不用亲手帮每一个物件挂上GM的reference,可说是 一个便捷又具有设计美感(?)的做法,在越大型的专案里功效就越显着! -- 我是羽毛,目标是成为游戏工程师,请多多指教! 羽毛的电玩新手村 https://tinyfeather1997.wordpress.com --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.249.56.86
※ 编辑: feather623 (111.249.56.86), 09/10/2017 11:58:30
1F:推 coolrobin: 帮推,不过是不是在标题或内文前面加上unity会比较好?09/10 12:41
2F:→ coolrobin: 会比较便於搜寻 09/10 12:43
好的,谢谢你的建议~
3F:推 b87088: 羽毛推 09/10 13:06
HiHi 请问你是XD ※ 编辑: feather623 (111.249.56.86), 09/10/2017 13:17:03
4F:→ MBRSL: Singleton很容易被滥用造成bug,只建议在小规模的专案使用 09/10 13:43
5F:推 cjcat2266: 我觉得如果谨慎、分工正确、又有规矩地使用,应该还好 09/10 16:48
6F:→ cjcat2266: 碰过几个大专案有多个singleton合作,但是大家很谨慎 09/10 16:48
7F:→ cjcat2266: 没看到什麽严重的滥用情况,所以我觉得还是看使用者 09/10 16:49
8F:推 joseph33: http://wiki.unity3d.com/index.php/Singleton 可以写 09/10 17:20
9F:→ joseph33: 个singleton的base class出来用 09/10 17:20
10F:→ b87088: 之前gamejam队友~,看code才知道每个人都自己写自己的sin 09/10 18:46
11F:→ b87088: gleton~~ 09/10 18:46
12F:→ y3k: Singleton我只推荐用在API入口 不然很容易有bug 09/10 20:40
13F:→ bantime: 我挺好奇会造成什麽bug?有案例吗? 09/10 23:03
14F:→ dreamnook: 好奇是甚麽bug+1(没遇过 09/10 23:46
15F:推 MBRSL: 最常见是全域变数类的bug,详细理念请见下一篇文章 09/11 01:14
16F:→ y3k: 等一下 上面的真的都没遇过喔XD static变数造成的bug就不用提 09/11 01:23
17F:→ y3k: 了 我也遇过继承的问题、Singleton自己去跟其他物件黏答答在 09/11 01:23
18F:→ y3k: 一起发生的问题... 虽然没到罄竹难书的地步但是这个写法一看 09/11 01:24
19F:→ y3k: 到我都得先花个一两天把它的code翻一遍才安心 09/11 01:24
20F:→ y3k: 虽然这不是一个不能用的写法 但是遇到比较没经验或便宜行事的 09/11 01:26
21F:→ y3k: 捧油用 就容易把人的脑洞放大... 我只能这样讲 09/11 01:27
22F:→ dreamnook: 大概是我们平时在写的时候都有特别注意过吧@@ 09/11 08:11
23F:→ y3k: 我觉得是专案规模不大 或有一个SA之类的专职在处理规划架构 09/11 10:18
24F:→ dreamnook: 也是 近年来都很少碰过20人以上的专案了 09/11 10:55
25F:→ y3k: 20人如果全RD 那不少耶= = 09/11 11:01
26F:→ dreamnook: 整个专案20人 不是纯RD 20人xD 09/11 11:07
27F:→ bantime: 还真的没遇过..可能我在实作singleton的时候 09/11 13:26
28F:→ bantime: 都是保证唯一的状况下 例如你不会同时出现两个选角介面吧 09/11 13:27
29F:推 dreamnook: 09/11 18:15







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP