切換
舊版
前往
大廳
主題

【遊戲開發日記 #2】event與static方法讓private涵式能跨腳本被使用,來增進模組化?

%%鼠 拒收病婿 | 2020-07-01 15:59:50 | 巴幣 20 | 人氣 376


前言:
這次主要是程式碼的探討,也有最新進度的動圖。我滿菜的,如果以下有用錯詞或是有建議的部分都麻煩各位指點了


簡單來說,如果想讓其他腳本都能使用特定的方法,那把該方法設成static是最簡單的作法。
但這麼做有個問題,就是在static方法下的變數都要也是static。(全都設成static也是個做法,但我的語感跟我說很不OK)

我之前用過的靜態方法大多是計算與回傳結果,所以不會有用到腳本全域變數的問題。
加上認識event後,腳本間的方法呼叫也大多用event。
但用了一段時間,我有發現用event的一些困難點與限制:
●event只能由宣告該event的腳本呼叫,其他腳本只能掛載/卸載方法上去。 錯誤訊息如下:

●若event的方法掛載沒有規劃一下,到中後期也會變得很亂,尤其event除了是null之外也不太會報錯,追朔起來也是一番辛苦。

●掛上event的方法傳入參數格式要跟event一模一樣,不管有沒有要用,這會讓有些參數是多餘的。

●event有個好處,不管方法是靜態、公開、私有,只要格式對應到就可以掛上去。

綜合以上,我最近腦洞開想到一個打法,不知道是不是正確的,亦或是有甚麼不良後果,所以想在這次更新中提出來討論。

以下為實作例子:
我有個"HitableObj"類別,讓擁有這個類別的物件被攻擊時,能扣血、判斷死亡和產生特效。其中,它有個static event Hit_event 在被攻擊時呼叫並傳入被攻擊物件與傷害。
(Hit掛在Hit_event上)

問題來了,玩家的攻擊腳本要怎麼使用這個Hit_event ?,因為在不同腳本,所以不能直接呼叫event。若是以前我的作法是把Hit_event放在玩家攻擊腳本,再掛載上HitableObj的Hit方法。但怪物攻擊呢? 若怪物的腳本也是一樣的做法,這樣就有2個相同功能的Hit_event在不同腳本裡,這會出現我上面提出的問題,到了後期會很亂。

我希望大家能呼叫一樣的Hit_event,且Hit_event放在HitableObj腳本裡提升模組化,(這樣下款遊戲就能直貼摳過去用了XD),於是寫了個靜態方法,讓其他腳本改由呼叫這個方法。
(因為方法是靜態的,所以event也要是靜態的,但掛在event上的方法就不限,因此每個是HitableObj的物件都可以有自己的設定,例如噴出來的特效不同。)

以上。

在打的時候一直有個問題困擾我:「真的需要用到event嗎? 」
我不確定,但我想到的其他方法還沒有這個做法來的能讓腳本獨立。

尤其是呼叫簡單: (為了配合攻擊動畫,所以在animation clip裡面放觸發方法:)
(先用圓形當判斷範圍擋一下XD,之後會再做精細一點)

以下是HitableObj的有那兩顆球和玩家。(新增連段與迴避)
打到會震動的呼叫方法原理也是一樣:
CameraFollow.cs:

HitableObj.cs:
像之前都會直接找該腳本的物件去呼叫方法,現在直接改成呼叫靜態方法去觸發event,但這有個尷尬點是把幾個變數改成靜態就可以直接呼叫,不用再透過event去掛。


這個思維是好是壞我還說不出來,不過確定的是我又看到新道路了XD。


雜紀:
炫一下我的新玩具>//<
在房間牆上貼120*210 公分的白板 (左邊是我老姊畫的甲甲)

在牆上寫字真的超浪漫的啦!! >//<

送禮物贊助創作者 !
0
留言

創作回應

KK
先推再看@Q@,總覺得這邊不用 Event 處理也可以。不過我自己 Event 也是開靜態,大家都能用比較方便就是了~
2020-07-01 16:22:17
%%鼠 拒收病婿
這裡會用到event是因為每個HitableObj物件都有自己的值,例如HP多寡、特效prefab、未來可能會加防禦力等等... 若是直接用靜態方法處理,這些值就得是靜態的,也就是值都一樣。
另一個做法或許是把這些值交給別的腳本去設定(例如怪物類別),然後把這個腳本單純當成觸發器(?。放在一起我是覺得比較好管理。

如果不用靜態,就打到的時候用getComponent<>取得Hit方法吧?![e15]
2020-07-01 16:55:42
樂小呈
該不會這裡只有我不會用 static的吧 [e20]
2020-07-01 16:46:49
%%鼠 拒收病婿
我學static的過程很簡單:
發現static變數和方法大家都能用,哇! 好方便,就瘋狂想把所以東西都做成static,在執行這"偉大"的計畫時發現static的限制,於是就慢慢收斂了XD
2020-07-01 16:59:00
樂小呈
ooooooooooooooo...噢...原來是這麼一回事阿
https://i.imgur.com/6AzyLaN.gif

突然有種被點通了的感覺,原來 event可以這樣用[e28]
謝謝分享!!!

我自己是不怎麼用 static啦...因為大家都能用,所以只給重要的東西做成 static XDD
2020-07-01 17:11:45
%%鼠 拒收病婿
event只有在被宣告的那個腳本裡能使用是有點麻煩,不過卻在這裡成為一般方法與靜態方法的橋樑[e12]

public static的變數因為大家都能去改它,所以在管理上要謹慎一點。
2020-07-01 17:29:10
番薯先森
牆上寫東西真的很讚w
2020-07-01 17:40:14
%%鼠 拒收病婿
真的棒[e16],越大越好(x
2020-07-01 23:48:53

更多創作