[請益] unity中delegate event的使用時機?

作者: knife5566 (愛心癤瘤‧刀)   2018-11-12 13:29:28
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是誰發來的要傳給誰,好像有點本末倒置了。寫
是可以寫但是感覺沒像人家說得那麼的漂亮。
所以這東西到底實際上要怎麼用。
作者: wix3000 (癢,好吃)   2018-11-12 16:48:00
我都用Action 幾百年沒手動宣告delegate了event大部分的使用狀況還是去幫程式定義出幾個關鍵的時間點,例如當數值發生改變、當某件事完成時等等。這點在遊戲中也不例外,例如當回合切換時,當角色攻擊時,當返回本陣時等等還有我很認真的告訴你,C#的變數請用駝峰命名,然後類別首字要大寫
作者: cjcat2266 (CJ Cat)   2018-11-12 17:22:00
推樓上,雖然說命名這件事是看個人喜好,但C#是微軟自己維護更新的語言,VS的IntelliSense和C#外掛的某些功能還是直接內定駝峰命名法,跟著用方便多多。不過我是只有public field/property才用大頭駝峰法啦,protected或private還是用自己C++習慣的m_/s_/g_/k開頭駝峰命名法也就是其他人會看到的interface命名法遵照微軟建議另外回歸正題,event其實只是個工具,我認為用自己或團隊認為合理的工具對症下藥就好,不必拘泥於用或不用特定工具
作者: jerryklu (魯凱)   2018-11-12 23:11:00
unreal也會偵測駝峰命名在編輯器中顯示會自動多空格
作者: breakself (A3)   2018-11-17 01:05:00
Event可以拿來斷耦合,例如在MVC架構中可以用Event傳出去,減少不同Class交互Reference的狀況
作者: wulouise (在線上!=在電腦前)   2018-11-17 22:18:00
最後一段,我覺得問題是這個event不明確,或是資料不足原po可以舉一個具體的例子來提問,比較能釐清你的疑問如果不了解bad smell是甚麼,可以google design pattern有點想不太到什麼情況是不該收event卻收了還要不做事
作者: cjcat2266 (CJ Cat)   2018-11-18 09:25:00
那些都可以成為客製event的參數
作者: wulouise (在線上!=在電腦前)   2018-11-18 13:16:00
delegate可以自訂變數,你只要把從哪來,去哪裡標明就沒問題了設計上應該是所有取得道具event給ui supervisorui supervisor決定要更新到那,不會有混淆的問題出現

Links booklink

Contact Us: admin [ a t ] ucptt.com