在PlayerController中,若只想在遊戲開始時,只執行一次服務器事件,那麼事件就得寫在服務器的本地PlayerController中的。如圖服務器
權威版和非權威版--我的這麼認爲的spa
假如進行一個二人遊戲,那麼服務器上就有兩個PlayerController,客戶端只有一個PlayerController.net
- 權威版就是服務器上的PlayerController,一個PlayerController是服務器的權威版,同時該PlayerController也是服務器的本地PlayerController,另一個PlayerController是客戶端的權威版PlayerController。
- 非權威版就是客戶端上的PlayerController,該PlayerController是客戶端本地的PlayerController,該PlayerController是服務器端的權威版PlayerController 複製/同步 過來的。
單獨存在每一個連接中/或者說是窗口中,服務器上修改的變量不會同步到全部的客戶端blog
因此得依靠GameState去同步給客戶端遊戲
因爲咱們在服務器調用SetRoomName,實際上是能夠不用設置爲在服務器上執行自定義事件的,可是這樣能夠防止客戶端(非權威)執行該事件事件
在多人遊戲會話中,以建立房間,設置房間名字爲例子get
在GameInstance中設置RoomName不須要設置服務器上的GameInstance同步
緣由有兩點io
固然咱們想要讓全部人看到房間名字,因此咱們就得在服務器上設置房間名,因此咱們在GameState中設置了RoomName變量
它將在PlayerController中被調用
以前在客戶端建立房間的時候,一直認爲得首先呼叫服務器事件,而後在這個事件裏去獲取服務器的GameInstance,而後設置RoomName,然而這樣作不會有錯誤,也能夠在服務器事件中獲取到GameInstance,可是在邏輯上就說不通了。(然而這段標註爲紅色的也是錯誤的,在這段話中,說是要去獲取服務器的GameInstance,然而獲取的仍是本地/客戶端的GameInstance,由於若是是在客戶端的Widget是沒有對應權威版的Widget的。例如PlayerController,在客戶端中,做爲客戶端,咱們擁有兩個PlayerController,一個權威版/服務器版,一個非權威版/本地版,那麼咱們去呼叫服務器事件的話,其實就是在權威版的PlayerController中去執行這個事件。因此在Widget中去呼叫服務器事件,其實也是呼叫了本地的Widget,由於Widget只存在於客戶端中)
其實在會話/建立房間這種模式中並不須要在服務器上設置RoomName,由於建立完房間後,自己將會成爲服務器(監聽服務器),即客戶端的GameInstance也自動變成服務器的,而原來服務器的自動成爲客戶端
證實OnServer----服務器事件是呼叫權威版的事件
在查找會話完成後,記得先銷燬上次的會話
這是因爲當服務器退出遊戲時候,不會自動銷燬其餘客戶端的Session,因此得去銷燬上次的會話,不然雖然能夠找到會話,可是加入不了,由於會話已經存在了