কম্পিউটার টিউটোরিয়াল

Unity দিয়ে বেসিক অ্যান্ড্রয়েড গেম তৈরির পদ্ধতি

Appuals-এর পূর্বের টিউটোরিয়াল "How to Create a Basic Unity Platform Game" (এবং এর পার্ট ২) এ Unity এবং বিল্ট-ইন WebGL প্লাগইন ব্যবহার করে সিম্পল HTML5-ভিত্তিক ব্রাউজার গেম তৈরি করা দেখানো হয়েছিল—এই সিমিলার টিউটোরিয়ালে Unity ব্যবহার করে বেসিক অ্যান্ড্রয়েড গেম তৈরির পদ্ধতি দেখানো হচ্ছে।

প্রয়োজনীয়তা:

  • Unity
  • ভালো টেক্সট এডিটর যেমন NotePad++ (ঐচ্ছিক কিন্তু রিকমেন্ডেড)
  • Android SDK

যদি ইতিমধ্যে না থাকে, Unity SDK এবং Android SDK ডাউনলোড ও ইনস্টল করুন। Android SDK লাগবে গেমের APK Android এনভায়রনমেন্টে টেস্ট করার জন্য।

Unity চালু করে নতুন প্রজেক্ট তৈরি করুন। 2D প্রজেক্ট বানান।

কয়েকটি প্যানেল সাথে পরিচিত হোন—Hierarchy প্যানেল যেটি আমাদের সিনের সব এলিমেন্ট ধারণ করবে (সিন = আপনি যেটি বর্তমানে কাজ করছেন)। Game ট্যাব গেম প্লে/টেস্ট করার জন্য এডিটর ভিতরে। ডানপাশে Inspector প্যানেল যেটি লাইটিং, ফিজিক্স ইত্যাদি এডিট করতে ব্যবহার হয়।

প্রথমে একটি স্প্রাইট তৈরি করুন—এটি আমাদের মেইন ক্যারেক্টার (যেটি কন্ট্রোল করব)। আপনি নিজে স্প্রাইট আঁকতে পারেন (যেমন চোখসহ একটি বর্গ), বা ইন্টারনেট থেকে স্প্রাইট নিতে পারেন—শুধু .PNG ফাইল নিশ্চিত করুন (ট্রান্সপেরেন্ট ব্যাকগ্রাউন্ড)।

স্প্রাইটটি মেইন সিন উইন্ডোতে (সর্বোচ্চ উইন্ডো) ড্র্যাগ এন্ড ড্রপ করুন—Hierarchy প্যানেলেও দেখাবে।

এখন কয়েকটি প্ল্যাটফর্ম তৈরি করুন—সিপ্ল কোয়াড্রেট বায়তে পারেন, কারণ পরে রিসাইজ করে দেওয়াল ও অন্যান্য প্ল্যাটফর্ম বানানো যাবে।

নতুন বর্গ "স্প্রাইট" তৈরি করুন এবং সিন উইন্ডোতে ড্র্যাগ এন্ড ড্রপ করুন।

এখন Unity-কে মেইন ক্যারেক্টারের ফিজিক্স দিতে বলুন—মেইন স্প্রাইট ক্যারেক্টার ক্লিক করুন (সিন উইন্ডোতে ব্লু হাইলাইট হবে), Inspector প্যানেলে "GameObjects" খুঁজুন।

"Add Component > Physics 2D > RigidBody2D" ক্লিক করুন। এটি আপনার স্প্রাইটে আটোমেটিক্যালি ফিজিক্স যোগ করবে, যা অন্য SDK-তে আপনাকে নিজে স্ক্রিপ্ট করতে হত।

Unity দিয়ে বেসিক অ্যান্ড্রয়েড গেম তৈরির পদ্ধতি

মেইন স্প্রাইট ক্যারেক্টার বেগুনিভাবে ঘুরে না যায় সেটা রোকা দরকার—Inspector প্যানেলে Constraints ট্যাব খুঁজুন (মেইন স্প্রাইট সিলেক্টেড থাকলে), "Freeze Rotation Z" চেকবক্স টিক করুন।

