เอกสาร Steamworks
การค้นหาคู่ต่อสู้และล็อบบี้บน Steam

ภาพรวม

การค้นหาแมตช์แบบ Peer-to-Peer ของ Steam นั้นสร้างขึ้นจากแนวคิดการใช้ล็อบบี้ ล็อบบี้คือเอนทิตีที่ทำงานอยู่บนเซิร์ฟเวอร์แบ็กเอนด์ของ Steam ซึ่งทำงานคล้ายกับห้องแชท ผู้ใช้สามารถสร้างล็อบบี้ใหม่ เชื่อมโยงข้อมูลกับล็อบบี้ ค้นหาล็อบบี้จากข้อมูลดังกล่าว เข้าร่วมล็อบบี้ แล้วแชร์ข้อมูลกับผู้ใช้อื่น ๆ ในล็อบบี้ ล็อบบี้หนึ่งสามารถรองรับผู้ใช้ได้ถึง 250 คน แต่โดยทั่วไปแล้วเกมส่วนใหญ่จะมีผู้เล่นที่เล่นร่วมกันเพียง 2-16 คนเท่านั้น การค้นหาแมตช์ตามทักษะพัฒนาขึ้นโดยมีพื้นฐานมาจากระบบนี้

API การค้นหาแมตช์แบบ Peer-to-Peer ของ Steam เป็นชุดฟังก์ชันที่ช่วยให้ผู้ใช้สามารถค้นหาผู้ใช้อื่น ๆ เพื่อเล่นเกมด้วย ฟังก์ชันการค้นหาแมตช์ทั้งหมดนั้นอยู่ใน ISteamMatchmaking ซึ่งประกอบด้วยรายละเอียดเพิ่มเติมเกี่ยวกับพารามิเตอร์ของแต่ละฟังก์ชัน เราจะใช้ไอดี Steam ในการจำแนกล็อบบี้ต่าง ๆ เช่นเดียวกับการจำแนกผู้ใช้หรือเซิร์ฟเวอร์เกม ตัวอย่างของ Steamworks มีการใช้งานล็อบบี้ที่สามารถใช้งานได้เต็มรูปแบบ

ลำดับกระบวนการค้นหาแมตช์

โดยทั่วไปแล้ว การรวบรวมกลุ่มผู้ใช้ให้มาเล่นเกมร่วมกันนั้น จะมีลำดับการทำงานดังต่อไปนี้:
  1. ผู้ใช้เลือกจากในเกมว่าต้องการเล่นเกมกับผู้เล่นหลายคน พร้อมเลือกลักษณะการเล่นที่ต้องการ (กฎ สถานการณ์ และอื่น ๆ)
  2. เกมจะค้นหาล็อบบี้ที่มีกฎตรงกัน โดยใช้ API การค้นหาล็อบบี้
  3. หากพบล็อบบี้ เกมจะเข้าร่วมล็อบบี้นั้น หากไม่พบล็อบบี้ เกมจะสร้างล็อบบี้ใหม่
  4. ผู้ใช้จะอยู่ในล็อบบี้จนกว่าจะมีผู้เล่นเป็นจำนวนมากพอที่จะเริ่มเกม จะมีการสื่อสารข้อมูลระหว่างสมาชิกล็อบบี้ เช่น เกี่ยวกับตัวละครที่ต้องการเล่น หรือการตั้งค่ารายผู้เล่นอื่น ๆ หากจำเป็นต้องบังคับใช้กฎบางประการในล็อบบี้ (เช่น มีผู้ใช้เพียงคนเดียวเท่านั้นที่สามารถเล่นตัวละครบางตัวได้) จะมีเจ้าของล็อบบี้เพียงคนเดียวเท่านั้นที่สามารถทำหน้าที่ตัดสินชี้ขาดกฎดังกล่าวได้
  5. ล็อบบี้อาจมีหรือไม่มีอินเตอร์เฟสสำหรับผู้ใช้เชื่อมโยงอยู่ด้วย หากมี คุณสามารถใช้ฟังก์ชันการสื่อสารข้อมูลของล็อบบี้เพื่อส่งข้อความแชทระหว่างสมาชิกล็อบบี้ได้ นอกจากนี้ยังสามารถส่งข้อมูลเสียงได้อีกด้วย แต่จะต้องส่งโดยใช้ Steam Networking API
  6. เมื่อพร้อมเริ่มเกม ผู้ใช้ทุกคนจะเข้าร่วมเซิร์ฟเวอร์เกมหรือเชื่อมต่อกับผู้ใช้ที่ได้รับเลือกให้โฮสต์เกม จากนั้นออกจากล็อบบี้ เมื่อผู้ใช้ทุกคนออกจากล็อบบี้แล้ว ล็อบบี้จะถูกทำลายโดยอัตโนมัติ

