這裡是Photon營運事務局,各位好久不見。
一般情形下,使用者(玩家)可隨意建立房間,列表則會公布於大廳裡。不過,使用者(玩家)有時候可能只想邀請特定的人進入指定的房間中。
現在來說明執行的方法。方法有很多種,這裡我們將介紹兩種用法。
1. 在房間名稱中加上密碼的方法
基本的思考模式
建立房間時,為使房間名稱成為系統中獨一無二的名稱,可使用特定方法,像是在既定名稱的前方或後方加入僅有受邀人知道的密碼。
例如,如果要在後方加入密碼,房間名稱就會變成:(關鍵字)+”_”+(密碼)的形式。
當顯示取得的房間名稱時, 移除 “_” 以及之後的密碼部分,不讓其顯示在清單中。當玩家要進入清單中選取的房間時,請玩家輸入密碼,清單中所顯示出已消除密碼的房間名稱, =(關鍵字), 所以房間全名為:(關鍵字)+”_”+(輸入的密碼)
請以上述房間名稱嘗試進入,如果密碼相符則可進入房間。如果密碼不符,則會因為找不到房間而產生進入失敗的錯誤。
以此方式,取得並顯示房間清單時,雖然需要過濾房間名稱,但這樣的功能, 則會以非常簡易的形式實作出來。
使用實際數值的範例
此處將既定名稱的部分設定為玩家的ID(數字),密碼設定為4位數字。玩家ID : 1010的使用者,利用密碼1234建立房間時,可用1010_1234的房間名稱建立房間。所以房間列表上可能會是:
- 1010_1234
- 1105_2468
- 1530_9876
- …
而在取得房間清單時,以過濾字串的方式取得房間列表。並且把房間名稱_以後的部分皆移除掉。
- 1010
- 1105
- 1530
而如果顯示只ID,其他的使用者將無法辨認,因此改為使用玩家名稱進行顯示。
- Photon太郎
- Realtime野郎
- Server花子
至於ID-->玩家名稱的轉換,可參考您自己的DB,或是使用範列2會提到的房間自訂屬性,即可輕鬆完成。關於自訂屬性的詳細內容,稍後再進行說明。
想進入房間的使用者(玩家)可從此一清單中進行選取,選取後再輸入密碼。程式中把 ID加上已輸入的密碼,嘗試讓玩家進入房間。例如,如果在第一個房間中輸入密碼1235時,將以1010_1235的名稱嘗試進入房間。
由於房間名稱不符,找不到相應的房間就會程式會回傳錯誤,顯示進入房間失敗。如果正確輸入密碼1234時,將以1010_1234的名稱嘗試進入房間。房間名稱相符時,即可成功進入房間。
程式碼範例
來看看實際的程式範例。
建立房間
建立房間時,只要在房間名稱上多費點心思就OK,也可在自訂屬性中設定將於清單中顯示的房間名稱。以PUN實作的範例如下所示。
string roomName = userid + "_" + password; RoomOptions roomOptions; roomOptions.isVisible = true; roomOptions.isOpen = true; roomOptions.customProperties = new Hashtable() { { "displayname", displayname } }; roomOptions.customRoomPropertiesForLobby = new string[] { "displayname" }; PhotonNetwork.CreateRoom(roomName, roomOptions, null);
Native SDK(C#) 的範例如下所示。基本上與PUN相同,其他語言也幾乎相同。此處省略了關於client實體的產生。這個部分將留待日後介紹。
string roomName = userid + "_" + password; Hashtable customGamePropeties = new Hashtable() { { "displayname", displayname } }; string[] propsListedInLobby = new string[] { "displayname" }; client.OpCreateRoom(roomName, 0, customGameProperties, propsListedInLobby);
進入房間
進入房間與建立時相同,只要在房間名稱上多費點心思就OK。PUN的範例
string roomName = userid + "_" + password; PhotonNetwork.JoinRoom(roomName); OnPhotonJoinRoomFailed() { // 進入房間失敗時的程式碼 } OnJoinedRoom() { // 進入房間成功時的程式碼 }
Native SDK(C#) 的範例
string roomName = userid + "_" + password; client.JoinRoom(roomName);
由於關於回呼調用的內容份量較多,此處暫且省略,日後如有機會再另作介紹。
2. 利用房間的自訂屬性+隨機配對的方法
基本的思考模式
另外一個方法是利用房間的自訂屬性。由於在隨機配對中可指定自訂屬性,所以我們在此將使用此一功能。自訂屬性的型別為雜湊表。在進行隨機配對時,房間名稱無法用於配對,因此必須另外設定不同於房間的名稱。
使用實際數值的範例
此處將房間名稱設定為與上面的範例1相同,是以使用者ID(整數值)作為房間名稱,不過只要是不重複的關鍵值,設定為什麼名稱都無妨。
房間名稱=> 使用者ID
自訂屬性 => (
“roomname” => 使用者ID
“password” => 密碼
“displayname” => 顯示名稱
)
為使房間的自訂屬性可顯示於大廳,建立房間時,必須指定其屬性為可從大廳看見房間。
在參數中,設定想在大廳中顯示的自訂屬性鍵。
在上面的範例1時,寫到了從自訂屬性中設定顯示名稱比較省事,其實也就是僅設定此處所提及的displayname,並設定讓它可以顯示於大廳之中。
進入房間時,雖然是使用隨機配對,但因為已指定了自訂屬性,所以實際上是指定房間並且進入。
自訂屬性 => (
“roomname” => 使用者ID
“password” => 密碼
)
透過隨機配對進入符合上述內容的房間。
由於自訂屬性中也已經指定了實質的房間,因此只要密碼相符即可成功進入房間,若不相符則無法進入房間。
程式碼範例
建立房間
在製作房間時,設定自訂屬性的部分非常重要,還有確保可在大廳使用的部分也值得注意。PUN中的範例
string roomName = userid + "_" + password; RoomOptions roomOptions; roomOptions.isVisible = true; roomOptions.isOpen = true; roomOptions.customProperties = new Hashtable() { { "roomname", userid }, { "password", password }, { "displayname", displayname } }; roomOptions.customRoomPropertiesForLobby = new string[] { "roomname", "password", "displayname", }; PhotonNetwork.CreateRoom(roomName, roomOptions, null);
Native SDK(C#)的範例
string roomName = userid + "_" + password; Hashtable customGamePropeties = new Hashtable() { { "roomname", userid }, { "password", password }, { "displayname", displayname } }; string[] propsListedInLobby = new string[] { "roomname", "password", "displayname" }; client.OpCreateRoom(roomName, 0, customGameProperties, propsListedInLobby);
進入房間
使用隨機配對 (JoinRandomRoom)。此時因為已經指定自訂屬性,因此實際上是指定了一個特定不重複的房間。
PUN中的範例
Hashtable expectedCustomProperties = new Hashtable() { { "roomname", userid }, { "password", password }, }; PhotonNetwork.JoinRandomRoom(expectedCustomProperties, 0); OnPhotonJoinRandomRoomFailed() { // 進入房間失敗時的程式碼 } OnJoinedRoom() { // 進入房間成功時的程式碼 }
使用Navive SDK(C#)時
Hashtable expectedCustomRoomProperties = new Hashtable() { { "roomname", userid }, { "password", password }, }; client.OpJoinRandomRoom(expectedCustomRoomProperties, 0);
評論
0 條評論
請登入寫評論。