Play বাটন চাপলে মেইন স্প্রাইট ক্যারেক্টার আকাশ থেকে পড়বে এবং অসীম পড়তে থাকবে—এটি পরে ফিক্স করব, কিন্তু ফিজিক্স কত সহজে অ্যাপ্লাই করা যায় সেটা লক্ষ্য করুন। আমরা যে ফিজিক্স অ্যাপ্লাই করলাম সেটি শেপের ওপর নির্ভরশীল—যদি একই ফিজিক্স একটি স্ফેરে অ্যাপ্লাই করতাম, সেটি লু়িয়ে যেত।

ওরিয়েন্টেশন ফিক্স করে ক্যারেক্টার স্পিনিং ও ফ্রি-হোলিং থেকে বাঁচাতে Inspector-এ 'constraints'-এ প্লেয়ার সিলেক্ট করে Freeze Rotation Z টিক করুন। আবার Play চাপলে প্লেয়ার আকাশ থেকে পড়ে অसीম অভিমুখে যাবে।

মেইন স্প্রাইট ক্যারেক্টার অসীম পড়া থেকে বাঁচাতে একটি কোলাইডার লাগবে। এটি বেসিকলি একটি শেপের স olid আউटलাইন যা আমরা মেইন স্প্রাইট ক্যারেক্টারের সাথে যোগ করব। মেইন স্প্রাইট হাইলাইট করুন, "Add Component > Physics 2D > BoxCollider2D" ক্লিক করুন।

আগে তৈরি করা প্ল্যাটফর্মের সাথে একই কাজ করুন। এখন মেইন স্প্রাইট ক্যারেক্টার প্ল্যাটফর্মের সাথে "কোলাইড" করবে এবং সেখানে থাকবে।

এখন ক্যামেরা মেইন স্প্রাইট ক্যারেক্টারকে ফলো করবে সেটা নিশ্চিত করুন—সিনে ইতিমধ্যে একটি ক্যামেরা অবজেক্ট থাকবে। এটি মেইন স্প্রাইট ক্যারেক্টারের উপর ড্র্যাগ করুন।

এটি বিশেষ গুরুত্বপূর্ণ যদি আপনি 3D ভিত্তিক রানার বানান, যেমন Slope যেখানে ক্যামেরা আপনার প্রাইমারি গেম অবজেক্ট (মেইন স্প্রাইট ক্যারেক্টার)র পিছনে কনস্ট্যান্টলি থাকতে হবে।

Unity দিয়ে বেসিক অ্যান্ড্রয়েড গেম তৈরির পদ্ধতি

Hierarchy প্যানেলে GameObjects লিস্টে ক্যামেরা মেইন স্প্রাইট ক্যারেক্টারের (Player GameObject) নিচে ড্র্যাগ করুন। এটি মেইন স্প্রাইট ক্যারেক্টারকে ক্যামেরার 'parent' বানাবে। যাতে Player GameObject স্ক্রিনে ঘুরলে ক্যামেরা ফলো করবে।

এই টিউটোরিয়ালে আমরা বেসিক এন্ডলেস রানার টাইপ গেম বানাব, Run 3-এর মতো, যেখানে মেইন ক্যারেক্টার স্ক্রিনে দৌড়াবে এবং অভ্যাস্টাকল ডজ করবে (অথবা "game over" যদি অভ্যাস্টাকল হিট করে)। এতে কয়েকটি স্ক্রিপ্ট লাগবে, যা Эта গাইডে দেওয়া থাকবে।

Assets ফোল্ডারে রাইট ক্লিক করে নতুন ফোল্ডার তৈরি করুন, নাম দিন Scripts। এই ফোল্ডারে রাইট ক্লিক করে "Create > C# Script" বেছে নিন এবং নাম দিন PlayerControls। এই স্ক্রিপ্ট আমাদের মেইন স্প্রাইট ক্যারেক্টারের বিহেভিয়র ডিফাইন করবে।