การค้นหาล็อบบี้

หากต้องการให้เกมของคุณค้นหาล็อบบี้ คุณจะต้องเรียก: ISteamMatchmaking::RequestLobbyList
ฟังก์ชันนี้ทำงานแบบอะซิงโครนัส โดยคืนค่า SteamAPICall_t handle ที่คุณสามารถนำไปใช้ติดตามสถานะของคำร้องขอ การเรียกนี้อาจใช้เวลาดำเนินการจนแล้วเสร็จตั้งแต่ 300 มิลลิวินาที ถึง 5 วินาที ทั้งนี้ขึ้นอยู่กับการเชื่อมต่อระหว่างผู้ใช้กับระบบแบ็กเอนด์ของ Steam และมีไทม์เอาต์ 20 วินาที
จำนวนผลลัพธ์ที่คืนค่ากลับมานั้นจะอยู่ในผลลัพธ์การเรียก LobbyMatchList_t ซึ่งคุณสามารถใช้ ISteamMatchmaking::GetLobbyByIndex เพื่อวนซ้ำทุกรายการและรับไอดีทั้งหมด
สามารถคืนค่าผลลัพธ์ได้สูงสุด 50 รายการ แต่โดยทั่วไปแล้วผลลัพธ์จะมีจำนวนไม่มากนัก การคืนค่าผลลัพธ์จะเรียงลำดับตามระยะห่างทางภูมิศาสตร์และตามการตั้งค่าตัวกรองค่าใกล้เคียง โดยค่าเริ่มต้นแล้ว เราจะไม่คืนค่าล็อบบี้ที่เต็มแล้ว และตัวกรองระยะห่างจะถูกตั้งค่าเป็น k_ELobbyDistanceFilterDefault (บริเวณใกล้เคียง) หากต้องการเพิ่มตัวกรอง ก่อนที่จะเรียก RequestLobbyList คุณจะต้องเรียกฟังก์ชันตัวกรองอย่างน้อย 1 ตัวต่อไปนี้ก่อน:
  • ISteamMatchmaking::AddRequestLobbyListStringFilter - เพิ่มตัวกรองสำหรับเปรียบเทียบสตริง
  • ISteamMatchmaking::AddRequestLobbyListNumericalFilter - เพิ่มตัวกรองสำหรับเปรียบเทียบตัวเลข
  • ISteamMatchmaking::AddRequestLobbyListNearValueFilter - เรียงลำดับผลลัพธ์ให้ใกล้เคียงกับค่าที่ระบุที่สุด
  • ISteamMatchmaking::AddRequestLobbyListFilterSlotsAvailable - ตัวกรองที่ใช้เพื่อคืนค่าเฉพาะล็อบบี้ที่มีช่องเปิดอยู่ตามจำนวนที่ระบุเท่านั้น
  • ISteamMatchmaking::AddRequestLobbyListDistanceFilter - ตั้งค่าระยะทางเชิงกายภาพในการค้นหาล็อบบี้ โดยพิจารณาจากที่อยู่ IP ของผู้ใช้และแผนที่ตำแหน่ง IP ในระบบแบ็กเอนด์ของ Steam
  • ISteamMatchmaking::AddRequestLobbyListResultCountFilter - ตั้งค่าจำนวนล็อบบี้สูงสุดที่ต้องการคืนค่า ยิ่งมีจำนวนน้อย ก็จะสามารถดาวน์โหลดผลลัพธ์และรายละเอียดล็อบบี้ไปยังไคลเอนต์ได้เร็วยิ่งขึ้น

