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

[Unity 2D] สร้างเกมง่ายๆ Tappy Plane ตอนที่ 14 : ซ่อน/แสดง UI และเริ่มเกมใหม่ด้วย LoadLevel

ซ่อน CanvasGameOver

คลิกที่แคนวาส จากนั้นไปที่หน้าต่าง Inspector ที่มุมบนซ้ายให้ติ๊กเครื่องหมายถูกออก

แสดง CanvasGameOver เมื่อเครื่องบินตาย

ไปที่ Script PlaneMovement ให้เพิ่มตัวแปรแคนวาสดังนี้ public Canvas _CanvasGameOver;
เพื่อทำการอ้างถึงตัว CanvasGameOver จากนั้นลากออบเจ็ค CanvasGameOver มาใส่ดังภาพ
เมื่อเครื่องบินมีการชนเกิดขึ้นจะเซ็ทให้ CanvasGameOver แสดงขึ้นมาได้ดังโค้ด

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

    _CanvasGameOver.gameObject.SetActive(true);
  }

หลังจากรันและทดสอบเกมจะเห็นว่าเมื่อเครื่องบินชนจะมี UI Game Over แสดงผลขึ้นมาโดยเล่นแอนิเมชั่นที่เราได้ทำการสร้างไว้ก่อนหน้านี้ด้วย

เริ่มเกมใหม่ด้วย LoadLevel

สร้าง C# Script ขึ้นมาใหม่ ในที่นี้ตั้งชื่อว่า UI จากนั้นสร้างฟังก์ชั่น Retry สำหรับทำหน้าที่ในการเริ่มเกมใหม่ ดังนี้

public class UI : MonoBehaviour
{
  public void Retry()
  {
    Application.LoadLevel("Game");
  }
}

คำสั่ง Application.LoadLevel("Game"); จะทำหน้าที่ในการโหลดซีนที่มีชื่อว่า "Game" ขึ้นมาใหม่ ให้ใส่ชื่อซีนที่ต้องการเข้าไป

กรณีผู้อ่านใช้ Unity 5.3 ขึ้นไปให้ใช้ SceneManager.LoadScene("Game") แทน

จากนั้นที่เกมออบเจ็ค CanvasGameOver ให้เพิ่ม Component UI Script เข้าไป
กลับไปที่เกมออบเจ็ค BtnRetry ที่หน้าต่าง Inspector ไปที่ Component Button จะเห็นว่ามีอีเว้นท์ On Click อยู่ ให้ลากเกมออบเจ็ค CanvasGameOver ไปใส่ เนื่องจากเราต้องการจะเรียกใช้ฟังก์ชั่น Retry ใน UI Script

เมื่อใส่เกมออบเจ็ค CanvasGameOver เรียบร้อยแล้ว ให้คลิกที่ No Function จะเห็นว่ามีป๊อปอัพขึ้นมา ให้เลือก UI จากนั้นเลือกฟังก์ชั่น Retry()
จะได้ผลลัพธ์ดังนี้
ทดสอบโดยการรันเกมเมื่อเครื่องบินชนจะมีป๊อปอัพ GameOver เปิดขึ้น จากนั้นเมื่อกดปุ่ม Retry จะเห็นว่าเกมได้ทำการเริ่มใหม่เรียบร้อย

UI Game Start