নতুন স্ক্রিপ্টে ডাবল ক্লিক করলে এটি শুরুতে Visual Studio-এ খুলবে—বিকল্পভাবে (আমার ব্যক্তিগত পছন্দ), NotePad++-তে এডিট করুন।

স্ক্রিপ্ট ফাইলে ইতিমধ্যে কিছু "বয়লার প্লেট" কোড থাকবে—বেসিকলি এটি স্ক্রিপ্ট যা অঙ্কুর রেখে দিতে হয় বা আপনার প্রয়োজন অনুযায়ী অ্যাডজাস্ট করতে হয়, এবং আমাদের অনেক সময় বাঁচাবে। তাই আমরা একটি নতুন অবজেক্ট যোগ করব।

void Start(): লাইনের উপরে:

Unity দিয়ে বেসিক অ্যান্ড্রয়েড গেম তৈরির পদ্ধতি

public Rigidbody2D rb;

পরবর্তী কোড ব্লক Start()-এর ভিতরে যাবে, যা রিজিডবডি খুঁজে বের করতে ব্যবহৃত হবে—বেসিকলি আমরা Unity-কে বলছি GameObjects-এ অ্যাটাচড ফিজিক্স (আমাদের মেইন স্প্রাইট ক্যারেক্টার) লোকেট করতে, এবং Start() নতুন অবজেক্ট বা স্ক্রিপ্ট তৈরি হলে এক্সিকিউট হবে।

তাই পরের ধাপে ফিজিক্স অবজেক্ট লোকেট করুন।

rb = GetComponent<Rigidbody2D>();

এবং Update()-এর ভিতরে এই লাইন যোগ করুন:

rb.velocity = new Vector2(3, rb.velocity.y);

Update() কনস্ট্যান্টলি রিফ্রেশ করে, তাই সেখানে যোগ করা কোড কন্টিনিউয়াসলি রান করবে (অবজেক্ট ডিস্ট্রয় না হওয়া পর্যন্ত)। আমরা স্ক্রিপ্টকে বললাম রিজিডবডির একটি নতুন ভেক্টর থাকবে Y-এক্সিসে একই স্পিড (rb.velocity.y) কিন্তু হরিজন্টাল এক্সিসে স্পিড ৩। ভবিষ্যতে 'FixedUpdate()' ও ব্যবহার করা যায়, যা সিমিলার কিন্তু ডিফারেন্ট, কারণ সেখানে স্ক্রিপ্টের আপডেট/রিফ্রেশ অ্যামাউন্ট কন্ট্রোল করা যায়।

স্ক্রিপ্ট সেভ করুন এবং Unity-তে ফিরে যান, মেইন স্প্রাইট ক্যারেক্টার ক্লিক করুন হাইলাইট করতে। Inspector প্যানেলে Add Component > Scripts-এ গিয়ে তৈরি স্ক্রিপ্ট যোগ করুন। Play বাটন চাপলে মেইন স্প্রাইট ক্যারেক্টার প্ল্যাটফর্ম এজ দিকে কন্টিনিউয়াসলি মুভ করবে।

Player Input Controls তৈরি করা

এন্ডলেস রানার স্টাইল গেমে অভ্যাস্টাকল থাকবে, তাই প্লেয়ার কন্ট্রোল যেমন 'jump' বাটন যোগ করতে হবে।

পূর্বের স্ক্রিপ্ট পুনরায় খুলুন, নিচের কোড যোগ করুন:

if (Input.GetMouseButtonDown(0)) { rb.velocity = new Vector2(rb.velocity.x, 5); }

এটি Update() মেথডের ভিতরে যাবে, এবং এটি বলে Unity-কে প্লেয়ার মাউস বাটন ক্লিক করলে (Android-এ স্ক্রিন ট্যাপ হিসেবে ট্রান্সলেট হবে), মেইন স্প্রাইট ক্যারেক্টার "জাম্প" করবে। কারণ Y-এক্সিসে ৫ ভ্যালুর ভেলোসিটি যোগ করলাম (উচ্চতর ভ্যালু মানে উচ্চতর জাম্প)।