การสร้างล็อบบี้

หากคุณไม่สามารถค้นหาล็อบบี้ที่มีอยู่ให้ผู้ใช้เข้าร่วมได้ โดยทั่วไปแล้วนี่คือเวลาที่คุณจะต้องสร้างล็อบบี้ ให้เรียก
ISteamMatchmaking::CreateLobby แล้วรอให้ดำเนินการเสร็จสมบูรณ์ ผลลัพธ์การเรียกจะบ่งบอกว่าการดำเนินการสำเร็จหรือไม่ และหากสำเร็จ ฟังก์ชันจะคืนค่าไอดี Steam ของล็อบบี้ในสตรัค LobbyCreated_t ซึ่งสามารถใช้ตั้งค่าเมทาดาตาบนล็อบบี้ได้ สิ่งแรกที่คุณอาจจะอยากทำหลังจากสร้างล็อบบี้แล้วก็คือ การตั้งค่าข้อมูลให้ล็อบบี้ เพื่อให้ไคลเอนต์เกมอื่น ๆ สามารถใช้ข้อมูลดังกล่าวในการค้นหาล็อบบี้ของคุณ (กรุณาอ่านข้อมูลเพิ่มเติมด้านล่าง)

การเข้าร่วมล็อบบี้

หากคุณพบล็อบบี้ที่ใช้งานได้ ไม่ว่าจะพบจากการค้นหาหรือจากเพื่อน คุณสามารถใช้ ISteamMatchmaking::JoinLobby แล้วรอผลลัพธ์การเรียก LobbyEnter_t เมื่ออยู่ในล็อบบี้ คุณอาจต้องการใช้ API สำหรับข้อมูลล็อบบี้ เพื่อรับรายละเอียดเกี่ยวกับล็อบบี้และเลือกข้อมูลที่จะแสดงผล (หากมีส่วนแสดงผล)

เมื่อผู้ใช้เข้าร่วมหรือออกจากล็อบบี้ จะมีการโพสต์คอลแบ็ก LobbyChatUpdate_t ถึงสมาชิกทุกคนในล็อบบี้นั้น รวมถึงเจ้าของ

หากต้องการวนซ้ำเพื่อตรวจสอบว่าผู้ใช้คนใดกำลังอยู่ในล็อบบี้ ให้ใช้:

หากต้องการรับข้อมูลเพิ่มเติมเกี่ยวกับผู้ใช้อื่นในล็อบบี้ คุณจำเป็นจะต้องใช้ API เพื่อน กรุณาอ่าน เพื่อน การเชิญ และล็อบบี้ สำหรับข้อมูลเพิ่มเติม

เมทาดาตาของล็อบบี้

เมทาดาตาของล็อบบี้ใช้สำหรับกำหนดสถานะของล็อบบี้ด้วยข้อมูลที่ไม่เจาะจง เช่น ชื่อของล็อบบี้ แผนที่ปัจจุบัน โหมดเกม สถานะของเกมในปัจจุบัน หรือสิ่งอื่น ๆ ที่เกี่ยวข้อง