สร้างเกมออบเจ็ค Canvas ขึ้นมาใหม่ ในที่นี้จะตั้งชื่อให้เป็น CanvasStart จากนั้นตั้ง Reference Resolution X เป็น 1280 และ Y เป็น 720
สร้างเกมออบเจ็คในที่นี้ตั้งชื่อว่า GetReady โดยขวาที่ CanvasStart จากนั้นไปที่ UI -> Image
จากนั้น ที่ Source Image ให้นำภาพ textGetReady มาใส่ ที่ตำแหน่ง Pos Y ในที่นี้ให้เป็น 54
สร้าง UI -> Image ขึ้นมาอีก ในที่นี้ตั้งชื่อว่า TapLeft จากนั้นนำภาพ tapLeft มาใส่ กำหนดตำแหน่ง X เป็น -160 และตำแหน่ง Y เป็น -30
ทำแบบเดียวกันเพื่อสร้างเกมออบเจ็ค TapRight แต่ให้ตั้งค่าให้ตำแหน่ง X เป็น 160 แทน
สร้างเกมออบเจ็ค UI -> Image ในที่นี้ตั้งชื่อว่า Hand นำภาพ tap ใส่ใน Source Image ตั้งค่าตำแหน่งใหเ X เท่ากับ 200 และ Y เท่ากับ 120 จากนั้นเพิ่ม Component Animator
เนื่องจากเราจะให้ผู้เล่นรู้ว่าเมื่อคลิกจะเป็นการเริ่มเกม เราจะทำแอนิเมชั่นคลิกให้กับเกมออบเจ็ครูปมือนี้ เริ่มจากคลิกที่เกมออบเจ็ค Hand จากนั้นไปที่หน้าต่างการทำงานของ Animation คลิก Create เพื่อสร้างคลิปแอนิเมชั่น ในที่นี้ตั้งชื่อว่า Hand
ปรับ Samples ให้เท่ากับ 12 ที่เฟรม 0 ให้ลากภาพ tap เข้ามา
จากนั้นไปที่เฟรม 1 ให้ลากภาพ tapTick เข้ามา
ให้ทดสอบโดยการกดรันแอนิเมชั่นดูจะเห็นว่าที่รูปมือมีแอนิเมชั่นคลิกเรียบร้อย

คลิกเพื่อเริ่มเกม

เมื่อลองรันเกมดูจะเห็นว่าเกมจะเริ่มเล่นทันที ส่วน UI Game Start จะขึ้นมาตั้งแต่เริ่มรันซีน และยังอยู่ในขณะที่เล่นเกมจนกระทั่งจบเกม

ดังนั้นในส่วนนี้เราจะมาเขียนโค้ดให้แสดง UI Start Game และตัวเครื่องบินจะต้องยังไม่เริ่มบินทันทีในตอนเริ่มต้น แต่เมื่อผู้เล่นทำการคลิกเราจะทำการซ่อน UI Start Game และสั่งให้เครื่องบินบิน

เปิด Script PlaneMovement ขึ้นมา
สร้างตัวแปรสำหรับเช็คว่าเกมเริ่มหรือยัง โดยใช้ค่าเริ่มต้นเป็น false

private bool _IsStart = false;

สร้างฟังก์ชั่น Start() ขึ้นมาใช้สำหรับกำหนดค่าเริ่มต้นให้ค่า isKinematic เป็น true ซึ่งหมายความว่า Collision และ Rigidbody จะไม่ส่งผล ทำให้เครื่องบินไม่บินตกลงไปตามแรงโน้มถ่วง

private void Start()
  {
    GetComponent<Rigidbody2D>().isKinematic = true;
  }

