วันอาทิตย์ที่ 6 กันยายน พ.ศ. 2558

[Unity 2D] สร้างเกมง่ายๆ Tappy Plane ตอนที่ 12 : ตาย!! เครื่องบินชนทำไงดี

เพิ่ม Collider ให้เครื่องบิน

เนื่องจากเราจะทำการเช็คการชนเมื่อเครื่องบินมีการชนสิ่งกีดขวางเกิดขึ้น อย่างแรกเราจะทำการเพิ่ม Collider ให้กับเครื่องบินก่อน โดยเราจะเพิ่ม CircleCollider2D ให้กับเครื่องบินได้ดังนี้

คลิกที่เกมออบเจ็คเครื่องบินจากนั้น Add Component -> Physics2D -> CircleCollider2D
จากนั้นปรับค่า Radius หรือรัศมีของวงกลมเป็น 0.35 โดยผู้เรียนสามารถปรับได้ตามความเหมาะสมให้พอดีกับขนาดของเครื่องบิน ในหน้าต่างซีนจะได้ดังนี้
เมื่อทดสอบรันเกมดูจะเห็นว่าเครื่องบินมีการชนกับพื้นหลัง ดังนั้นจะมาปรับการตั้งค่าของ Layer Collision กัน

Layer Collision

ไปที่ Edit -> Project Settings -> Physics2D ที่ Layer Collision Matrix จะเห็นว่าเราสามารถปรับแต่งได้ว่าอยากให้เลเยอร์ไหนชนกับเลเยอร์ไหน

สร้าง Layer

ที่หน้าต่าง Inspector ที่ Layer คลิกเลือก Add Layer
จากนั้นให้ทำการเพิ่มเลเยอร์ Background และ Plane ลงไป
ที่เกมออบเจ็ค Plane เลือกเลเยอร์ Plane ที่สร้างขึ้นเมื่อสักครู่
ที่เกมออบเจ็ค Background1 เลือกเลเยอร์ให้เป็น Background จากนั้นคลิกที่ Apply ที่ Prefab

ปรับแต่ง Layer Collision

จากนั้นกลับไปที่ Edit -> Project Settings -> Physics2D ที่ Layer Collision Matrix จะเห็นว่ามี Layer Background และ Plane ขึ้นมาให้ปรับแต่งแล้ว ในที่นี้เราจะปรับให้ Background สามารถชนกับ Default ได้อย่างเดียว (เนื่องจากเราจะให้ Looper เป็นเลเยอร์ Default) ส่วนเลเยอร์ Plane เราจะปล่อยไว้อย่างนี้ก่อน
ลองรันและทดสอบเกมจะเห็นว่าเครื่องบินไม่มีการชนกับพื้นหลังแล้ว

ต่อไปเราจะทำให้เกมออบเจ็คเครื่องบินชนกับสิ่งกีดขวางจำพวก หิน พื้นและเพดานถ้ำ โดยทำการสร้างเลเยอร์ใหม่ให้กับเกมออบเจ็คสิ่งกีดขวาง โดยในที่นี้ให้ใช้ชื่อว่า Rock
ไปที่เกมออบเจ็ค Ground1 ที่หน้าต่าง Inspector ให้กำหนดเลเยอร์เป็น Rock จากนั้นกด Apply ให้ Prefab จะเห็นว่า Ground1-3 และ Top1-3 จะมีเลเยอร์เป็น Rock เรียบร้อบแล้ว
ในส่วนของเกมออบเจ็ค Rocks เราก็ต้องการกำหนดให้เป็นเลเยอร์ Rock เช่นกัน จากภาพจะเห็นได้ว่าเราต้องการไม่ต้องการให้เครื่องบินชนส่วนที่เป็น BoxCollider2D ที่เราใช้สำหรับเช็คในการจัดการการลูป เราต้องการให้เครื่องบินชนได้แค่ส่วนที่เป็นหินเท่านั้น ดังนั้นเราจึงทำการกำหนดเลเยอร์ Rock ให้กับ Child  ของเกมออบเจ็ค Rocks แทน
ไปที่เกมออบเจ็ค Rocks1 จากนั้นเลือกเกมออบเจ็ค RockTop และ RockButtom ที่หน้าต่าง Inspector ให้กำหนดเลเยอร์เป็น Rock

เลือกที่เกมออบเจ็ค Rocks อีกครั้งจากนั้นกด Apply ให้กับ Prefab จะเห็นได้ว่าที่เกมออบเจ็ค Rocks1-6 เกมออบเจ็คลูกคือ RockTop และ RockButtom จะมีเลเยอร์เป็น Rock เรียบร้อยแล้ว
กลับไปที่หน้าต่าง Layer Collision Matrix อีกครั้ง ให้ปรับให้เลเยอร์ Plane สามารถชนกับเลเยอร์ Rock ได้ และเลเยอร์ Rock สามารถชนกับเลเยอร์ Default (ตัวจัดการลูป) โดยการติ๊กถูกดังภาพ
จากนั้นเราจะทำการปรับตำแหน่งของเครื่องบิน เนื่องจากเราต้องการให้เครื่องบินเริ่มต้นที่ตำแหน่งค่อนไปทางซ้ายเผื่อที่ผู้เล่นจะได้มองเห็นหินกีดขวางและหลบได้ทัน ดังภาพ
ให้ไปที่เกมออบเจ็ค Plane ที่หน้าต่าง Inspector ตรงตำแหน่ง X ให้ปรับค่าเป็น -5
จากนั้นลองรันและทดสอบเกมดูอีกครั้งจะเห็นได้ว่าเครื่องบินมีการชนสิงกีดขวางเรียบร้อยแล้ว

ตาย!!

สร้างตัวแปร private bool _IsDead = false; ขึ้นมาสำหรับใช้เช็คว่าเครื่องบินตายหรือยัง

public class PlaneMovement : MonoBehaviour
{
  public float _TabSpeed = 200f;
  public float _Speed = 0.1f;

  private bool _IsDead = false;

  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);
    }
  }
}

โดยเมื่อเครื่องบินมีการชนเกิดขึ้นตัวแปร _IsDead จะเท่ากับ True และจะสั่งเล่นแอนิเมชั่นตายที่เราได้ทำขึ้นไว้ในตอนที่ 4 และ 5 ดังนี้

public void OnCollisionEnter2D(Collision2D collision)
  {
    _IsDead = true;
    GetComponent<Animator>().SetBool("IsDead", true);
  }

นอกจากนี้เมื่อเครื่องบินตายเครื่องบินจะต้องหยุดวิ่งไปทางด้านขวา และเครื่องบินจะต้องไม่บินขึ้นเมื่อผู้เล่นคลิกเมาส์ซ้ายหรือแตะที่หน้าจอ ดังนั้นในฟังก์ชั่น Update() เราจึงทำการเช็คถ้าเครื่องบินตายแล้วให้ return ออกเลยดังนี้

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

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


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

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