ইউনিটি গেম ডেভেলপমেন্ট – ফ্লাপি বার্ড ২

এর আগের লেখাতে দেখেছি কিভাবে ফ্লাপি বার্ড গেম তৈরি করা যায়। সেখানে দেখলাম ফ্লাপি বার্ড যদি পাইপের সাথে লেগে যায়, তাহলে গেম থেমে যায়। পুনরায় খেলা যায় না। পুনরায় যেন প্রথম থেকে খেলা যায়, আমরা সেই ব্যবস্থা করব। তার জন্য প্রথমে একটা ক্যানভাস তৈরি করে নিব হায়ারেকিতে। নাম দিতে পারি Game Over Canvas।

এর ভেতর গেম ওভার লেখাটি দেখতে পারি। তার জন্য রাইট ক্লিক করে UI > Text এ ক্লিক করে আমরা একটা টেক্সট ভিউ যুক্ত করে নিব। ইন্সপেক্টর থেকে এর লেখা পরিবর্তন, কালার, সাইজ সহ যে কোন কিছুই করা যাবে।

এবার আরেকটি বাটন যুক্ত করব। যেখানে ক্লিক করলে গেমটি পুনরায় খেলা যাবে। তার জন্য UI > Button এ ক্লিক করব। বাটনের ভেতর আরেকটা টেক্সট ভিউ পাবো। সেখানে ক্লিক করে এর টেক্সট পরিবর্তন করতে পারব।

এখন যদি আমরা গেমটি প্লে করি, তাহলে Game over canvas এর সব কিছুই দেখা যাচ্ছে। আমরা চাইবো গেমের শুরুতে যেন এই ক্যানভাসটি না থাকে। তার জন্য হায়ারাকি থেকে Game Over Canvas সিলেক্ট করার পর ইন্সপেক্টর থেকে ক্যানভাসটি আনচেক করে দিলে তা আর দেখাবে না।

এখন গেম ওভার হয়ে গেলে এই ক্যানভাসটি দেখানোর জন্য আমাদের আরেকটি স্ক্রিপ্ট লাগবে। যার নাম দিতে পারি GameManager। প্রজেক্ট উইন্ডোতে গিয়ে রাইট ক্লিক করে Create > C# Script তে ক্লিক করে একটা স্ক্রিপ্ট তৈরি করে নিব। নাম দিব GameManager।

এর পাশা পাশি আমাদের আরেকটি ইম্পটি গেম অবজেক্ট লাগবে, যার সাথে এই গেম ম্যানেজার স্ক্রিপ্টটা যুক্ত থাকবে। তার জন্য প্রথমে হায়ারেকি থেকে Create Empty তে ক্লিক করে একটা ইম্পটি গেম অবজেক্ট তৈরি করে নিব। নাম দিতে পারি Game Manager Object। এই অবজেক্টে GameManager স্ক্রিপ্টটি যুক্ত করে দিব। এর ভেতর একটা ফাংশন লিখব এমনঃ

   public void GameOver()
    {

        gameOverCanvas.SetActive(true);

        Time.timeScale = 0;

    }

সম্পূর্ণ কোডঃ

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

public class GameManager : MonoBehaviour
{
    public GameObject gameOverCanvas;

    public void GameOver()
    {

        gameOverCanvas.SetActive(true);

        Time.timeScale = 0;

    }

}

এখন হায়ারাকিতে যদি আমরা Game Manager Object সিলেক্ট করি, তাহলে ডান পাশে ইন্সপেক্টরে দেখব Game Over Canvas নামে একটা ফিল্ড রয়েছে। বাম পাশের হায়ারেকি থেকে আমরা যে Game Over Canvas ক্যানভাস তৈরি করেছি, তা ড্র্যাগ করে এনে ছেড়ে দিব।

FlyBird স্ক্রিপ্টে যখন ফ্লাপি পাইপের সাথে লেগে যায়, তখন আমরা যে কোড টি লিখেছি, তার পরিবর্তে গেম ম্যানেজারের এই GameOver ফাংশনটিকে কল করব। সম্পূর্ণ কোড FlyBird.cs এর কোডঃ

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

public class FlyBird : MonoBehaviour
{
    public GameManager gameManager;

    float velocity = 3;
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {

            rb.velocity = Vector2.up * velocity;

        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        Time.timeScale = 0;

        gameManager.GameOver();

    }
}