ในฟังก์ชั่น Update() เพิ่มการเช็ค _IsStart ถ้าเกมเริ่มแล้วถึงจะให้เครื่องบินบินไปทางขวา

 private void Update()
  {
    if (_IsDead) return;

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

ทดลองรันเกมจะเห็นได้ว่า เมื่อเริ่มเกมเครื่องบินจะหยุดอยู่กับที่ และแสดง UI Game Start เรียบร้อย

จากนั้นเราจะมาทำให้เมื่อเกิดการคลิกเกิดขึ้นให้ซ่อน UI Game Start และให้เครื่องบินตามปกติ ดังนี้
สร้างตัวแปร public Canvas เพื่อใช้อ้างอิงถึง UI Game Start

public Canvas _CanvasGameStart;

เลือกที่เกมออบเจ็ค Plane ที่ PlaneMovement Script จะเห็นว่ามี Canvas Game Start ขึ้นมา ให้ลากเกมออบเจ็ค CanvasGameStart ที่เราทำการสร้างเอาไว้ก่อนหน้านี้มาใส่
จากนั้นที่ฟังก์ชั่น Start() ให้เพิ่มโค้ดเพื่อแสดง UI Game Start เข้าไป
_CanvasGameStart.gameObject.SetActive(true);

จะได้ดังนี้

  private void Start()
  {
    GetComponent<Rigidbody2D>().isKinematic = true;
    _CanvasGameStart.gameObject.SetActive(true);
  }

ในฟังก์ชั่น Update() ตรงส่วนการเช็คอีเว้นท์คลิกให้ทำการแก้ไขดังนี้

if (Input.GetMouseButtonDown(0))
{
      if (!_IsStart)
      {
        _CanvasGameStart.gameObject.SetActive(false);
        GetComponent<Rigidbody2D>().isKinematic = false;
        _IsStart = true;
      }
      else
      {
        GetComponent<Rigidbody2D>().AddForce(Vector2.up * _TabSpeed);
      }
}

หมายความว่าถ้าเกมยังไม่เริ่มและมีการคลิกเกิดขึ้น โปรแกรมจะวิ่งเข้าไปทำโค้ดดังต่อไปนี้

 _CanvasGameStart.gameObject.SetActive(false); //ซ่อน UI Game Start
 GetComponent<Rigidbody2D>().isKinematic = false; //กำหนดให้ Collision และ Rigidbody มีผลต่อเกมออบเจ็คนี้
 _IsStart = true; //ให้ตัวแปรเช็คเป็น true แสดงว่าเกมเริ่มแล้ว

หลังจากเกมเริ่มแล้วและผู้เล่นได้ทำการคลิกจะทำให้โปรแกรมลงมาทำงานที่บรรทัดดังต่อไปนี้
GetComponent<Rigidbody2D>().AddForce(Vector2.up * _TabSpeed); //ให้เครื่องบินบินขึ้นเมื่อมีการคลิก

ลองทดสอบโดยการรันและเล่นเกมจะเห็นว่าเราได้ UI เกมครบ Flow แล้ว คือ
- แสดง UI Game Start
- คลิกเพื่อเริ่มเกม -> ซ่อน UI Game Start -> เกมเริ่มเล่น
- เมื่อตาย แสดง UI Game Over
- คลิก Retry -> ซ่อน UI Game Over -> โหลดเกมใหม่

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

[Unity 2D] สร้างเกมง่ายๆ Tappy Plane ตอนที่ 13 : UI Elements

UI ก็เป็นส่วนหนึ่งที่ขาดไม่ได้ในเกม ดังนั้นในตอนนี้เราจะมาสร้าง UI ให้กับเกมของเราโดยเมื่อเครื่องบินชนเราจะให้มี UI Game Over เด้งขึ้นมาจากนั้นจะสรุปคะแนนในรอบนี้ และคะแนนสูงสุดที่ผู้เล่นเคยทำได้ และเมื่อกดปุ่ม Retry ก็จะทำการเริ่มเกมใหม่

Canvas

UI อิลิเมนต์จะอยู่ใน GameObject -> UI โดยที่ UI อิลิเมนต์ชนิดต่างๆจะต้องเป็นลูกของ Canvas ถ้าทำการสร้าง UI อิลิเมนต์ในขณะที่ไม่มี Canvas อยู่ใน Hierarchy เลย Canvas จะถูกสร้างขึ้นในโดยอัตโนมัติ
อย่างแรกเลยให้สร้าง Canvas โดยไปที่ GameObject -> UI -> Canvas จะเห็นว่ามีเกมออบเจ็ค Canvas และ EventSystem ขึ้นมา
EventSystem เป็นเกมออบเจ็คที่ใช้ในการส่ง Event ต่างๆให้กับเกมออบเจ็คอื่นๆที่รับมาจากอินพุทต่างๆ เช่น คีย์บอร์ด เมาส์ การทัชสกีนหน้าจอ เป็นต้น

ตั้งค่า Canvas

เปลี่ยนชื่อ Canvas เป็น CanvasGameOver หลังจากนั้นที่หน้าต่าง Inspector ที่ Canvas จะเห็นว่ามีค่าเป็น Screen Space - Overlay

โหมด Screen Space - Overlay ทำงานอย่างไร

หมายความว่าขนาดของ Canvas จะถูกตั้งใจพอดีกับขนาดของหน้าจอเกม เมื่อขนาดของหน้าจอเกมเปลี่ยน UI จะเปลี่ยนขนาดในพอดีกับหน้าจอเกมโดยอัตโนมัติ การ Render ภาพของ Canvas ในโหมดนี้จะไม่อ้างอิงซีนหรือกล้องเลย ดังนั้นหากในซีนไม่มีกล้อง UI ก็ยังคงสามารถแสดงได้เพราะยังถูก Render นั่นเอง

จากนั้นที่ Canvas Scaler ที่ UI Scale Mode ให้ปรับค่าเป็น Scale With Screen Size

Canvas Scaler เป็น Component ที่ใช้ในการควบคุมขนาดของ UI อิลิเมนต์ทั้งหมดที่อยู่ใน Canvas โดยการเลือกเป็น Scale With Screen Size จะทำให้ UI อิลิเมนต์ทั้งหมดพยายามจะปรับขนาดให้ใหญ่ที่สุดที่จะใหญ่ได้ตามขนาดหน้าจอ

โดยเราจะทำการตั้งขนาด Reference Resolution ให้ X เท่ากับ 1280 และ Y เท่ากับ 720

Image

คลิกขวาที่ CanvasGameOver -> UI -> Image ในที่นี้จะตั้งชื่อว่า Background
ไปที่ Component Image ที่ Source Image ให้เลือกภาพ UIbg มาใส่
จากนั้นคลิกที่ Set Native Size จะทำให้ได้ภาพขนาดจริงของภาพ คือ 264x264 ดังภาพ
แต่เนื่องจากเราต้องการให้พื้นหลังของ UI มีขนาดเท่ากับ 600x500 ดังนั้นเราจะมาปรับค่าใน Sprite Editor กันก่อน

Sprite Editor

เลือกรูปภาพ UIbg ที่หน้าต่าง Inspector ให้คลิกที่ปุ่ม Sprite Editor
จะได้หน้าจอการทำงานดังภาพ
แถบ Sprite ที่ค่า Border ตั้งค่าให้ L T R B เป็น 10 จะเห็นว่ามีขอบสีเขียวๆเกิดขึ้นที่ภาพ UIbg

อะไรคือ Border

การเซ็ท Border จtส่งผลให้เมื่อขยายขนาดภาพจะทำให้ตัวกรอบนอกหรือ Border ไม่ถูกขยายตามไปด้วย ดูการเปรียบเทียบด้านล่างประกอบ

เมื่อเปรียบเทียบระหว่าง Image Type Simple กับ Sliced
Simple
Sliced

จะเห็นได้ว่าขอบของ UIbg จะยังคมชัดเหมือนเดิม ดังนั้นที่เกมออบเจ็ค Background ที่ Component Image ตรงค่า Image Type ให้เลือกเป็น Sliced
สร้าง GameObject -> UI -> Image ขึ้นมาอีกตัวในที่นี้จะให้แสดงภาพที่เป็นตัวอักษร Game Over ดังนั้นจึงตั้งชื่อเกมออบเจ็คนี้ว่า GameOver คลิกที่ Set Native Size และปรับตำแหน่ง Y ให้เป็น 150 จะได้ดังนี้

Text

คลิกขวาที่ CanvasGameOver เลือก UI -> Text ในที่นี้ตั้งชื่อว่า TxtScore เพื่อใช้สำหรับแสดงคะแนน
ปรับตำแหน่ง Y เป็น 40 ปรับขนาดให้ Width เป็น 300 และ Height เป็น 60 จากนั้นที่ Text Component ให้พิมพ์ข้อความที่ต้องการจะแสดงในที่นี้เป็น Score : 0 ที่ Font ให้เปลี่ยนเป็น kenvector_future ที่อยู่ใน Kenny Asset ที่ดาวน์โหลดมาในตอนที่ 2 หรือจะใช้ฟอนต์อื่นก็ได้ตามใจชอบ
ปรับ Alignment ให้เป็นกึ่งกลาง จากนั้นที่ขนาดของอักษรให้เลือกเป็น Best Fit ขนาดของตัวอักษรจะถูกปรับโดยอัติโนมัติที่ระหว่างค่า 20-40 ขึ้นอยู่กับความเหมาะสม โดยเราสามารถปรับค่า Min และ Max ได้ตามความต้องการ ที่Color ปรับให้เป็นสีขาว
จากนั้นจะทำการใส่เงาให้กับตัวอักษรสีเหลืองและสีดำ เพื่อให้ตัวอักษรดูมีมิติมากขึ้น โดยคลิก Add Component -> UI -> Effects -> Shadow
โดยให้ทำการเพิ่ม Shadow สีเหลืองและดำ ดังภาพ หรือจะปรับแต่งเองก็ได้
จะได้ผลลัพธ์ดังนี้
สำหรับแสดงคะแนน Best Score ให้ทำเหมือนเดิม โดยปรับตำแหน่งให้เหมาะสม

Button

คลิกขวาที่ CanvasGameOver ไปที่ UI -> Button ในที่นี้จะตั้งชื่อว่า BtnRetry ใช้สำหรับกดเพื่อเริ่มเล่นเกมอีกครั้ง
ที่ Component Image ให้นำภาพ buttonLarge มาใส่ จากนั้นกดปุ่ม Set Native Size ปรับตำแหน่งของปุ่มให้เหมาะสม ในที่นี้ให้ตำแหน่ง Y เท่ากับ -150
ส่วนที่ Text บนปุ่มให้ตั้งค่าเหมือนกับ Text ของคะแนน จะได้ผลลัพธ์ดังนี้

Animation

ต่อไปเราจะมาทำแอนิเมชั่นให้กับ UI โดยใช้หลักการเดียวกันเหมือนกับการทำแอนิเมชั่นเครื่องบิน เมื่อเครื่องบินมีการชนป๊อปอัพ Game Over จะค่อยๆขึ้นมาจากกลางหน้าจอโดยเราจะใช้วิธีปรับ Scale ให้ป๊อปอัพค่อยๆใหญ่ขึ้นจนแสดงในขนาดปกติ

โดยเราจะทำแอนิเมชั่นในเกมออบเจ็ค Background ดังนั้นให้ UI อิลิเมนต์ทุกตัวเป็นลูกของ Background
สร้าง Animator Controller ในที่นี้ตั้งชื่อว่า UIGameOver จากนั้นเพิ่ม Component Animator ให้กับเกมออบเจ็ค Background และให้เพิ่ม Animator Controller UIGameOver ที่ได้สร้างเมื่อสักครู่ลงไป
สร้างแอนิเมชั่นในที่นี้ให้ชื่อว่า UIOpen จากนั้นที่เฟรม 0 เราจะกำหนดให้ Scale X Y และ Z เป็น 0 
และที่เฟรม 5 จะกำหนดให้ Scale X Y และ Z เป็น 1

ลองรันและทดสอบเกมดูจะเห็นว่า UI Game Over ของเรามีแอนิเมชั่นตอนเปิดป๊อปอัพเรียบร้อย แต่แอนิเมชั่นมีการวนลูปเล่นเรื่อยๆ ดังนั้นให้ติ๊ก Loop Time ออกด้วย



วันอาทิตย์ที่ 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);
    }
  }

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