Home / Developer  / Game Development  / สร้าง Multiplayer Game บน Unity 3D ด้วย NetworkManager

สร้าง Multiplayer Game บน Unity 3D ด้วย NetworkManager

เกมแบบหลายผู้เล่นในระบบเครือข่ายหรือ Multiplayer Game บน Unity 3D นั้นมี Asset Store มากมายให้เลือกใช้แต่ในบทเรียนนี้เราจะมาเรียนรู้เรื่องของ Network Manager กันก่อน

ในบทเรียนนี้จะเริ่มต้นโดยการเรียกใช้ Network Manager ให้รู้ก่อนว่าเราสามารถทำอะไรกับมันได้บ้าง โดย Flow หลักของเกมที่เราจะพัฒนาจะมีการทำงานต่อไปนี้

  1. ผู้เล่นที่เป็น Host หรือ Server จะทำการ Create สนามรบหรือฉากพร้อมตัวละครออกมาวิ่งในฉาก
  2. ผู้เล่นที่ต้องการเข้าไปเล่นด้วยกันจะทำการค้นหา Host หรือ Server ที่ Create ไว้แล้วเพื่อ Join Server
  3. การควบคุมจะเป็นปุ่ม WASD และ Mouse คลิกเพื่อโจมตีด้วยดาบ
  4. เป็นเกมมุมมองบุคคลที่ 3
  5. ข้อผิดพลาดที่ยังต้องแก้ไขคือ Network Camera ที่ยังไม่เรียบร้อยดีเท่าไร (กำลังหาวิธีแก้ไข)

เอาลาะมาเตรียมความพร้อมกัน ในตัวอย่างนี้แนะนำให้ไปออกแบบ Terrian ของเกมให้เรียบร้อยด้วย Assets ที่มีในมือก่อนครับ

Screen Shot 2558-12-07 at 10.56.22 AM

ตัวละครแนะนำให้ใช้ Mecanim และ Animator Controller ให้พร้อมโดยสร้าง State ของ Parameter เป็น Bool และ Trigger ต่อไปนี้

  • (Bool) IsRunning – สำหรับตรวจสอบสถานะว่าวิ่งหรือหยุดวิ่ง
  • (Bool) IsJumping – สำหรับตรวจสอบสถานะว่ากระโดด หรือ ไม่กระโดด
  • (Bool) IsAttack – สำหรับตรวจสอบสถานะการโจมตี
  • (Trigger) Death – เมื่อตายเท่านั้น

อ่านบทความการสร้างตัวละครได้ที่นี่

  1. เขียนเกม Unity การทำ Humanoid ให้กับ โมเดลตัวละคร 3 มิติ
  2. เขียนเกม 3 มิติด้วย Unity การใช้ Animator Controller

นำตัวละครลงไปใน Unity ทำการ rigged และสร้าง Animator Controller ให้เรียบร้อย พร้อมเพิ่ม Network View Component ลงไปในตัวละคร

Screen Shot 2558-12-07 at 11.12.29 AM

นำตัวละครลงไปในเกม

Screen Shot 2558-12-07 at 11.12.36 AM

ตั้งค่า Rigidbody และ Physics และ Collider ให้เรียบร้อย พร้อมทั้งใส่ Network View Component ลงไป

เมื่อตั้งค่าตามตัวอย่างเป็นที่เรียบร้อย ให้เราสร้าง Game Objects ขึ้นมาเปล่าๆ หนึ่งตัว พร้อมกับเพิ่ม Script ภาษา C# ชื่อว่า NetworkManager.cs ขึ้นมาใส่ Code ต่อไปนี้

โดยเราตั้งชื่อห้องว่า Havoc เป็น default Name ไว้ก่อน พร้อมช่องกรอกชื่อของผู้เล่น(ยังไม่ได้ใช้งานอะไรตอนนี้) ตามด้วยสถานะของ isRefreshingHostList เป็น false เพื่อให้ Client ตรวจสอบว่ามี Server รันไว้อยู่หรือเปล่า โดยรายชื่อ Server ที่ Host สร้างไว้จะถูกเก็บใน Array ที่ชื่อว่า HostData

พร้อมกับประกาศ GameObject ว่า PrefabsObjectPlayer สำหรับ Clone ตัวผู้เล่นเมื่อมีสถานะการ Join เข้ามาใน Host ของเกมที่กำลังเล่นอยู่

