บทเรียนการสร้างเกม Multiplayer ง่ายๆ บน Unity โดยใช้ Asset ชื่อว่า Mirror ทำเกมเล่นบน Network สำหรับสาย สร้างเกม 2 มิติครับ
เริ่มต้นให้ทำการ Create Project ขึ้นมาใหม่ผ่าน Unity Hub ครับ
ทำการดาวน์โหลด Asset ที่จำเป็นหน่อย ผมเลือกใช้ Free Assets จากเว็บไซต์นี้:
ก็ได้ ใช้ของเหล่านี้ครับ
ทำการจัด Background ของ Hierarchy ให้พร้อมเดินได้ตามตัวอย่างในภาพครับ ตั้งค่า Size ของ Main Camera เป็น 1 และกำหนด Sprite2D ส่วนของ Sprite Renderer ของ Order in Layer 2 ภาพ เช่นภาพท้องฟ้า และทุ่งหญ้าตามตัวอย่าง
ส่วนของทุ่งหญ้าต้นไม้ใส่ Collider2D เข้ามา กำหนดพื้นที่ให้ตัวละครเดินได้ ไปมาตามภาพ
สร้างชุด Animation ของ Player โดย Sprite Editor แบบ Slice 135×135(แล้วแต่ภาพของแต่ละคน) คือท่า Idle และ ท่า Run วิธีการย้อนหลังที่ : Unity2D การนำ Sprite Sheets ไปสร้าง Animation ในเกม
ทำการออกแบบ Animator Controller ตามนี้โดยใช้ Parameter ทั้งหมด 2 ตัวคือ Speed เป็น Float และ Grounded เป็น bool
เส้น Transition ที่โยงจาก Idle ไปที่ Run ให้กำหนดตามนี้:
กำหนดให้ Grounded เป็น true ส่วน Speed ถ้ามากกว่า 0.1 ให้วิ่ง ส่วนเส้นของ Run กลับไปที่ Idle ให้กำหนดตามนี้:
ต่อมาให้ดาวน์โหลดและติดตั้ง Mirror Assets ครับดาวน์โหลดที่: Mirror | Network | Unity Asset Store
เมื่อ Import แล้วให้ทำการ Restart Editor ของ Unity รอบหนึ่งให้มัน Compile Script รอบหนึ่งก่อน หลังจากนั้นให้ไปที่ Player ของเรา เพิ่ม Component ต่อไปนี้ครับ:
ใส่ RigidBody2D ลงไป และ BoxCollider2D แค่ต้อง Edit Collider เล็กน้อยให้พอดีตัวของตัวละคร
เพิ่ม Component เข้าไปคือ Network -> Network Identity, Network -> Network Animator และ Network->Network Transform โดยทั้งหมดต้องใส่ Animator ลากตัวมันเองไปวางใน Network Animator และคลิก เครื่องหมายถูกที่ Client Authority ทั้งหมด
สร้าง Script Player ขึ้นมาแล้วใส่ Code ต่อไปนี้ครับ:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mirror; public class Player : NetworkBehaviour { [SerializeField] public float Speed, maxSpeed, horizontal; public bool grounded; Physics2D physics2D; Animator animator; void Start() { animator = this.gameObject.GetComponent<Animator>(); } // Update is called once per frame void Update() { if (this.isLocalPlayer) { horizontal = Input.GetAxis("Horizontal"); animator.SetBool("Grounded", true); animator.SetFloat("Speed", Mathf.Abs(horizontal)); if (horizontal < -0.1f) { transform.Translate(Vector2.right * Speed * Time.deltaTime); transform.eulerAngles = new Vector2(0, 180); } else if (horizontal > 0.1f) { transform.Translate(Vector2.right * Speed * Time.deltaTime); transform.eulerAngles = new Vector2(0, 0); } } } }
จะเห็นว่าเราเพิ่ม
using Mirror;
เพื่อให้ทำงานส่วนของคำสั่งใน Mirror ได้ และเปลี่ยน MonoBehavior เป็น NetworkBehavior
public class Player : NetworkBehaviour
ส่วนของ Update() เราได้เช็คส่วนของ isLocalPlayer ของ NetworkBehavior มาใช้
if (this.isLocalPlayer) { }
ทำการ Clone ตัว Player ของเราไปเป็น Prefab ครับ
สร้าง Empty GameObject ขึ้นมาตั้งชื่อว่า GameController แล้วใส่ Component ของ
- Network -> Network Manager
- Network -> Network ManagerHUD
เปิด Network Manager ขึ้นมาลาก Player จาก Prefab ไปวางที่ Player Prefab
ทำการ Build ExE แล้วรันเปิดเป็น Server 1 เครื่อง นอกนั้น Client ครับ แล้วเล่นได้เลย
ก็ประมาณนี้ครับ ตัวอย่างแรก ดูคลิปได้นะ: