ইউনিটিতে শুটিং এবং পার্টিকেল ইফেক্ট

শুটিং সম্পর্কে সবাই জানি। গুলি ছুড়ে মারা আমরা দেখব কিভাবে গুলি ছুড়ে মারা যায় এবং গুলি কোন এনিমির গায়ে লাগলে কিভাবে ইফেক্ট দেওয়া যায়।

এর জন্য প্রথমে কটা প্রজেক্ট তৈরি করে নিব। এই প্রজেক্টে উদাহরণ হিসেবে Space Shooter স্প্রাইট প্যাক ব্যবহার করব। এখানে আমরা একটা স্পেস শুটার গেম তৈরি করব। গেমে উপর থেকে একটা UFO আসবে। আমরা তাকে শুট করে মারব। আমাদের সব গুলো স্প্রাইট লাগবে না। একটা বিমান, একটা বুলেট, আর একটা UFO লাগবে। ব্যকগ্রাউন্ডও ব্যবহার করতে পারি আমরা। এছাড়া বাড়তি একটা মিউজিক লাগবে। যখন বুলেট গিয়ে UFO কে হিট করবে, তখন এই সাউন্ড ব্যবহার করব।

একবারে ব্যাসিক যা যা লাগবে, তা থেকে শুরু করি। প্রজেক্টের হায়ারেকিতে একটা স্পেশিপ, UFO, বুলেট এই তিনটে রাখি। ব্যাকগ্রাউন্ডও রাখতে পারি। এরপর নিচের মত করে রিপজিশন করে নেই।

 

 

স্পেসশিপে আপাতত আমরা কোন কিছুই করব না।  শুধু বুলেটটা উপরের দিকে যাবে। আর এ জন্য বুলেটের জন্য একটা স্ক্রিপ্ট তৈরি করে নিবঃ

 


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

public class Bullet : MonoBehaviour
{
   
    public float speed = 3;

    void Update()
    {
        transform.position += Vector3.up * speed * Time.deltaTime;
    }
}

এতটুকু করলে বুলেট উপরের দিকে যাবে। এছাড়া বুলেটে Box Collider 2D যুক্ত করে নিব।

UFO যেন নিচের দিকে নামে, তার জন্য একটা স্ক্রিপ্ট লাগবে। এ ছাড়া Box Collider 2D ও Rigidbody 2d যুক্ত করে নিব। UFO নিচের দিকে নামার জন্য নিচের স্ক্রিপ্ট লিখতে পারি। যদিও গ্যাভিটির ফোর্সে তা অটোম্যাটিক নিচে নামবেঃ

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

public class Ufo : MonoBehaviour
{
   
    public float speed = 3;

    void Update()
    {
         transform.position += Vector3.down * speed * Time.deltaTime;
    }
}

এখন যদি বুলেট UFO এর সাথে কোলাইড করে, তাহলে আমরা UFO এবং Bullet দুইটাকেই ডিস্ট্রয় করে দিব। আর এই কোড আমরা যুক্ত করব UFO স্ক্রিপ্টে। Bullet স্ক্রিপ্টেও যুক্ত করতে পারি। একই কাজই করবে।

  void OnCollisionEnter2D(Collision2D other)
    {
            Destroy(gameObject);
            Destroy(other.gameObject);

    }

এখানে Destroy(gameObject) ডিস্ট্রয় করবে UFO। এবং Destroy(other.gameObject) ডিস্ট্রয় করবে বুলেট। যদি বুলেটকে ডিস্ট্রয় না করি, তাহলে UFO ডিস্ট্রয় হওয়ার পর উপরের দিকে যাবে, তা কেমন দেখাবে না? তাই আমাদের দুইটা অবজেক্টই ডিস্ট্রয় করতে হবে।

এখন দুইটা অবজেক্টই এক নিমিষেই গায়েব হয়ে যায়। কোন ইফেক্ট দেখছি না। আমরা ইফেক্ট তৈরি করব একটা। এই ইফেক্ট দেওয়া হয় পার্টিকেল দিয়ে। ডিফল্ট কিছু পার্টিকেল তৈরি থাকে। পার্টিকেল যুক্ত করতে পারি এভাবেঃ

হারারেকিতে UFO এর উপর ক্লিক করে Effects > Particle System এ ক্লিক করব। তাহলে একটি পার্টিকেল তৈরি হবে। UFO এর উপর ক্লিক করে করব এ জন্য যেন UFO এর চাইল্ড হিসেবে তৈরি হয়।

 

এখন ডিফল্ট ভাবেই পার্টিকেল দেখাবে। আমাদের প্রথমে ইন্সপেক্টর থেকে Play On Awak এই এপশনটা বন্ধ করে দিতে হবে। কারণ আমরা এই পার্টিকেলটা তখনই দেখাবো, যখন বুলেট UFO কে আগাত করবে। আর Duration হচ্ছে কতক্ষণ এই পার্টিকেলটা দেখাবে তা। Looping ও বন্ধ করে দিব। এছাড়া Start Rotation থেকে Random Between two constant থেকে দুইটা ভ্যালু দিয়ে দিব। তাহলে র‍্যান্ডমলি রোটেট অবস্থায় পার্টেকেল গুলো দেখাবে।

 

যে ম্যাটেরিয়ালের ইফেক্ট দেখাচ্ছে, তা হচ্ছে ডিফল্ট ম্যাটেরিয়াল। আমরা চাইলে নিজের মত করে ম্যাটেরিয়াল তৈরি করে নিতে পারি। আমি এখানে কিভাবে ব্যাসিক ম্যাটেরিয়াল তৈরি করা যায়, তা দেখাচ্ছি। এটা পারফেক্ট হবে না। ম্যাটেরিয়াল তৈরি করার জন্য প্রজেক্ট উইন্ডো বা এসেটেরর উপর ক্লিক করে Create > Meterial এ ক্লিক করে একটা ম্যাটেরিয়াল তৈরি করে নিব। এই ম্যাটেরিয়ালের একটা নাম দিতে পারি। যেমন আমি দিলাম Ufo Material। এই ম্যাটেরিয়াল টি সিলেক্ট করে ইন্সপেক্টর থেকে Albedo তে আমাদের UFO এর স্প্রাইটটি ছেড়ে দিব। যেন ম্যাটেরিয়ালটি দেখতে UFO এর মত হয়। সাধারণত অন্য একটা স্প্রাইট ব্যবহার করে, যেখানে স্প্রাইট ভেঙ্গে যাওয়ার পর যেমন দেখায়, তেমন স্টেট থাকে।

এবার হায়ারেকি থেকে পার্টিকেলটি সিলেক্ট করব। Renderer অপশন থেকে Material এ সদ্য তৈরি করা UfoMaterial টি সেট করে দিব। আর এই ম্যাটেরিয়ালটি যেন চার টুকরা দেখায়, এই জন্য Texture Sheet Animation এনাবল করে Tiles 2*2 সেট করে দিব। তাহলে এখন যদি পার্টিকেলটা প্লে করি, মনে হবে যেন UFO ভেঙ্গে চার টুকরো হয়ে পড়তেছে। যদিও পারফেক্ট না, শেখার জন্য যথেষ্ট।

 

 

 

পার্টিকেলের ইনপেক্টরে আরো অনেক অনেক অপশন রয়েছে, যেগুলো দিয়ে আরো সুন্দর ভাবে পার্টিকেল ইফেক্ট দেওয়া যাবে। এই ভিডিওটি থেকে অনেক কিছুই শেখা যাবে পার্টিকেল ইফেক্ট সম্পর্কে।

 

পার্টিকেল ইফেক্ট তো তৈরি করেছি। তা দেখবো কিভাবে? দেখানো সহজঃ

particle = GetComponentInChildren<ParticleSystem>();
particle.Play();

এই তো। OnCollisionEnter2D মেথডের ভেতর এই কোড লিখে দিলেই পার্টিকেল ইফেক্ট দেখতে পাবো। বোনাস হিসেবে কিভাবে সাউন্ড প্লে করা যায়, তা দেখাচ্ছি। তার জন্য হায়ারেকি থেকে UFO সিলেক্ট করে ইন্সপেক্টর থেকে এর মধ্যে Audio Source কম্পোনেন্ট যুক্ত করব। এতে একটা অডিও যুক্ত করে দিব এবং Play on Awake ডিসএবল করে দিব।

অডিও প্লে করতে চাইলেঃ

particle = GetComponentInChildren<ParticleSystem>();
audioSource.Play();
audioSource = GetComponent<AudioSource>();

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

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

public class Ufo : MonoBehaviour
{
   
    private ParticleSystem particle;
    private SpriteRenderer spriteRenderer;
    private BoxCollider2D boxCollider2D;
    private AudioSource audioSource;

    public float speed = 2;
 

    private void Awake()
    {
        particle = GetComponentInChildren<ParticleSystem>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        boxCollider2D = GetComponent<BoxCollider2D>();
        audioSource = GetComponent<AudioSource>();

    }


    void Update()
    {
        transform.position += Vector3.down * speed * Time.deltaTime;
     
    }

    void OnCollisionEnter2D(Collision2D other)
    {
            Destroy(other.gameObject);
            StartCoroutine(BreakUFO());
       
       
    }

    private IEnumerator BreakUFO()
    {
        particle.Play();
        audioSource.Play();

        spriteRenderer.enabled = false;
        boxCollider2D.enabled = false;

        yield return new WaitForSeconds(particle.main.startLifetime.constantMax);


        Destroy(gameObject);

    }
}

ফাইনাল কোডে আমরা IEnumerator ব্যবহার করেছি। কয়েকটা কারণে। যদি সাথে গেমঅবজেক্ট ডিস্ট্রয় করে দেই, তাহলে পার্টিকেল সিস্টেমও ডিস্ট্রয় হয়ে যাবে। তাই পার্টিকেল দেখাবে না। আর তাই আমরা IEnumerator দিয়ে একটা টাইমার সেট করে দিয়েছি। WaitForSeconds(particle.main.startLifetime.constantMax) দিয়ে বলে দিয়েছি কতক্ষণ অপেক্ষা করার পর গেমঅবজেক্ট ডিস্ট্রয় করব। এর এর মান সেট করে দিয়েছি পার্টিকেল সিস্টেম কতক্ষণ একটিভ থাকবে, তা। এই তো!

আমরা এখন গুলি ছুড়তে পারি। কোন অবজেক্ট ডিস্ট্রয় করতে পারি। ইফেক্ট দেখাতে পারি।

কোড গুলো পাওয়া যাবে গিটহাবে

গেমটি সম্পূর্ণ করার চেষ্টা করতে পারেন। যেমন স্পেসশিপটি মুভ করতে পারেন। নতুন নতুন UFO যেন আসে, তার ব্যবস্থা করতে পারেন। UFO থেকে বুলেট ছোড়ার ব্যবস্থা করতে পারেন। এই তো।

 

ইউনিটি নিয়ে অন্যান্য লেখাঃ

1 thought on “ইউনিটিতে শুটিং এবং পার্টিকেল ইফেক্ট”

Leave a Reply