কোডিংয়ের সাথে পরিচিত না হলে, আমরা If স্টেটমেন্ট ব্যবহার করলাম কারণ If বেসিকলি "do or don't" টাইপ ইনস্ট্রাকশন—এর অর্থ IF this happens, do this command। তাই প্লেয়ার মাউস ক্লিক না করলে (অথবা Android স্ক্রিন ট্যাপ না করলে) স্ক্রিপ্ট রান করবে না।

Play বাটন চাপি সঠিক কাজ করছে কিনা চেক করুন।

পরবর্তী, অভ্যাস্টাকল (যা মেইন ক্যারেক্টার স্প্রাইট "ডিস্ট্রয়" করবে), গেম স্কোর, এবং "game over" মেনু যোগ করব।

এতক্ষন টেস্ট করলে একটা সমস্যা আছে—আমাদের তৈরি "jump" বাটন চাপলে ক্যারেক্টার গ্রাউন্ডেড না থাকলেও জাম্প করে—এটি বেসিকলি Flappy Birds, রানার নয়। কিন্তু আমরা ফিক্স করব।

স্ক্রিপ্টে Update() মেথডের উপরে নিচের কোড যোগ করুন:

public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; And then add this next line to the Update method above the if statement: onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); And next you will change this following line to include “&& onGround” if (Input.GetMouseButtonDown(0) && onGround) { So our entire script should basically look like this: public class PlayerControls : MonoBehaviour { public Rigidbody2D rb; public Transform groundCheck; public Transform startPosition; public float groundCheckRadius; public LayerMask whatIsGround; private bool onGround; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { rb.velocity = new Vector2(3, rb.velocity.y); onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround); if (Input.GetMouseButtonDown(0) && onGround) { rb.velocity = new Vector2(rb.velocity.x, 5); } } }

আমরা যা করলাম তা ব্যাখ্যা: একটি নতুন "transform" তৈরি করলাম, যা গেম ওয়ার্ল্ডের স্পেসে একটি পজিশন। এর রেডিয়াস সেট করলাম এবং Unity-কে বললাম চেক করতে যে রেডিয়াস "ground" লെയারের সাথে ওভারল্যাপ হচ্ছে কিনা—যদি আমাদের রেডিয়াস "ground"-এর সাথে সিঙ্ক হয়, ক্যারেক্টার জাম্প করতে পারবে, আর যদি জাম্প থেকে ইতিমধ্যে হয়ে থাকে, আবার জাম্প করতে পারবে না। বেসিকলি, onGround true হবে যদি groundCheck নামে transform ground লെയারের সাথে ওভারল্যাপ করে। আশা করি বোঝা গেলো।

স্ক্রিপ্ট সেভ করুন Unity-তে ফিরে যান, প্লেয়ার হাইলাইট করলে Inspector-এ নতুন অপশনগুলো দেখবেন। এগুলো পাবলিক ভেরিয়েবল, আপনার পছন্দ অনুযায়ী অ্যাডজাস্ট করুন।

Hierarchy-এ রাইট ক্লিক করে নতুন এম্পটি অবজেক্ট তৈরি করুন, এবং মেইন ক্যারেক্টার স্প্রাইটের নিচে সিন উইন্ডোতে ড্র্যাগ করুন—ফ্লোর ডিটেকশন যেখানে চান সেখানে পজিশন করুন। অবজেক্টটি "Check Ground" নামে রিনেম করুন, এবং ক্যামেরার মতো প্লেয়ারের গেম অবজেক্টের নিচে ড্র্যাগ করুন (parent-child রিলেশনশিপ বানাতে)। এখন এম্পটি অবজেক্ট মেইন ক্যারেক্টার স্প্রাইটকে ফলো করবে, এবং কন্টিনিউয়াসলি ফ্লোর ডিস্ট্যান্স চেক করবে।cam