গেম ম্যানেজারের সাথে এই FlyBird এর কোন কানেকশন নেই। FlyBird জানে না কোনটা GameManager। public GameManager gameManager; ভ্যারিয়েবলটা। এখন হায়ারেকি থেকে Bird সিলেক্ট করলে ইন্সপেক্টরে Game Manager নামক একটা ফিল্ড দেখব। হায়ারেকি থেকে Game Manager Object টি ড্র্যাগ করে এখানে ছেড়ে দিতে হবে।

এখন যদি আমরা গেমটি প্লে করি, এবং ফ্লাপি পাইপের সাথে লেগে যায়, তাহলে গেম ওভার ক্যানভাসটি আমরা দেখতে পাবো।

গেম ওভার ক্যানভাসে Replay নামক বাটন রয়েছে। ঐ বাড়নে ক্লিক করলে কিছুই হয় না। কারণ বাটনটিকে আমরা কিছু করতে বলিনি। GameManager.cs এ আমরা একটা ফাংশন লিখব, Replay() নামক। যার কোড হবে এমনঃ

 public void Replay()
    {
        SceneManager.LoadScene(0);


    }

SceneManager ব্যবহার করে পুরো গেমটা পুনরায় চালু করব। এর জন্য আমাদের SceneManagement লাগবে। GameManager.cs সম্পূর্ণ কোডঃ

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

public class GameManager : MonoBehaviour
{
    public GameObject gameOverCanvas;


    public void Start()
    {
        Time.timeScale = 1;

    }

    public void GameOver()
    {

        gameOverCanvas.SetActive(true);

        Time.timeScale = 0;

    }



    public void Replay()
    {
        SceneManager.LoadScene(0);


    }
}

এবার হায়ারেকি থেকে Replay বাটনটি সিলেক্ট করব। ডানপাশে ইনস্পেক্টরে এ দেখব ButtonScript নামক একটা কম্পোনেন্ট রয়েছে।

এখানে On Click() অংশে দেখব একটা অপশন রয়েছে। এখানে দেখব List is Empty। প্লাস আইকনে ক্লিক করলে একটা আইটেম যুক্ত হবে। এবং None (Object) নামক একটা অপশন দেখব। এখানে Game Manger Object টি ড্র্যাগ করে এনে ছেড়ে দিব। No Function এ ক্লিক করে GameManager > Replay() সিলেক্ট করব। তাহলে এই বাটনটি ক্লিক করলে Replay() ফাংশনটি কল হবে।

এখন যদি গেমটি খেলে দেখি, তাহলে গেম ওভার হয়ে যাওয়ার পর দেখতে পাবো আমরা রিপ্লে বাটনে ক্লিক করে পুনরায় খেলতে পারছি।

গেম তো খেলতেছি। কোন স্কোর দেখা যাচ্ছে না। স্কোর কিভাবে দেখানো যায়?

স্কোর তখনি বাড়বে যখন ফ্লাপি দুই পাইপের মধ্য দিতে যেতে পারবে। দুই পাইপের মধ্য আমরা একটি ইম্পটি গেম অবজেক্ট রাখব। যখনি ফ্লাপি ঐ গেম অবজেক্ট পার করবে, তখনি স্কোর এক বাড়াবো। তার জন্য হায়ারেকিতে একটি ইম্পটি গেম অবজেক্ট তৈরি করে নিব। যেমন Add Score। মুভ টুল ব্যবহার করে এটিকে দুই পাইপের মধ্যে রাখব। আর এই Add Score থাকবে আমাদের Pipes নামক অবজেক্টের ভেতর, অন্য দুইটা পাইপের সাথে। যেন পাইপ মুভ হওয়ার সাথে সাথে এটিও মুভ হয়।

Add Score অবজেক্টে ইন্সপেক্টর থেকে Box Collider 2D যুক্ত করব। এখানে Edit Collider নামক একটা অপশন পাবো। এখানে ক্লিক করে আমরা এই কলাইডারটির সাইজ বাড়াতে কমাতে পারব। কলাইডারটি রিসাইজ করে দুই পাইপের মাঝা মাঝি যতটুকু জায়গা আছে, তার সমান করব। এবং Is Trigerer টি চেক করে দিব।

