วันเสาร์ที่ 29 สิงหาคม พ.ศ. 2558

[Unity 2D] สร้างเกมง่ายๆ Tappy Plane ตอนที่ 6 : มาเริ่มบินกันเถอะ

สร้าง C# Script

ในตอนที่ 6 นี้เราจะมาทำการ Scripting การเคลื่อนที่ของเคลื่อนบินกันโดนใช้ภาษา C# เริ่มแรกเรามาสร้าง Script C# กันก่อน ดังนี้

คลิกขวา Create -> C# Script เพื่อทำการสร้างไฟล์ C# Script ขึ้นมา โดยให้ตั้งชื่อว่า PlaneMovement

เพิ่ม Script ให้กับ Game Object

หลังจากนั้นเราจะต้องทำการเพิ่ม Component Script PlaneMovement เพื่อให้ Game Object Plane รู้จักดังนี้

คลิกที่ Game Object Plane ทางด้านขวาที่หน้าต่าง Inspector คลิกที่ Add Component จากนั้นช่องค้นหาให้พิมพ์ชื่อ Script ที่เราต้องการเพิ่ม เลือก Plane Movement

เริ่มเขียนโปรแกรม

เปิด Script PlaneMovement ขึ้นมา จะเห็นว่าข้างใน Script จะมีฟังก์ชั่น Start() และ Update()

ฟังก์ชั่น Start() จะถูกเรียกครั้งแรกและครั้งเดียว และฟังก์ชั่น Start() จะถูกเรียกก่อนฟังก์ชั่น Update() เสมอ

ส่วนฟังก์ชั่น Update() จะถูกเรียกทุกๆเฟรม

รับ Input จากผู้เล่น

ในฟังก์ชั่น Update ให้เพิ่ม Code ดังนี้

private void Update()
  {
    if (Input.GetMouseButtonDown(0))
    {
      Debug.Log("Click");
    }
  }

Input.GetMouseButtonDown(0) จะเป็น True เมื่อมีการคลิกที่เม้าส์ซ้ายเกิดขึ้น หรือถ้าเป็นบนมือถือจะเป็น True เมื่อมีการแตะที่หน้าจอ

สาเหตที่ต้องเช็คการรับ Input จากผู้เล่นที่ในฟังก์ชั่น Update() เพราะเราไม่รู้ว่าผู้เล่นจะส่ง Input มาตอนไหน การเช็คใน Update() คือเช็คทุกๆเฟรมจะทำให้เราไม่พลาด Input ที่ผู้เล่นส่งมา

เนื่องจาก Unity ยังมีอีกฟังก์ชั่นที่ชื่อว่า FixedUpdate() ที่จะไม่ได้ถูกรันในทุกๆเฟรมเหมือน Update() แต่จะรันประมาณ 50 ครั้งขึ้นไปต่อวินาที จึงทำให้สามารถพลาดเฟรมใดเฟรมหนึ่งที่ผู้เล่นป้อน Input เข้ามาได้

จากนั้นทดสอบโดยรันเกมแล้วกดคลิก จะเห็นว่าในหน้าต่าง Console จะ print string ที่เราพิมพ์ไป อารมณ์เหมือน printf ในภาษา C หรือ echo ใน PHP
เราสามารถคลิกเข้าไปดูรายละเอียดในหน้าต่าง Console ได้โดยทำการคลิกมุมซ้ายล่าง หน้าต่าง Console ยังมีประโยชน์ไว้ใช้สำหรับดู Bug ต่างๆอีกด้วย

ทำความรู้จักกับ Rigidbody2D

Rigidbody2D เป็น Component สำหรับ Sprite 2D ถ้าใครเคยใช้ Unity ทำเกม 3D มาก่อนจะรู้ว่า Unity เองก็มี Rigidbody สำหรับ 3D  แต่หลังจาก Unity 4.3 ปล่อย 2D Tool ออกมา Unity ก็ได้เพิ่ม Rigidbody2D มาด้วย สรุป Rigidbody2D ใช้สำหรับทำเกม 2D นั่นเอง ดังนั้นในโปรเจคนี้เราจึงใช้ Rigidbody2D

การเพิ่ม Rigidbody2D ลงไปใน Game Object จะทำให้ Game Object นั้นๆถูกควบคุมโดยฟิกส์เอนจิ้นของ Unity โดยแรงโน้มถ่วงจะมีผลต่อ Game Object นั้นๆ และนอกจากนี้ใน Script ยังสามารถใช้ฟังก์ชั่นที่เกี่ยวกับฟิสิกส์ได้

เพิ่ม Rigidbody2D

วิธีการเพิ่ม Rigidbody2D ให้คลิกที่ Game Object ที่ต้องการ จากนั้นทางด้านขวามือที่หน้าต่าง Inspector ให้คลิก Add Component -> Physics 2D -> Rigidbody 2D
หลังจากนั้นลองรันเกมดูจะเห็นว่าเครื่องบินของเราบินตกลงเรื่อยๆ แสดงว่าเครื่องบินของเรามีแรงโน้มถ่วงทางฟิสิกส์เข้ามาเกี่ยวข้องเรียบร้อยแล้ว