মেইন ক্যারেক্টার স্প্রাইট সিলেক্ট করুন Inspector-এ—Check Ground অবজেক্টটি "groundCheck" স্পেসে ড্র্যাগ করুন। 'transform' পজিশন এই নতুন অবজেক্টের পজিশন হবে, এবং "Radius"-এ 0.1 সেট করুন।

গ্রাউন্ড লেয়ার ডিফাইন করুন। গ্রাউন্ড টেরেন সিলেক্ট করুন Inspector-এ, "Layer: Default" বাটন খুঁজুন (ড্রপডাউন বক্স) এবং "Add Layer" বেছে নিন।

এখন আমাদের প্ল্যাটফর্মের জন্য "ground" লেয়ার সিলেক্ট করুন, গেম উইন্ডোয়ের অন্যান্য প্ল্যাটফর্মের জন্যও একই করুন। মেইন ক্যারেক্টার স্প্রাইট অবজেক্টে "What is Ground"-এও ground লেয়ার সিলেক্ট করুন।

আমরা প্লেয়ার স্ক্রিপ্টকে ইনস্ট্রাক্ট করলাম একটি চেক পারফর্ম করতে—যদি স্ক্রিনে ছোট পয়েন্টটি ground লেয়ার ম্যাচ করে যেকোনো কিছুর সাথে ওভারল্যাপ করে, ক্যারেক্টার তখনই জাম্প করবে।

Collision-এ Game Over এবং Game Menu

শেষে আমরা দুটি কাজ করব: A: অভ্যাস্টাকল সাথে কোলাইশনে game over, B: "Game over" মেনু স্ক্রিন "Play Again" বাটনসহ।

বেসিকলি আপনাকে করতে হবে:

  1. Player অবজেক্ট যোগ করুন এবং আপনার পছন্দ অনুযায়ী rigidbody এবং collider অ্যাসাইন করুন।
  2. Enemy অবজেক্ট যোগ করুন এবং আপনার পছন্দ অনুযায়ী rigidbody এবং collider অ্যাসাইন করুন। (ঐচ্ছিক, "Enemy" tag যোগ করুন)
  3. নতুন C# script তैयার করুন এবং Player-এ কম্পোনেন্ট হিসেবে যোগ করুন (অথবা প্লেয়ারের সাথে অ্যাটাচড যেকোনো স্ক্রিপ্ট ব্যবহার করুন, নতুন তৈরি করার প্রয়োজন নাই যদি ইতিমধ্যে থাকে)
  4. আপনার স্ক্রিপ্টে এটি যোগ করুন:
void OnCollisionEnter(Collision coll){ Debug.Log("Collision"); //Check to see if it even registers a collision, if it works you can remove this line if(coll.gameobject.tag == "Enemy"){ //sees if the object your player collided with has a tag called "Enemy", this can be replaced with if(coll.gameobject.name == ... but using a tag is an easy way to do it. //Add your code here, like: Application.LoadLevel("GameOver"); Debug.Log("Working"); //if working, you can remove this line. }

এই উদাহরণ স্ক্রিপ্টে এক্সপেরিমেন্ট করুন—ট্রায়-এরর দিয়ে আপনি ঠিক যা দরকার সেটা পাবেন।

GameOver "level" "Play" বাটনসহ কীভাবে তৈরি করতে হয় সেটি জানতে Appuals guide "How to Create a Basic Unity Platform Game Pt. 2"-র লাস্ট সেকশন দেখুন।

  1. অ্যান্ড্রয়েডে QR কোড স্ক্যান করার দ্রুত ও নিরাপদ গাইড

  2. অ্যান্ড্রয়েডে Telegram অ্যাকাউন্ট সেটআপ করার ধাপে ধাপে গাইড

  3. অ্যান্ড্রয়েডে যেকোনো গেম হ্যাক করার উপায়

  4. Learn Math App দিয়ে বেসিক ম্যাথ মাস্টার করুন: মজাদার ও আকর্ষণীয় পদ্ধতি