আমাদের আরেকটা স্ক্রিপ্ট লাগবে এই Add Score ইম্পটি অবজেক্টের জন্য। যেখানে আমরা চেক করব ফ্লাপি এই অবজেক্টের ভেতর দিয়ে গিয়েছে কিনা। নাম দিতে পারি AddScore। এই AddScore স্ক্রিপ্টটি Add Score ইম্পটি অবজেক্টে যুক্ত করতে হবে। এর ভেতর নিচের মত করে লিখতে পারিঃ

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

public class AddScore : MonoBehaviour
{

    private void OnTriggerEnter2D(Collider2D collision)
    {
      
        Debug.Log("collided");

    }
}

OnTriggerEnter2D দিয়ে চেক করা হয় কোন অবজেক্ট তার ভেতর দিয়ে গিয়েছে কিনা। যদি যায়, তাহলে আমরা লগে ম্যাসেজ দেখিয়েছি collided।

গেম প্লে করার পর যদি এখন আমরা পাইপের মধ্য দিয়ে যেতে পারি, তাহলে দেখব কনসোলে লেখা উঠে collided।

এবার আমরা স্কোর দেখাতে পারি। তার জন্য হায়ারাকিতে একটা টেক্সট ভিউ যুক্ত করব, যেখানে স্কোর দেখাবো। রাইট ক্লিক করে UI > Text এ ক্লিক করে টেক্সট ভিউ যুক্ত করব। ইচ্ছে মত গেম সিনে রাখব এবং ইন্সপেক্টর থেকে ফন্ট সাইজ, কালার ইত্যাদি নিজের মত করে পরিবর্তন করব।

স্কোর দেখানোর জন্য আমাদের আরেকটা স্ক্রিপ্ট লাগবে। যেমন Score। এই স্ক্রিপ্ট স্কোর টেক্সট ভিউতে যুক্ত করে দিব। এবং লিখবঃ

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

public class Score : MonoBehaviour
{

    public static int score = 0;

    void Start()
    {
        score = 0;
    }


    void Update()
    {

        GetComponent<UnityEngine.UI.Text>().text = score.ToString();

    }
}

গেমের শুরুতে আমরা স্কোর ০ করে নিলাম। GetComponent().text = score.ToString(); এর মাধ্যমে UI  এর টেক্সট বা স্কোর টেক্সট পরিবর্তন করলাম।

AddScore.cs স্ক্রিপ্টে যখন ফ্লাপি দুই পাইপের মাঝখানের জায়গা দিয়ে যায়, তখন আমরা লগে একটা ম্যাসেজ দেখিয়েছি। তার পরিবর্তে আমরা Score এর ভ্যালু বাড়াবো। AddScore.cs:

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

public class AddScore : MonoBehaviour
{

    private void OnTriggerEnter2D(Collider2D collision)
    {

        Score.score++;

    }
}


এখন যদি আমরা গেমটি প্লে করি, তাহলে দেখব যখনি দুই পাইপের মধ্যে দিয়ে যেতে পারি, স্কোর ভিউতে স্কোর দেখাচ্ছে।

বাহ! পূর্ণাঙ্গ একটা গেম হয়ে গেলো দেখছি। একটা কিছু বাকি আছে। সাউন্ড।

হায়ারাকি থেকে Main Camera সিলেক্ট করব। ডান পাশের ইন্সপেক্টরে গিয়ে Add Component থেক Audio Source নামক কম্পোনেন্ট যুক্ত করব। এখানে Audio Clip নামক একটা ফিল্ড রয়েছে। প্রথমে গেম এসেটে একটা মিউজিক যুক্ত করে দিব। এরপর এই মিউজিকটি ড্র্যাগ করে Audio Clip ফিল্ডে ছেড়ে দিব। এবার যদি গেম প্লে করি, তাহলে দেখব কি সুন্দর মিউজিক ও বাজছে।

প্রতিটা ইভেন্টের জন্য চাইলে আমরা আলাদা আলাদা মিউজিক যুক্ত করতে পারি। তা নিজে নিজে চেষ্টা করে দেখতে পারেন।

পরের লেখাঃ

ইউনিটি গেম ডেভেলপমেন্ট – ফ্লাপি বার্ড ৩ – সাউন্ড

1 thought on “ইউনিটি গেম ডেভেলপমেন্ট – ফ্লাপি বার্ড ২”

  1. ভাইয়া কনসোলে collided লেখা আসে না। যখন Add Score ইম্পটি অবজেক্টের ইন্সপেক্টর এ , Add Score স্ক্রিপ্ট টা দিলাম তখন হইসে।

    Reply

Leave a Reply