ผู้ใช้จะได้รับข้อมูลล่าสุดของล็อบบี้ที่ตนเป็นสมาชิกอยู่โดยอัตโนมัติ สำหรับล็อบบี้ที่คืนค่ากลับมาผ่านผลการค้นหา ผู้ใช้จะได้รับข้อมูลล็อบบี้ในขณะเวลาที่ดำเนินการค้นหา หากเป็นล็อบบี้ของเพื่อน คุณจะไม่สามารถรับข้อมูลของล็อบบี้ได้จนกว่าจะเรียก ISteamMatchmaking::RequestLobbyData และดำเนินการจนเสร็จสมบูรณ์แล้ว

หากข้อมูลล็อบบี้มีการเปลี่ยนแปลง สมาชิกล็อบบี้ทุกคนจะได้รับคอลแบ็ก LobbyDataUpdate_t (คอลแบ็กนี้เป็นวิธีเดียวกับที่ใช้รับข้อมูลว่าการเรียก ISteamMatchmaking::RequestLobbyData เสร็จสมบูรณ์แล้ว)

คุณสามารถใช้ชุดฟังก์ชันเหล่านี้เพื่อรับข้อมูลและตั้งค่าข้อมูลของล็อบบี้ มีเพียงเจ้าของล็อบบี้เท่านั้นที่สามารถตั้งค่าหรือลบข้อมูลของล็อบบี้ได้

ฟังก์ชันสำหรับวนซ้ำเมทาดาตา (โดยทั่วไปแล้วควรจะใช้เพื่อการดีบักเท่านั้น):

ล็อบบี้ยังอนุญาตให้สมาชิกสามารถกำหนดเมทาดาตาของตนเองที่สมาชิกคนอื่นสามารถได้รับการอัปเดตได้ด้วยฟังก์ชันต่อไปนี้

การสื่อสารภายในล็อบบี้

ในการส่งข้อมูลภายในล็อบบี้ (ข้อความแชท สัญญาณเริ่มเกม และอื่น ๆ) คุณจะต้องเรียก ISteamMatchmaking::SendLobbyChatMsg เพื่อส่งข้อความไบนารีอย่างง่ายถึงผู้ใช้ทุกคนในล็อบบี้ สมาชิกล็อบบี้จะต้องรอรับคอลแบ็ก ISteamMatchmaking::LobbyChatMsg_t หลังจากได้รับคอลแบ็กแล้ว คุณสามารถใช้ ISteamMatchmaking::GetLobbyChatEntry เพื่อเรียกเนื้อหาของข้อความ

เพื่อน การเชิญ และล็อบบี้