สร้างหน้าจอ GUI ขึ้นมา โดยมีเงื่อนไขว่า ถ้ากด Start Server จะเรียกฟังก์ชันการสร้าง Server ดังนี้

เมื่อมีการสร้าง Start Server จะไปเรียกฟังก์ชัน CreatePlayer() ขึ้นมาเพื่อเป็นการ Clone ตัว Player

แต่ถ้าหากว่าเป็นเครื่องที่เป็น Client จะต้องกด RefreshHost ก่อนก็จะไปเรียกคำสั่งนี้แทน

ดังนั้นไฟล์ NetworkManager.cs จะเป็นแบบนี้

Screen Shot 2558-12-07 at 6.07.05 AM

ทดสอบการเข้า StartServer()

Screen Shot 2558-12-07 at 10.52.12 AM

ตัวละครเข้าไปในเกม

ดังนั้นให้เราไปสร้างการควบคุมตัวละครที่ Player ในเกมของเรา โดยเพิ่มไฟล์ player.cs เข้าไป

มีคำสั่งในการ Synchonizes ตัวละครในเกมให้ตรงกับส่วนของ Server Time เข้ามาก่อน เพื่อควบคุมโดย

ส่วนของการควบคุมจะทำงานที่  InputMovement() ให้ประกาศ Header ก่อน

ตามด้วย

ภาพรวมของไฟล์ Player.cs จะเป็นดังนี้

เอาล่ะทำการ Clone Prefabs ของเจ้า Player ของเราซะ เมื่อ Clone เสร็จก็ลบต้นแบบมันทิ้งไปเลย

Screen Shot 2558-12-07 at 11.30.43 AM

ไปที่ GameObject ตัว NetworkManager ครับให้ ลากเจ้า Prefabs ของ Player ไปวางที่ Prefabs Objects Player

Screen Shot 2558-12-07 at 10.59.02 AM

ดังภาพข้างล่าง

Screen Shot 2558-12-07 at 10.59.13 AM

 

ทำการ Build Setting สร้าง EXE หรือ MAC โปรแกรม Exceute ตัว Client ขึ้นมา

Screen Shot 2558-12-07 at 6.02.53 AM

ทำการ Execute เกมเรามาตัวหนึ่ง

Screen Shot 2558-12-07 at 6.06.55 AM

ทดสอบเกมของเรา

เปิดเกมขึ้นมาตัวจะเป็น Server หรือ Client ก็ได้สลับกันเล่นดู

Screen Shot 2558-12-07 at 6.07.24 AM

ทดสอบใหม่อีกครั้งให้สร้าง Server ขึ้นมาสัก 1 Host เพื่อทดสอบ Multiplayer

Screen Shot 2558-12-07 at 6.09.58 AM

ถ้าตัว Server สร้างแล้วอีกโปรแกรมที่จะเป็น Client ก็ให้กด Refresh Hosts เสีย

Screen Shot 2558-12-07 at 10.53.00 AM

เจอชื่อ Server ว่า Havoc ก็ให้ Join เลย

Screen Shot 2558-12-07 at 10.54.30 AM

เล่นเกม MultiPlayer ได้แล้ว

Screen Shot 2558-12-07 at 10.55.05 AM

ก็กลายเป็นว่าเล่นเกม MultiPlayer ได้แล้ว

หมายเหตุ: ต้องเปลี่ยน Camera เป็น Global Camera จะไม่มีปัญหาการควบคุมกระตุก แต่ที่ใส่ไว้ใน Prefabs ของ Player เพื่อที่จะทดสอบใน Labs ต่อไปคือการใช้ Network Camera แบ่งการมองในแต่ละ Client ให้เรียบร้อย

อ้างอิง:

  1. http://docs.unity3d.com/ScriptReference/Networking.NetworkManager.html
  2. http://docs.unity3d.com/ScriptReference/Networking.NetworkManager.StartHost.html
  3. http://docs.unity3d.com/ScriptReference/Networking.NetworkLobbyManager-gamePlayerPrefab.html

Comments

daydevthailand@gmail.com

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ,ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Review overview
NO COMMENTS

Sorry, the comment form is closed at this time.