บินขึ้นด้วย AddForce

สร้างตัวแปรชนิด Float มาหนึ่งเพื่อกำหนดความเร็วของการบินขึ้นเมื่อผู้เล่นทำการคลิกที่เม้าส์หรือแตะที่หน้าจอมือถือ โดยกำหนดดีฟอลต์เท่ากับ 200

public float _TabSpeed = 200f;
  
  private void Update()
  {
    if (Input.GetMouseButtonDown(0))
    {
      GetComponent<Rigidbody2D>().AddForce(Vector2.up * _TabSpeed);
    }
  }

เมื่อกดรันเกมแล้วกดคลิกเม้าส์ซ้ายจะเห็นได้ว่าเครื่องบินบินขึ้นแล้ว

อะไรคือ Vector2

Vector2 คือ การแสดงตำแหน่งแบบ 2D ด้วยจุด x และ y โดยที่ up คือตัวแปรแบบ Static ที่จะสามารถทำให้เราเขียนโปรแกรมได้สะดวกและสั้นลง

down คือ Vector2(0, -1)
up คือVector2(0, 1)
left  คือ Vector2(-1, 0)
right คือ Vector2(1, 0)
zero คือ Vector2(0, 0)

ดังนั้นถ้าเขียนเต็มๆจะได้
GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 1) * _TabSpeed);

เราไม่ได้ต้องการให้เครื่องบินบินขึ้นแค่ 1 ดังนั้นเราจึงทำการคูณด้วยตัวแปร _TapSpeed โดยการสร้างตัวแปรเป็นชนิด Public จะสามารถทำให้เราปรับค่าระหว่างรันได้

จากภาพจะเห็นว่าที่ Script PlaneMovement มีตัวแปร Tab Speed ขึ้นมาให้เราสามารถปรับแต่งค่าระหว่างอยู่หน้าจอ Unity ได้ ให้ลองรันเกมแล้วปรับค่า Tab Speed ดู จะเห็นว่าเมื่อกดกดหยุดแล้วค่าจะกลับมาเป็นเหมือนเดิม
AddForce เป็นฟังก์ชั่นทางฟิกส์ซึ่งจะทำการคำนวณให้ว่าเครื่องบินควรจะบินขึ้นไปเท่าไหร่ โดยคำนวณจากหลายๆปัจจัยทางฟิสิกส์ เช่น ความเร่ง และมวลสาร เป็นต้น

บินไปทางขวาด้วยการเปลี่ยนตำแหน่ง

เมื่อเราสร้าง Empty Game Object ขึ้นมาจะมี Component Tranform ขึ้นมาให้ด้วยเลย เพราะว่าตัว Tranform นี่แหละที่เป็นตัวบอกตำแหน่งว่าตอนนี้ Game Object นี้อยู่ตำแหน่งไหนของเกม
เราจะมาทำให้เครื่องบินบินไปทางขวาเรื่อยๆกัน

อย่างแรกเลยสร้างตัวแปรชนิด Float ในที่นี้จะตั้งชื่อตัวแปรว่า _Speed ใช้เก็บค่าความเร็วของเครื่องบินที่จะเคลื่อนที่ไปทางขวา

 public float _TabSpeed = 200f;
  public float _Speed = 0.1f;

  private void Update()
  {
    Vector3 pos = new Vector3(_Speed, 0, 0);
    transform.position += pos;
 
    if (Input.GetMouseButtonDown(0))
    {
      GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 1) * _TabSpeed);
    }
  }

ทำไม Vector3

Vector3 คือตำแหน่งแบบ 3D คือจุด x y และ z ถึงโปรเจคนี้จะเป็น 2D แต่ Component ต่างๆของ 2D เพิ่งจะมีเข้ามาตอน Unity เวอร์ชั่น 4.3 Component Tranform เป็น Component ที่มีมาก่อนที่ 2D จะเข้ามา แต่ Component Tranform สามารถใช้ใน 2D ได้เช่นกัน โดยการใส่ค่า z ให้เป็น 0

Vector3 pos = new Vector3(_Speed, 0, 0); จะทำการสร้างตำแหน่งใหม่โดยให้ x เท่ากับ _Speed
transform.position += pos; เป็นการเปลี่ยนตำแหน่งโดยบวกไปเรื่อยๆ จะทำให้เห็นว่าเครื่องบินเคลื่อนที่ไปทางขวาตลอด

รันและทดสอบเกมจะเห็นว่าเครื่องบินจะบินไปเรื่อยๆจนออกหน้าแสดงผลเกมไปเลย ในตอนหน้าจะมาเขียนโปรแกรมให้กล้องติดตามเครื่องบิน เพื่อที่จะได้แสดงผลเครื่องบินตลอดเวลา
ตอนที่ 7 : จัดการกล้องให้ติดตามเครื่องบิน

ไม่มีความคิดเห็น:

แสดงความคิดเห็น