บทความนี้เป็นตัวอย่างการเขียนโค้ด C# เพื่อขยับวัตถุวงกลมในหน้าจอให้เดินหน้า ถอยหลัง และกระโดด ตามลักษณะพื้นฐานของเกมแบบแพลตฟอร์ม ซึ่งเป็นหนึ่งในหลายตัวอย่างที่นำมาใช้ในการสอนวิชาการสื่อสารข้อมูลฯ สำหรับพัฒนาเกมแบบผู้เล่นหลายคน
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-09.54.48-1024x504.png)
ชุดคำสั่งที่ควรรู้
สร้างเวกเตอร์ 2 มิติ
ตัวแปรเก็บเวกเตอร์2มิติ = new Vector2( ค่าx, ค่าy )
อ่านค่าการเคลื่อนที่ในแนวนอนหรือเดินหน้าถอยหลัง
ตัวแปรเก็บการเคลื่อนที่ในแนวนอน = Input.GetAxisRaw(“Horizontal”)
อ่านสถานะการกดแป้นกระโดด (Jump) หรือ space bar โดยมีค่าเป็นจริงกับเท็จ
สถานะการกด = Input.GetButtonDown(“Jump”)
การตรวจสอบการซ้อนกันโดยใช้การตรวจสอบแบบวงกลม
สถานะการซ้อนกัน = Physics2D.OverlapCircle(
ตำแหน่งของตัวตรวจสอบ,
รัศมีของวงกลมที่ใช้ตรวจสอบการซ้อนทับกัน,
ชื่อเลเยอร์ของพื้น
)
ขั้นตอนที่ 1 เตรียมเกมออบเจ็ก
สร้างวัตถุประเภท Game Object ได้แก่ Player (ในที่นี้ใช้วงกลม) โดยเพิ่ม GroundCheck สำหรับเป็นจุดสำหรับตรวจสอบสถานะของผู้เล่นว่าอยู่บนพื้นอันเป็น GameObject ชื่อ Floor หรือไม่
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.14.56.png)
สร้าง floor
สร้าง GameObject แบบ 2 มิติเป็นกล่องสี่เหลี่ยม และตั้งชื่อว่า Floor
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.28.04.png)
สร้าง Layer “Ground” และกำหนดให้พื้นอยู่ในกลุ่ม Layer “Ground” โดย Tag นั้นมีไว้สำหรับกำหนดประเภทของ GameObject อันมีประโยชน์ตอนตรวจสอบสอบการชนกันระหว่างวัตถุที่มีแท็กแตกต่างกันด้วยการตรวจสอบจาก Event
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.28.12.png)
เพิ่ม Component ประเภท Box Collider 2D เพื่อใช้สำหรับตรวจสอบการชนในระบบฟิสิกส์
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.30.04.png)
สร้าง Player
สร้างผู้เล่นเป็น GameObject แบบ 2 มิติจากวงกลม และตั้งชื่อว่า Player โดยวางตำแหน่งไว้ด้านบนของ Floor หลังจากนั้นตั้งค่าฟิสิกส์ด้วยการเพิ่ม Component ประเภท Rigidbody 2D สำหรับให้เกิดการทำงานการตกตามหลักของระบบฟิสิกส์
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.39.06.png)
เพิ่ม Component ประเภท Circle Collider 2D เพื่อใช้สำหรับตรวจสอบการชนในระบบฟิสิกส์
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.40.05.png)
เพิ่มตัวตรวจสอบการอยู่บนพื้น
สร้าง GameObject ประเภท Empty พร้อมตั้งชื่อเป็น GroundCheck หลังจากนั้นย้ายตำแหน่ง GameObject ไปไว้ด้านล่างของ Player สำหรับตรวจสอบการอยู่บนพื้น
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.35.32.png)
ขั้นตอนที่ 2 เตรียมโฟลเดอร์สำหรับเก็บ Assets
ที่หน้าต่าง Project ให้สร้างโฟลเดอร์ Scripts และ Materials สำหรับเป็นที่เก็บโค้ดโปรแกรม และการตั้งค่าวัสดุสำหรับ GameObject
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.18.06.png)
สร้าง Material
ให้สร้าง Material ในโฟลเดอร์ Materials หลังจากนั้นปรับแต่งค่าตามความต้องการแล้วลากไฟล์ไปวางบน Player จะทำให้ Player มีค่าวัสถุตามที่ตั้งค่า
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.41.46.png)
เขียนโค้ด
ให้สร้างสคริปท์ประเภท 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
![](https://www.jarutex.com/wp-content/uploads/2024/02/Screen-Shot-2567-02-04-at-12.45.22-1024x353.png)
สรุป
จากตัวอย่างนี้จะพบว่า Unity มองทุกอย่างเป็น GameObject และส่วนของการเขียนโปรแกรมจะอยู่ในรูปแบบของสคริปท์ภาษา C# ที่มีฟังก์ชันหลัก 2 ตัว คือ Start() ที่ถูกเรียกเพียงครั้งเดียวเมื่อตอนสคริปท์ทำงาน และ Update() ที่ถูกเรียกใช้ไปเรื่อย ๆ โดยที่มีฟังก์ชัน FixedUpdate() เป็นฟังก์ชันที่มีไว้รองรับเรื่องการเคลื่อนที่ตามหลักฟิสิกส์
แต่อย่างไรก็ดี เมื่อทดลองเล่นตัวอย่างโปรแกรม และเมื่อสังเกตการทำงานจะพบว่า ในบางครั้งจะไม่สามารถกระโดดได้ ทั้งที่โค้ดโปรแกรมไม่ได้ผิดพลาด แต่เหตุที่เกิดขึ้นนั้นมาจากการการกระโดดมีผลต่อการหมุน Player เมื่อ Player ถูกหมุนกลับส่งผลให้ตัว GroundCheck เคลื่อนไปจากตำแหน่งด้านล่าง ทำให้เมื่อฟังก์ชัน IsGrounded() ทำการตรวจสอบจะได้ผลตอบกลับเป็น False ทั้งที่ Player ไม่ได้ลอยอยู่บนอากาศแต่อยู่บน Floor นั่นเอง
สุดท้ายนี้หวังว่า ตัวอย่างนี้คงเป็นพื้นฐานเริ่มต้นสำหรับการนำไปประยุกต์ใช้กับเนื้อหาในครั้งหน้าที่จะเป็นการเขียนเพื่ออ่านข้อมูลเกี่ยวกับการเชื่อมต่อเครือข่ายต่อไป ขอให้สนุกกับการเขียนโปรแกรมและพัฒนาเกมครับ
(C) 2020-2024, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2024-02-04, 2024-02-13