คุณสามารถรับทราบล็อบบี้ทั้งหมดที่เพื่อนของผู้ใช้เป็นสมาชิกอยู่ได้ด้วย API เพื่อน ต่อไปนี้:
int cFriends = SteamFriends()->GetFriendCount( k_EFriendFlagImmediate ); for ( int i = 0; i < cFriends; i++ ) { FriendGameInfo_t friendGameInfo; CSteamID steamIDFriend = SteamFriends()->GetFriendByIndex( i, k_EFriendFlagImmediate ); if ( SteamFriends()->GetFriendGamePlayed( steamIDFriend, &friendGameInfo ) && friendGameInfo.m_steamIDLobby.IsValid() ) { // friendGameInfo.m_steamIDLobby is a valid lobby, you can join it or use RequestLobbyData() get its metadata } }

คุณสามารถเชิญเพื่อนเข้าร่วมล็อบบี้ได้ด้วย ISteamMatchmaking::InviteUserToLobby
ผู้ใช้ดังกล่าวจะได้รับกล่องโต้ตอบแชทพร้อมลิงก์สำหรับเข้าร่วมเกม หากผู้ใช้คลิกลิงก์ แต่ไม่ได้เปิดใช้เกมใด ๆ อยู่ ลิงก์จะเปิดเกมด้วยบรรทัดคำสั่ง:
+connect_lobby <64-bit lobby id>

หากผู้ใช้อยู่ในเกมแล้ว จะมีการโพสต์คอลแบ็ก ISteamFriends::GameLobbyJoinRequested_t ซึ่งประกอบด้วยไอดี Steam ของล็อบบี้ที่ผู้ใช้ต้องการเข้าร่วม เกมของคุณจะตัดสินใจว่าจะปฏิบัติตามหรือไม่

หากคุณต้องการให้ผู้ใช้เลือกเพื่อนที่ต้องการเชิญเข้าร่วมล็อบบี้จากรายชื่อเพื่อน คุณสามารถเรียก ISteamFriends::ActivateGameOverlayInviteDialog
ซึ่งจะเปิดใช้งานโอเวอร์เลย์ในเกมของ Steam ไปยังกล่องโต้ตอบที่ออกแบบมาสำหรับเชิญเพื่อนมายังล็อบบี้ปัจจุบัน

การยืนยันตัวตน

ผู้ใช้ทุกคนในล็อบบี้ Steam ได้รับการยืนยันตัวตนอย่างเต็มรูปแบบแล้วจากระบบแบ็กเอนด์ของ Steam เกมไม่จำเป็นต้องดำเนินขั้นตอนการยืนยันตัวตนเพิ่มเติมใด ๆ กับผู้ใช้ในล็อบบี้ ยกเว้นในกรณีที่ต้องการทราบว่าพวกเขาถูกแบน VAC หรือไม่ (อ่านข้อมูลเพิ่มเติมได้ในหัวข้อเทคโนโลยีป้องกันการโกงของ Valve) หากผู้ใช้พยายามเข้าสู่ระบบจากสถานที่แห่งที่สองด้วยบัญชีเดิม การเข้าสู่ระบบครั้งแรกจะถูกลบออกจากล็อบบี้ต่าง ๆ ที่มีอยู่โดยอัตโนมัติ

การล้างข้อมูล

เมื่อเกมเริ่มต้นแล้ว ผู้ใช้แต่ละคนจะสามารถออกจากล็อบบี้ได้ด้วย:
ISteamMatchmaking::LeaveLobby
เมื่อผู้ใช้ทุกคนออกไปแล้ว ล็อบบี้จะถูกทำลายโดยอัตโนมัติในส่วนของแบ็กเอนด์

คำแนะนำเกี่ยวกับล็อบบี้

  • โดยทั่วไปควรสร้างล็อบบี้เมื่อจำเป็นเท่านั้น ตัวอย่างเช่น เมื่อผู้ใช้เชิญเพื่อนมาร่วมเล่น หรือทริกเกอร์การดำเนินการด้วยตัวเองซึ่งจำเป็นต้องใช้ล็อบบี้
  • อย่าอัปเดตเมทาดาตาในล็อบบี้บ่อยเกินไป เพียงแค่เพิ่มเมทาดาตาและค่าที่ใช้สำหรับการค้นหา (เช่น ประเภทเกมหรือสถานะของเกม) เท่านั้น คุณไม่จำเป็นจะต้องใส่จำนวนผู้เล่น เพราะในการค้นหาล็อบบี้จะเป็นการค้นหาล็อบบี้ที่มีช่องว่างอยู่แล้ว
  • อย่าเข้าร่วมล็อบบี้เพียงเพื่อค้นหาเมทาดาตาของล็อบบี้เท่านั้น คุณสามารถดาวน์โหลดเมทาดาตาของล็อบบี้แยกต่างหากสำหรับล็อบบี้ทั้งหมด ซึ่งเกมของคุณสามารถใช้เพื่อแสดงรายการของล็อบบี้ให้ผู้ใช้เลือก หรือเกมสามารถตัดสินใจได้โดยอัตโนมัติว่าจะเข้าร่วมผลลัพธ์การค้นหาใด

มีคำถามใด ๆ เพิ่มเติมหรือไม่?

ถามคำถามได้ที่ ฟอรัมกระดานสนทนาหัวข้อการค้นหาแมตช์และล็อบบี้ของ Steam