作者knife5566 (爱心疖瘤‧刀)
看板GameDesign
标题[请益] unity中delegate event的使用时机?
时间Mon Nov 12 13:29:28 2018
C#中delegate event是一种写法,有的人喜欢有的人不喜欢,但大体来说
知不知道有这东西存在是某些人评定会不会C#的标准。
在unity中也使用了delegate event这东西,在一些人的网志上表示用event才不会
让程式有「坏味道」(不知道这指啥)
用起来大概是这种感觉:
假设我今天有一段专门处理UI的按钮的class
public class UI : MonoBehaviour
{
public delegate void UI_trigger(string just_a_string);
public static event UI_trigger my_UI_trigger;
public void button(string just_a_string) //按下按钮的时候call这行
{
my_UI_trigger(just_a_string);
}
}
这样我的button这个function就只要里面有my_UI_trigger(_objects);这行就好,至於
哪个程式要来接这段程式就不是这个class要考虑的事,就好像当兵的时候连长在集合场
乱叫,连长本身不care哪个确切的谁要来理自己乱叫,但一定要有兵仔回应就是。
如果有程式要来回应按钮按下去时,大概是这样写
public units : MonoBehaviour
{
void OnEnable()
{
UI.my_UI_trigger += units_trigger(string just_a_string);
}
void units_trigger(string just_a_string) //UI的button被call时跑到这行
{
Print("新兵"+transform.gameObject.name+"接收到"+just_a_string);
}
}
但实际上在写的时候呢,除了UI以外,通常游戏中建立event的物件可能是不特定的多
数,而接收event的物件也是不特定的多数,最後就变成N个event的头配上M个event的尾,
最後还得写code来确认到底是这个event是谁发来的要传给谁,好像有点本末倒置了。写
是可以写但是感觉没像人家说得那麽的漂亮。
所以这东西到底实际上要怎麽用。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.194.164.208
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1542000571.A.42F.html
※ 编辑: knife5566 (123.194.164.208), 11/12/2018 13:30:40
1F:推 wix3000: 我都用Action 几百年没手动宣告delegate了 11/12 16:48
2F:→ wix3000: event大部分的使用状况还是去帮程式定义出几个关键的时间 11/12 16:51
3F:→ wix3000: 点,例如当数值发生改变、当某件事完成时等等。这点在游 11/12 16:51
4F:→ wix3000: 戏中也不例外,例如当回合切换时,当角色攻击时,当返回 11/12 16:51
5F:→ wix3000: 本阵时等等 11/12 16:51
6F:→ wix3000: 还有我很认真的告诉你,C#的变数请用驼峰命名,然後类别 11/12 16:53
7F:→ wix3000: 首字要大写 11/12 16:53
8F:推 cjcat2266: 推楼上,虽然说命名这件事是看个人喜好,但C#是微软自 11/12 17:22
9F:→ cjcat2266: 己维护更新的语言,VS的IntelliSense和C#外挂的某些功 11/12 17:22
10F:→ cjcat2266: 能还是直接内定驼峰命名法,跟着用方便多多。不过我是 11/12 17:22
11F:→ cjcat2266: 只有public field/property才用大头驼峰法啦,protecte 11/12 17:22
12F:→ cjcat2266: d或private还是用自己C++习惯的m_/s_/g_/k开头驼峰命名 11/12 17:22
13F:→ cjcat2266: 法 11/12 17:22
14F:推 cjcat2266: 也就是其他人会看到的interface命名法遵照微软建议 11/12 17:23
15F:推 cjcat2266: 另外回归正题,event其实只是个工具,我认为用自己或 11/12 17:25
16F:→ cjcat2266: 团队认为合理的工具对症下药就好,不必拘泥於用或不用 11/12 17:25
17F:→ cjcat2266: 特定工具 11/12 17:25
18F:→ jerryklu: unreal也会侦测驼峰命名在编辑器中显示会自动多空格 11/12 23:11
19F:推 breakself: Event可以拿来断耦合,例如在MVC架构中可以用Event传出 11/17 01:05
20F:→ breakself: 去,减少不同Class交互Reference的状况 11/17 01:05
21F:推 wulouise: 最後一段,我觉得问题是这个event不明确,或是资料不足 11/17 22:18
22F:→ wulouise: 原po可以举一个具体的例子来提问,比较能厘清你的疑问 11/17 22:18
23F:推 wulouise: 如果不了解bad smell是甚麽,可以google design pattern 11/17 22:20
24F:推 wulouise: 有点想不太到什麽情况是不该收event却收了还要不做事 11/17 22:22
我在网路上看到的例子是人物捡东西
直接的写法:
人物捡东西,从人物送一个getcomponent到UI去,在UI里面加入东西
event的写法:
人物捡东西->触发event
UI->接收event,在物品栏里面显示
但是如果我今天有一大堆人物,一大堆的人物对应一大堆的UI,一大堆的人物捡了一大
堆的物品触发一大堆的event
就不知道谁的event丢给谁要另外写判断了
※ 编辑: knife5566 (123.194.164.208), 11/18/2018 01:00:15
25F:推 cjcat2266: 那些都可以成为客制event的参数 11/18 09:25
26F:推 wulouise: delegate可以自订变数,你只要把从哪来,去哪里标明就没 11/18 13:16
27F:→ wulouise: 问题了 11/18 13:16
28F:推 wulouise: 设计上应该是所有取得道具event给ui supervisor 11/18 13:18
29F:→ wulouise: ui supervisor决定要更新到那,不会有混淆的问题出现 11/18 13:19
原来如此 这样就能保证最後event的接收者只有一个
不过从supervisor到ui中间这段还是注定要有个直接给值的过程就是了
※ 编辑: knife5566 (123.194.164.208), 11/18/2018 19:02:01
30F:推 wulouise: 我只是提供一种做法,建议你看看design pattern 11/19 19:42