Unity-তে প্র্যাকটিস প্রোজেক্টস তৈরি করা গেম ডেভেলপমেন্টের মৌলিক ধারণা এবং প্রযুক্তি সম্পর্কে শেখার জন্য একটি কার্যকরী উপায়। নিচে কিছু প্র্যাকটিস প্রোজেক্টের উদাহরণ দেওয়া হলো, যা বিভিন্ন গেম ডেভেলপমেন্টের দিকগুলি অনুশীলন করতে সাহায্য করবে।
১. 2D Platformer গেম
প্রকল্পের বৈশিষ্ট্য:
- প্লেয়ার চরিত্রের জন্য 2D মুভমেন্ট
- বাধা এবং শত্রুদের সাথে ইন্টারঅ্যাকশন
- পয়েন্ট সংগ্রহের জন্য সংগ্রহযোগ্য আইটেম
- লেভেল পরিবর্তন
কাজের পদক্ষেপ:
- Unity-তে একটি 2D প্রোজেক্ট তৈরি করুন।
- একটি প্লেয়ার চরিত্র তৈরি করুন এবং কীবোর্ড ইনপুটের মাধ্যমে মুভমেন্ট তৈরি করুন।
- বিভিন্ন ধরনের বাধা এবং শত্রু যুক্ত করুন।
- স্কোরিং সিস্টেম তৈরি করুন।
২. Endless Runner গেম
প্রকল্পের বৈশিষ্ট্য:
- একটি অসীম দৌড়ের লেভেল
- প্লেয়ার ক্যারেক্টারের মুভমেন্ট
- সংগ্রহযোগ্য আইটেম এবং স্কোরিং সিস্টেম
- বাধা এবং গতি পরিবর্তন
কাজের পদক্ষেপ:
- Unity-তে একটি 3D প্রোজেক্ট তৈরি করুন।
- একটি প্লেয়ার ক্যারেক্টার তৈরি করুন এবং ইনপুটের মাধ্যমে দৌড়ানোর ফাংশন তৈরি করুন।
- একটি অসীম টেরেইন তৈরি করুন যেখানে প্লেয়ার দৌড়াতে পারে।
- বিভিন্ন ধরনের বাধা যুক্ত করুন এবং স্কোরিং সিস্টেম তৈরি করুন।
৩. First-Person Shooter (FPS)
প্রকল্পের বৈশিষ্ট্য:
- প্রথম-পৃথিবী ভিউতে শুটিং মেকানিক্স
- শত্রু AI এবং কৃত্রিম বুদ্ধিমত্তা
- অস্ত্র এবং গোলাবারুদ ব্যবস্থাপনা
- বিভিন্ন লেভেল
কাজের পদক্ষেপ:
- Unity-তে একটি 3D প্রোজেক্ট তৈরি করুন।
- FPS ক্যারেক্টার কন্ট্রোলার তৈরি করুন এবং ইনপুট সিস্টেমের মাধ্যমে মুভমেন্ট ও শুটিং ফাংশন তৈরি করুন।
- শত্রু AI তৈরি করুন এবং তাদের আচরণ পরিচালনা করুন।
- গোলাবারুদ ব্যবস্থাপনা এবং স্কোরিং সিস্টেম তৈরি করুন।
৪. VR অভিজ্ঞতা
প্রকল্পের বৈশিষ্ট্য:
- ভার্চুয়াল বাস্তবতার মধ্যে ইন্টারঅ্যাকটিভ অভিজ্ঞতা
- প্লেয়ার অবজেক্টগুলির সাথে ইন্টারঅ্যাকশন
- স্থানীয় পরিবেশ তৈরি করা
কাজের পদক্ষেপ:
- Unity-তে একটি VR প্রোজেক্ট তৈরি করুন।
- XR Toolkit ব্যবহার করে XR Rig সেট আপ করুন।
- ভার্চুয়াল অবজেক্ট এবং ইন্টারঅ্যাকশন যুক্ত করুন।
- একটি সহজ ভার্চুয়াল পরিবেশ তৈরি করুন।
৫. Augmented Reality (AR) অভিজ্ঞতা
প্রকল্পের বৈশিষ্ট্য:
- বাস্তব জগতের সাথে ভার্চুয়াল উপাদানগুলির সংমিশ্রণ
- প্লেয়ার টাচ ইভেন্টের মাধ্যমে অবজেক্টগুলি স্থাপন করা
কাজের পদক্ষেপ:
- Unity-তে AR Foundation প্যাকেজ ইনস্টল করুন।
- AR Session এবং AR Camera সেট আপ করুন।
- বাস্তব জগতের উপর ভার্চুয়াল অবজেক্টগুলি স্থাপন করার জন্য স্ক্রিপ্ট তৈরি করুন।
৬. Simple Puzzle Game
প্রকল্পের বৈশিষ্ট্য:
- সিম্পল পাজল, যেমন টাইল মাচিং বা সরানো
- স্তরের অগ্রগতি এবং স্কোরিং সিস্টেম
- UI উপাদানগুলি (যেমন বাটন, স্কোর বোর্ড)
কাজের পদক্ষেপ:
- Unity-তে একটি 2D বা 3D প্রোজেক্ট তৈরি করুন।
- পাজল এলিমেন্টস তৈরি করুন এবং তাদের ইন্টারঅ্যাকশন তৈরি করুন।
- স্তরের পরিবর্তন এবং স্কোরিং সিস্টেম তৈরি করুন।
- UI উপাদানগুলি যুক্ত করুন।
সারসংক্ষেপ
এই প্র্যাকটিস প্রোজেক্টগুলো Unity-তে গেম ডেভেলপমেন্টের মৌলিক দিকগুলি শেখার জন্য দুর্দান্ত সুযোগ। আপনি আপনার দক্ষতা এবং সৃজনশীলতা বাড়াতে পারবেন, পাশাপাশি গেম ডিজাইন এবং উন্নয়ন সম্পর্কে গভীর ধারণা পেতে পারেন। এগুলো সম্পন্ন করার মাধ্যমে আপনি বাস্তব জীবনে ডেভেলপমেন্ট প্রক্রিয়ার প্রতিটি দিক অনুশীলন করতে পারবেন।
Unity ব্যবহার করে একটি মৌলিক 2D বা 3D গেম তৈরি করার প্রক্রিয়া এখানে আলোচনা করা হলো। আমরা একটি সিম্পল 2D গেম তৈরি করবো যেখানে প্লেয়ার একটি চরিত্র নিয়ন্ত্রণ করবে এবং এটি একটি নির্দিষ্ট লক্ষ্য পূরণ করার চেষ্টা করবে।
2D গেম তৈরি করার প্রক্রিয়া
ধাপ ১: Unity প্রোজেক্ট তৈরি করা
- Unity Hub খুলুন।
- New Project নির্বাচন করুন।
- Template হিসেবে
2Dনির্বাচন করুন। - প্রোজেক্টের নাম দিন (যেমন
Simple2DGame) এবংCreateবাটনে ক্লিক করুন।
ধাপ ২: Scene সেটআপ করা
Scene-এ একটি GameObject হিসেবে 2D অবজেক্ট তৈরি করুন।
- Hierarchy-এ ডান ক্লিক করুন এবং 2D Object > Sprite নির্বাচন করুন।
- এই স্প্রাইটটিকে প্লেয়ার চরিত্র হিসেবে ব্যবহার করুন।
Inspector-এ Sprite Renderer থেকে একটি স্প্রাইট (যেমন একটি কার্টুন চরিত্র) নির্বাচন করুন।
ধাপ ৩: প্লেয়ার মুভমেন্ট স্ক্রিপ্ট তৈরি করা
- Assets-এ ডান ক্লিক করুন এবং Create > C# Script নির্বাচন করুন। স্ক্রিপ্টের নাম দিন
PlayerMovement। - নিচের কোডটি স্ক্রিপ্টে যুক্ত করুন:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector2 movement = new Vector2(moveHorizontal, moveVertical);
transform.Translate(movement * moveSpeed * Time.deltaTime);
}
}
- Player স্প্রাইটটিকে নির্বাচন করুন এবং Inspector-এ
Add Componentক্লিক করেPlayerMovementস্ক্রিপ্টটি যুক্ত করুন।
ধাপ ৪: লক্ষ্য সেটআপ করা
- আবার Hierarchy-এ ডান ক্লিক করুন এবং 2D Object > Sprite নির্বাচন করুন।
- এই স্প্রাইটটিকে আপনার লক্ষ্য (যেমন একটি টার্গেট) হিসেবে ব্যবহার করুন।
- Inspector-এ Sprite Renderer থেকে একটি স্প্রাইট নির্বাচন করুন।
ধাপ ৫: Collision Detection যোগ করা
- PlayerMovement স্ক্রিপ্টে Collision Detection যোগ করুন:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector2 movement = new Vector2(moveHorizontal, moveVertical);
transform.Translate(movement * moveSpeed * Time.deltaTime);
}
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Target"))
{
Debug.Log("Target Reached!");
// লক্ষ্য পৌঁছালে যা করতে চান তা এখানে যুক্ত করুন
}
}
}
- লক্ষ্য স্প্রাইট নির্বাচন করুন এবং Inspector-এ একটি Box Collider 2D যোগ করুন।
- Is Trigger নির্বাচন করুন, যাতে এটি Trigger হিসাবে কাজ করে।
- লক্ষ্য স্প্রাইটের Tag-এ
Targetযোগ করুন।
ধাপ ৬: গেম টেস্ট করা
- Play বাটনে ক্লিক করুন এবং গেমটি পরীক্ষা করুন। প্লেয়ারকে WASD বা Arrow Keys ব্যবহার করে মুভ করতে দিন এবং লক্ষ্য স্প্রাইটের দিকে চলে যান।
উপসংহার
এখন আপনি Unity তে একটি মৌলিক 2D গেম তৈরি করেছেন যেখানে একটি প্লেয়ার চরিত্র লক্ষ্য স্প্রাইটের দিকে মুভ করে। এই প্রক্রিয়াটি আপনাকে Unity এর মৌলিক ধারণা দেয় এবং আপনি এই ভিত্তিতে আরও জটিল গেম তৈরি করতে পারবেন। Unity তে 2D গেম ডেভেলপমেন্ট একটি সৃজনশীল এবং মজার অভিজ্ঞতা!
Basic Player Controller এবং Enemy AI তৈরি করা
Unity-তে একটি Basic Player Controller এবং Enemy AI তৈরি করা গেম ডেভেলপমেন্টের মৌলিক ধারণা বোঝার জন্য একটি ভালো অনুশীলন। নিচে একটি সহজ উদাহরণের মাধ্যমে এই দুটি উপাদান কিভাবে তৈরি করা যায় তা দেখানো হলো।
পদক্ষেপ ১: প্রজেক্ট সেট আপ করা
- Unity Hub খুলুন এবং একটি নতুন 3D প্রজেক্ট তৈরি করুন।
- প্রজেক্টটি খুলুন এবং প্রাথমিক সেটআপ সম্পন্ন করুন।
পদক্ষেপ ২: প্লেয়ার চরিত্র তৈরি করা
- GameObject > 3D Object > Capsule নির্বাচন করুন। এটি আপনার প্লেয়ার চরিত্র হবে।
- ক্যাপসুলের নাম পরিবর্তন করুন
Player।
পদক্ষেপ ৩: Basic Player Controller স্ক্রিপ্ট তৈরি করা
- Assets > Create > C# Script নির্বাচন করুন এবং স্ক্রিপ্টের নাম দিন
PlayerController। - PlayerController.cs ফাইলটি খুলুন এবং নিচের কোড যুক্ত করুন:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 5f; // Player speed
void Update()
{
// Movement input
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(horizontal, 0, vertical) * speed * Time.deltaTime;
transform.Translate(movement);
}
}
- Player ক্যাপসুলে
PlayerControllerস্ক্রিপ্টটি যোগ করুন।
পদক্ষেপ ৪: Enemy তৈরি করা
- GameObject > 3D Object > Cube নির্বাচন করুন। এটি আপনার শত্রু হবে।
- Cube এর নাম পরিবর্তন করুন
Enemyএবং Cube-এRigidbodyকম্পোনেন্ট যোগ করুন। Rigidbody এর "Use Gravity" বৈশিষ্ট্যটি সক্রিয় রাখুন।
পদক্ষেপ ৫: Enemy AI স্ক্রিপ্ট তৈরি করা
- Assets > Create > C# Script নির্বাচন করুন এবং স্ক্রিপ্টের নাম দিন
EnemyAI। - EnemyAI.cs ফাইলটি খুলুন এবং নিচের কোড যুক্ত করুন:
using UnityEngine;
public class EnemyAI : MonoBehaviour
{
public Transform player; // Reference to the player
public float speed = 2f; // Speed of the enemy
public float detectionRange = 5f; // Detection range
void Update()
{
// Check distance to the player
if (Vector3.Distance(transform.position, player.position) < detectionRange)
{
// Move towards the player
Vector3 direction = (player.position - transform.position).normalized;
transform.position += direction * speed * Time.deltaTime;
}
}
}
- Enemy Cube-এ
EnemyAIস্ক্রিপ্টটি যোগ করুন। - Inspector Panel-এ
Playerরেফারেন্স যোগ করুন, এটিPlayerক্যাপসুলে ড্র্যাগ এবং ড্রপ করুন।
পদক্ষেপ ৬: লেভেল তৈরি করা
- GameObject > 3D Object > Plane নির্বাচন করুন। এটি আপনার লেভেলের গ্রাউন্ড হবে।
- Plane এর স্কেল পরিবর্তন করুন যাতে এটি বড় হয় এবং প্লেয়ার এবং শত্রুর জন্য একটি স্থল তৈরি হয়।
পদক্ষেপ ৭: গেম চালানো
- Unity Editor-এ Play বাটনে ক্লিক করুন।
- WASD বা Arrow Keys ব্যবহার করে প্লেয়ার চরিত্রটি নিয়ন্ত্রণ করুন।
- শত্রু যদি আপনার কাছাকাছি আসে, তবে এটি আপনার দিকে চলবে।
সারসংক্ষেপ
এই উদাহরণে, আমরা Unity-তে একটি Basic Player Controller এবং Enemy AI তৈরি করেছি। প্লেয়ার চরিত্রটি ইনপুটের মাধ্যমে চলাচল করে এবং শত্রুর AI প্লেয়ারকে শনাক্ত করে এবং তার দিকে চলে আসে। এই প্রক্রিয়া গেম ডেভেলপমেন্টের মৌলিক ধারণাগুলির উপর আপনার দক্ষতা বাড়াতে সহায়ক হবে।
UI এবং Score System যোগ করা
Unity-তে একটি UI (User Interface) এবং Score System যোগ করা গেমের ইন্টারঅ্যাকটিভিটি এবং খেলোয়াড়ের অভিজ্ঞতা উন্নত করার জন্য গুরুত্বপূর্ণ। এখানে আমরা একটি সহজ UI তৈরি করব যা স্কোর দেখাবে এবং একটি সংগ্রহযোগ্য আইটেম সংগ্রহ করার সময় স্কোর বাড়াবে।
পদক্ষেপ ১: UI তৈরি করা
১. UI Canvas তৈরি করা
- Unity Editor-এ Hierarchy প্যানেলে ডান ক্লিক করুন।
- UI > Canvas নির্বাচন করুন। এটি একটি নতুন Canvas তৈরি করবে।
২. Text তৈরি করা
- Canvas এর অধীনে ডান ক্লিক করুন এবং UI > Text নির্বাচন করুন।
- Text উপাদানের নাম পরিবর্তন করুন
ScoreText। - Inspector Panel-এ Text এর বৈশিষ্ট্য পরিবর্তন করুন:
- Text: "Score: 0"
- Font Size: 24
- Alignment: Middle Center (Center Align)
৩. Score Manager স্ক্রিপ্ট তৈরি করা
- Assets > Create > C# Script নির্বাচন করুন এবং স্ক্রিপ্টের নাম দিন
ScoreManager। - ScoreManager.cs ফাইলটি খুলুন এবং নিচের কোড যুক্ত করুন:
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
public int score = 0; // Initial score
public Text scoreText; // Reference to the UI Text
void Start()
{
UpdateScoreText(); // Update the score display at start
}
public void AddScore(int amount)
{
score += amount; // Increase score by the specified amount
UpdateScoreText(); // Update the score display
}
private void UpdateScoreText()
{
scoreText.text = "Score: " + score; // Update the UI Text
}
}
পদক্ষেপ ২: Collectible Item স্ক্রিপ্ট আপডেট করা
- Collectible.cs স্ক্রিপ্টটি খুলুন এবং কোডটি আপডেট করুন:
using UnityEngine;
public class Collectible : MonoBehaviour
{
public int scoreValue = 1; // Score value for this collectible
private ScoreManager scoreManager;
void Start()
{
// Find the ScoreManager in the scene
scoreManager = GameObject.FindObjectOfType<ScoreManager>();
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
Debug.Log("Item Collected!");
scoreManager.AddScore(scoreValue); // Add score when collected
Destroy(gameObject); // Destroy the collectible item
}
}
}
পদক্ষেপ ৩: ScoreManager যুক্ত করা
- Hierarchy প্যানেলে ডান ক্লিক করুন এবং একটি নতুন Empty Object তৈরি করুন। নাম দিন
GameManager। - GameManager GameObject-এ
ScoreManagerস্ক্রিপ্ট যোগ করুন। - Inspector Panel-এ
ScoreTextরেফারেন্সেScoreTextUI Text যোগ করুন।
পদক্ষেপ ৪: লেভেল পরীক্ষা করা
- Unity Editor-এ Play বাটনে ক্লিক করুন।
- WASD বা Arrow Keys ব্যবহার করে প্লেয়ার ক্যাপসুলটি নিয়ন্ত্রণ করুন।
- Collectible Sphere-এর কাছে গেলে "Item Collected!" মেসেজ কনসোলে প্রদর্শিত হবে এবং Sphereটি মুছে যাবে।
- UI-তে স্কোর আপডেট হবে এবং স্কোর দেখাবে।
সারসংক্ষেপ
এখন আপনি Unity-তে একটি UI এবং Score System যুক্ত করেছেন। UI-তে স্কোর দেখানো হয় এবং প্লেয়ার একটি আইটেম সংগ্রহ করার সময় স্কোর বাড়ে। এই প্রক্রিয়া গেমের ইন্টারঅ্যাকটিভিটি এবং খেলোয়াড়ের অভিজ্ঞতা বাড়াতে সহায়ক। আপনি এই সিস্টেমে আরও বৈশিষ্ট্য যোগ করতে পারেন, যেমন স্কোর বোর্ড, প্রজেক্টাইলের সংখ্যা, বা সময়ের সাথে স্কোর বাড়ানো।
Unity-তে লেভেল ডিজাইন এবং সম্পূর্ণ গেম ডিপ্লয়মেন্ট একটি গুরুত্বপূর্ণ প্রক্রিয়া যা আপনার গেমের গঠন এবং কাজকে চূড়ান্ত করে। নিচে লেভেল ডিজাইন এবং গেম ডিপ্লয়মেন্টের ধাপগুলি বিস্তারিতভাবে আলোচনা করা হলো।
লেভেল ডিজাইন
লেভেল ডিজাইন গেমের বিভিন্ন পর্যায় বা স্তরের পরিকল্পনা এবং তৈরি করার প্রক্রিয়া। এটি খেলোয়াড়ের অভিজ্ঞতা উন্নত করতে এবং গেমের গঠনকে কার্যকরভাবে উপস্থাপন করতে সাহায্য করে।
ধাপ ১: লেভেল পরিকল্পনা
- কনসেপ্ট: আপনার গেমের কাহিনী, উদ্দেশ্য এবং পরিবেশের ধারণা তৈরি করুন।
- লেভেল ম্যাপ: একটি লেভেল ম্যাপ বা স্কেচ তৈরি করুন, যাতে লেভেলটির বিন্যাস এবং গুরুত্বপূর্ণ পয়েন্টগুলি চিহ্নিত থাকে।
ধাপ ২: Unity তে লেভেল ডিজাইন করা
Unity Editor খুলুন এবং একটি নতুন সীনে যান।
Terrain তৈরি করুন (যদি 3D গেম হয়) অথবা 2D গ্রিড ব্যবহার করুন (যদি 2D গেম হয়)।
GameObjects যোগ করুন: প্লেয়ার, শত্রু, এনিমেশন, ট্রাপ, এবং অন্যান্য ইন্টারঅ্যাকটিভ অবজেক্টগুলোর জন্য গেম অবজেক্ট তৈরি করুন।
- GameObject > 3D Object > Cube নির্বাচন করুন। বিভিন্ন অবজেক্ট তৈরি করুন এবং তাদের অবস্থান দিন।
- 2D Object > Sprite নির্বাচন করুন 2D গেমের জন্য।
Lighting এবং Materials কাস্টমাইজ করুন: প্রতিটি অবজেক্টে Material এবং Lighting যোগ করুন, যা দৃশ্যকে আরও বাস্তবসম্মত করে।
ধাপ ৩: Gameplay Mechanics যুক্ত করা
- Scripts যোগ করুন: যেমন প্লেয়ার কন্ট্রোল, শত্রুর আচরণ, এবং পয়েন্ট সিস্টেমের জন্য স্ক্রিপ্ট তৈরি করুন।
- Colliders এবং Triggers যোগ করুন: বিভিন্ন অবজেক্টের জন্য Collider যোগ করুন, যাতে তারা একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারে।
সম্পূর্ণ গেম ডিপ্লয়মেন্ট
একবার আপনার লেভেল ডিজাইন এবং গেমের সমস্ত উপাদান প্রস্তুত হলে, পরবর্তী পদক্ষেপ হল গেমটি ডিপ্লয় করা।
ধাপ ১: Build Settings খুলুন
- File > Build Settings এ যান।
- আপনার লক্ষ্য প্ল্যাটফর্ম নির্বাচন করুন (যেমন PC, Android, iOS)।
ধাপ ২: প্ল্যাটফর্ম সেটআপ
- Platform থেকে আপনার প্ল্যাটফর্ম নির্বাচন করুন এবং Switch Platform ক্লিক করুন।
- Scenes in Build সেকশনে আপনার গেমের সকল দৃশ্য যোগ করুন।
Add Open Scenesবাটনে ক্লিক করুন।
ধাপ ৩: Player Settings কনফিগার করুন
- Build Settings উইন্ডোতে Player Settings ক্লিক করুন।
- গুরুত্বপূর্ণ সেটিংস কাস্টমাইজ করুন:
- Company Name, Product Name, এবং Bundle Identifier (যেমন
com.yourname.mygame)। - Minimum API Level (যদি Android বা iOS হয়)।
- Company Name, Product Name, এবং Bundle Identifier (যেমন
ধাপ ৪: Build করা
- Build বাটনে ক্লিক করুন।
- একটি ফোল্ডার নির্বাচন করুন যেখানে আপনি গেমের বিল্ড সংরক্ষণ করতে চান এবং একটি নাম দিন (যেমন
MyGameBuild). - Save বাটনে ক্লিক করুন। Unity গেমটি তৈরি করতে শুরু করবে।
ধাপ ৫: গেম পরীক্ষা করা
- ডিপ্লয় করার পর, গেমের exe বা APK ফাইলটি চালান।
- গেমটি পরীক্ষা করুন এবং নিশ্চিত করুন যে সবকিছু সঠিকভাবে কাজ করছে।
উপসংহার
Unity তে লেভেল ডিজাইন এবং সম্পূর্ণ গেম ডিপ্লয়মেন্ট একটি গুরুত্বপূর্ণ প্রক্রিয়া যা আপনার গেমের গঠন এবং কার্যকারিতা নির্ধারণ করে। সঠিক পরিকল্পনা এবং কার্যকর ডিপ্লয়মেন্টের মাধ্যমে, আপনি একটি সফল গেম তৈরি করতে পারবেন যা খেলোয়াড়দের জন্য আকর্ষণীয় হবে।
Read more