[TH] Unity Ep6 เขียนโค้ดเดินหน้า ถอยหลัง และกระโดด

บทความนี้เป็นตัวอย่างการเขียนโค้ด C# เพื่อขยับวัตถุวงกลมในหน้าจอให้เดินหน้า ถอยหลัง และกระโดด ตามลักษณะพื้นฐานของเกมแบบแพลตฟอร์ม ซึ่งเป็นหนึ่งในหลายตัวอย่างที่นำมาใช้ในการสอนวิชาการสื่อสารข้อมูลฯ สำหรับพัฒนาเกมแบบผู้เล่นหลายคน

สร้างเวกเตอร์ 2 มิติ

อ่านค่าการเคลื่อนที่ในแนวนอนหรือเดินหน้าถอยหลัง

อ่านสถานะการกดแป้นกระโดด (Jump) หรือ space bar โดยมีค่าเป็นจริงกับเท็จ

การตรวจสอบการซ้อนกันโดยใช้การตรวจสอบแบบวงกลม

สร้างวัตถุประเภท Game Object ได้แก่ Player (ในที่นี้ใช้วงกลม) โดยเพิ่ม GroundCheck สำหรับเป็นจุดสำหรับตรวจสอบสถานะของผู้เล่นว่าอยู่บนพื้นอันเป็น GameObject ชื่อ Floor หรือไม่

สร้าง GameObject แบบ 2 มิติเป็นกล่องสี่เหลี่ยม และตั้งชื่อว่า Floor

สร้าง Layer “Ground” และกำหนดให้พื้นอยู่ในกลุ่ม Layer “Ground” โดย Tag นั้นมีไว้สำหรับกำหนดประเภทของ GameObject อันมีประโยชน์ตอนตรวจสอบสอบการชนกันระหว่างวัตถุที่มีแท็กแตกต่างกันด้วยการตรวจสอบจาก Event

เพิ่ม Component ประเภท Box Collider 2D เพื่อใช้สำหรับตรวจสอบการชนในระบบฟิสิกส์

สร้างผู้เล่นเป็น GameObject แบบ 2 มิติจากวงกลม และตั้งชื่อว่า Player โดยวางตำแหน่งไว้ด้านบนของ Floor หลังจากนั้นตั้งค่าฟิสิกส์ด้วยการเพิ่ม Component ประเภท Rigidbody 2D สำหรับให้เกิดการทำงานการตกตามหลักของระบบฟิสิกส์

เพิ่ม Component ประเภท Circle Collider 2D เพื่อใช้สำหรับตรวจสอบการชนในระบบฟิสิกส์

สร้าง GameObject ประเภท Empty พร้อมตั้งชื่อเป็น GroundCheck หลังจากนั้นย้ายตำแหน่ง GameObject ไปไว้ด้านล่างของ Player สำหรับตรวจสอบการอยู่บนพื้น

ที่หน้าต่าง Project ให้สร้างโฟลเดอร์ Scripts และ Materials สำหรับเป็นที่เก็บโค้ดโปรแกรม และการตั้งค่าวัสดุสำหรับ GameObject

ให้สร้าง Material ในโฟลเดอร์ Materials หลังจากนั้นปรับแต่งค่าตามความต้องการแล้วลากไฟล์ไปวางบน Player จะทำให้ Player มีค่าวัสถุตามที่ตั้งค่า

ให้สร้างสคริปท์ประเภท C# เก็บไว้ในโฟลเดอร์ Scripts หลังจากนั้นปรับค่าโค้ดโปรแกรมให้เป็นดังต่อไปนี้

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private float horizontal;
    private float speed = 9.8f;
    private float jumpingPower = 19.6f;
    [SerializeField] private Rigidbody2D rb;
    [SerializeField] private Transform groundCheck;
    [SerializeField] private LayerMask groundLayer;

    void Start()
    {
    }
     void Update()
    {
        horizontal = Input.GetAxisRaw("Horizontal");
        if (Input.GetButtonDown("Jump") && IsGrounded())
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpingPower);
        }

        if (Input.GetButtonDown("Jump") && rb.velocity.y > 0.0f)
        {
            rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);
        }
    }
    private void FixedUpdate()
    {
        rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);
    }
    private bool IsGrounded()
    {
        return Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer);
    }
}

เมื่อเขียนเสร็จให้ลากไฟล์สคริปท์ไปวางบน Player แล้วตั้งค่าการเชื่อมต่อกับ C# Script

จากตัวอย่างนี้จะพบว่า Unity มองทุกอย่างเป็น GameObject และส่วนของการเขียนโปรแกรมจะอยู่ในรูปแบบของสคริปท์ภาษา C# ที่มีฟังก์ชันหลัก 2 ตัว คือ Start() ที่ถูกเรียกเพียงครั้งเดียวเมื่อตอนสคริปท์ทำงาน และ Update() ที่ถูกเรียกใช้ไปเรื่อย ๆ โดยที่มีฟังก์ชัน FixedUpdate() เป็นฟังก์ชันที่มีไว้รองรับเรื่องการเคลื่อนที่ตามหลักฟิสิกส์

แต่อย่างไรก็ดี เมื่อทดลองเล่นตัวอย่างโปรแกรม และเมื่อสังเกตการทำงานจะพบว่า ในบางครั้งจะไม่สามารถกระโดดได้ ทั้งที่โค้ดโปรแกรมไม่ได้ผิดพลาด แต่เหตุที่เกิดขึ้นนั้นมาจากการการกระโดดมีผลต่อการหมุน Player เมื่อ Player ถูกหมุนกลับส่งผลให้ตัว GroundCheck เคลื่อนไปจากตำแหน่งด้านล่าง ทำให้เมื่อฟังก์ชัน IsGrounded() ทำการตรวจสอบจะได้ผลตอบกลับเป็น False ทั้งที่ Player ไม่ได้ลอยอยู่บนอากาศแต่อยู่บน Floor นั่นเอง

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