أساسيات لغة C#: المتغيرات وأنواع البيانات لبرمجة الألعاب
اليوم سنتعلم أساسيات المتغيرات وأنواع البيانات في C#، وكيفية استخدامها بفعالية لبناء منطق الألعاب في Unity.
الخطوة 1: تعريف المتغيرات الأساسية للعبة
سنبدأ بتعريف المتغيرات الأكثر شيوعاً مثل الأعداد الصحيحة (int) لتخزين النقاط، الأعداد العشرية (float) للسرعة والصحة، والنصوص (string) لأسماء اللاعبين أو العناصر.
using UnityEngine;
public class GameData : MonoBehaviour
{
void Start()
{
// تعريف متغيرات لتخزين بيانات أساسية للعبة
int playerScore = 0; // نقاط اللاعب، عدد صحيح (Integer)
float playerSpeed = 5.5f; // سرعة اللاعب، عدد عشري (Floating-point)
string playerName = "البطل الشجاع"; // اسم اللاعب، نص (String)
Debug.Log("النقاط الأولية: " + playerScore);
Debug.Log("السرعة الأولية: " + playerSpeed);
Debug.Log("اسم اللاعب: " + playerName);
}
}
في هذا الجزء، قمنا بإنشاء سكربت GameData يرث من MonoBehaviour (وهو أمر أساسي لسكربتات Unity). داخل الدالة Start() التي تُنفذ مرة واحدة عند بدء اللعبة، عرفنا ثلاثة أنواع رئيسية من المتغيرات وقمنا بطباعة قيمها الأولية إلى Unity Console باستخدام Debug.Log.
ملاحظة تقنية: لا تنسَ إضافة الحرفfبعد الأرقام العشرية عند تعريف المتغيرات من نوعfloat، مثل5.5f، لتمييزها عن الأرقام من نوعdouble.
الخطوة 2: تحديث القيم والمتغيرات المنطقية (Booleans)
في الألعاب، تتغير قيم المتغيرات باستمرار. سنتعلم كيفية تحديث هذه القيم، وسنقدم نوع بيانات جديد: المتغيرات المنطقية (bool) لاتخاذ القرارات.
using UnityEngine;
public class GameData : MonoBehaviour
{
void Start()
{
// تعريف متغيرات وتحديث قيمها
int playerScore = 0; // نقاط اللاعب
float playerHealth = 100.0f; // صحة اللاعب
bool isPlayerAlive = true; // هل اللاعب على قيد الحياة؟ (Boolean)
Debug.Log("\n--- بيانات اللاعب الأولية ---"); // \n لإضافة سطر جديد للوضوح
Debug.Log("النقاط الحالية: " + playerScore);
Debug.Log("الصحة الحالية: " + playerHealth);
Debug.Log("هل اللاعب حي؟ " + isPlayerAlive);
// تحديث قيم المتغيرات بناءً على أحداث اللعبة
playerScore += 250; // اللاعب حصل على 250 نقطة إضافية
playerHealth -= 30.5f; // اللاعب خسر 30.5 نقطة صحة
// استخدام المتغير المنطقي لاتخاذ قرار
if (playerHealth <= 0) // إذا كانت صحة اللاعب صفر أو أقل
{
isPlayerAlive = false; // اللاعب لم يعد على قيد الحياة
}
Debug.Log("\n--- بيانات اللاعب بعد التحديث ---");
Debug.Log("النقاط الجديدة: " + playerScore);
Debug.Log("الصحة المتبقية: " + playerHealth);
Debug.Log("حالة البقاء: " + isPlayerAlive);
}
}
هنا، قمنا بتحديث قيمة playerScore و playerHealth. كما قدمنا المتغير المنطقي isPlayerAlive، والذي يمكن أن يحمل قيمة true (صحيح) أو false (خطأ) فقط. استخدمنا جملة if الشرطية لتغيير قيمة isPlayerAlive بناءً على صحة اللاعب.
الخطوة 3: المتغيرات العامة (Public)، الخاصة (Private)، والثوابت (Constants)
فهم نطاق المتغيرات (Scope) أمر بالغ الأهمية. سنتعلم كيفية تعريف المتغيرات التي يمكن تعديلها من محرر Unity، والمتغيرات التي تكون خاصة بالسكربت فقط، وكيفية تعريف الثوابت التي لا تتغير قيمتها.
using UnityEngine;
public class GameData : MonoBehaviour
{
// متغيرات عامة (Public): يمكن الوصول إليها وتعديلها من محرر Unity مباشرة
public int enemyCount = 5; // عدد الأعداء في المستوى
public float jumpForce = 10.0f; // قوة القفز للشخصية
public string levelName = "الغابة المنسية"; // اسم المستوى الحالي
// متغير خاص (Private): لا يمكن الوصول إليه مباشرة من خارج هذا السكربت
private string secretKey = "ALPHA-OMEGA"; // كود سري أو بيانات داخلية
// ثابت (Constant): قيمته لا تتغير أبداً بعد تعريفه الأول
const int MAX_SCORE_MULTIPLIER = 1000; // أقصى مضاعف للنقاط
void Start()
{
Debug.Log("\n--- بيانات اللعبة العامة والثابتة ---");
Debug.Log("عدد الأعداء المبدئي: " + enemyCount); // يمكن تعديلها من Unity Editor
Debug.Log("قوة القفز الافتراضية: " + jumpForce);
Debug.Log("المستوى الحالي: " + levelName);
// يمكن استخدام المتغير الخاص داخل السكربت
Debug.Log("مفتاح سري (داخلي): " + secretKey);
Debug.Log("أقصى مضاعف للنقاط: " + MAX_SCORE_MULTIPLIER);
// ملاحظة: محاولة تغيير قيمة ثابت ستؤدي إلى خطأ في الكومبايلر:
// MAX_SCORE_MULTIPLIER = 2000; // هذا السطر سيسبب خطأ!
}
}
في هذا الجزء، رأينا كيف أن المتغيرات public تظهر في محرر Unity ويمكن تعديلها بسهولة من هناك، مما يمنح مصممي الألعاب مرونة كبيرة. المتغيرات private تستخدم للحفاظ على بيانات داخلية لا ينبغي تغييرها من الخارج. أما const فيضمن أن القيمة لن تتغير أبداً طوال فترة تشغيل البرنامج، وهو مفيد للقيم الثابتة مثل القوانين الأساسية للعبة.
الخطوة 4: دمج المتغيرات وعرضها في Unity Console
الآن، لنجمع كل ما تعلمناه ونعرض معلومات مفصلة في Unity Console، مستخدمين جميع أنواع المتغيرات التي درسناها.
using UnityEngine;
public class GameData : MonoBehaviour
{
// متغيرات عامة (Public) يمكن رؤيتها وتعديلها من محرر Unity
public int enemyCount = 5;
public float jumpForce = 10.0f;
public string levelName = "الغابة المنسية";
// متغير خاص (Private)
private string secretKey = "ALPHA-OMEGA";
// ثابت (Constant)
const int MAX_SCORE_MULTIPLIER = 1000;
void Start()
{
// تعريف وتعيين قيم للمتغيرات الأساسية
int playerScore = 0;
float playerHealth = 100.0f;
string playerName = "البطل الشجاع";
bool isPlayerAlive = true;
// تحديث قيم المتغيرات
playerScore += 250;
playerHealth -= 30.5f;
if (playerHealth <= 0)
{
isPlayerAlive = false;
}
Debug.Log("\n--- تقرير حالة اللعبة --- ");
Debug.Log("اللاعب: " + playerName + " في المستوى: " + levelName + ".");
Debug.Log("النقاط الحالية: " + playerScore + ", الصحة المتبقية: " + playerHealth + ".");
Debug.Log("حالة البقاء: " + (isPlayerAlive ? "حي" : "ميت") + "."); // استخدام تعبير شرطي بسيط
Debug.Log("عدد الأعداء المتبقين: " + enemyCount + ".");
Debug.Log("أقصى مضاعف نقاط ممكن: " + MAX_SCORE_MULTIPLIER + ".");
Debug.Log("كود تفعيل خاص: " + secretKey + "."); // معلومات داخلية
}
}
في هذه الخطوة النهائية، قمنا بدمج الرسائل في Debug.Log لعرض معلومات أكثر شمولاً. لاحظ استخدامنا للعلامة + لربط النصوص والمتغيرات معاً. كما استخدمنا تعبيراً شرطياً مبسطاً (ternary operator) لطباعة "حي" أو "ميت" بناءً على قيمة isPlayerAlive.
الكود النهائي الكامل
هذا هو السكربت الكامل الذي يمكنك نسخه ولصقه في مشروع Unity الخاص بك. قم بإنشاء سكربت C# جديد (مثلاً باسم GameData) في مجلد Assets، ثم الصق هذا الكود بداخله. بعد ذلك، اسحب هذا السكربت إلى أي GameObject في مشهدك (مثل الكاميرا الرئيسية أو GameObject فارغ) وشغل اللعبة لرؤية النتائج في نافذة Console.
using UnityEngine;
public class GameData : MonoBehaviour
{
// متغيرات عامة (Public): يمكن الوصول إليها وتعديلها من محرر Unity مباشرة
public int enemyCount = 5; // عدد الأعداء في المستوى
public float jumpForce = 10.0f; // قوة القفز للشخصية
public string levelName = "الغابة المنسية"; // اسم المستوى الحالي
// متغير خاص (Private): لا يمكن الوصول إليه مباشرة من خارج هذا السكربت
private string secretKey = "ALPHA-OMEGA"; // كود سري أو بيانات داخلية
// ثابت (Constant): قيمته لا تتغير أبداً بعد تعريفه الأول
const int MAX_SCORE_MULTIPLIER = 1000; // أقصى مضاعف للنقاط
void Start()
{
// 1. تعريف وتعيين قيم للمتغيرات الأساسية
int playerScore = 0; // نقاط اللاعب، عدد صحيح (Integer)
float playerHealth = 100.0f; // صحة اللاعب، عدد عشري (Floating-point)
string playerName = "البطل الشجاع"; // اسم اللاعب، نص (String)
bool isPlayerAlive = true; // هل اللاعب على قيد الحياة؟ (Boolean)
Debug.Log("--- بيانات اللاعب الأولية ---");
Debug.Log("الاسم: " + playerName);
Debug.Log("النقاط: " + playerScore);
Debug.Log("الصحة: " + playerHealth);
Debug.Log("هل اللاعب حي؟ " + isPlayerAlive);
// 2. تحديث قيم المتغيرات بناءً على أحداث اللعبة
playerScore += 250; // اللاعب حصل على 250 نقطة إضافية
playerHealth -= 30.5f; // اللاعب خسر 30.5 نقطة صحة
// استخدام المتغير المنطقي لاتخاذ قرار
if (playerHealth <= 0) // إذا كانت صحة اللاعب صفر أو أقل
{
isPlayerAlive = false; // اللاعب لم يعد على قيد الحياة
}
Debug.Log("\n--- بيانات اللاعب بعد التحديث ---");
Debug.Log("النقاط الجديدة: " + playerScore);
Debug.Log("الصحة المتبقية: " + playerHealth);
Debug.Log("حالة البقاء: " + isPlayerAlive);
// 3. عرض المتغيرات العامة والخاصة والثوابت
Debug.Log("\n--- بيانات اللعبة العامة ---");
Debug.Log("عدد الأعداء في المستوى: " + enemyCount); // يمكن تعديلها من Unity Editor
Debug.Log("قوة القفز الافتراضية: " + jumpForce);
Debug.Log("المستوى الحالي: " + levelName);
Debug.Log("أقصى مضاعف نقاط ممكن: " + MAX_SCORE_MULTIPLIER);
// يمكن استخدام المتغير الخاص داخل السكربت
Debug.Log("معلومات سرية (فقط للمطور): " + secretKey);
// 4. مثال على دمج معلومات مختلفة في رسالة واحدة
Debug.Log("\n--- تقرير حالة اللعبة النهائي ---");
Debug.Log(playerName + " يتقدم في " + levelName + " ولديه " + playerScore + " نقطة.");
Debug.Log("صحة " + playerName + " هي: " + playerHealth + " وحالته: " + (isPlayerAlive ? "حي" : "ميت") + ".");
}
}
النتيجة المتوقعة
عند تشغيل اللعبة في محرر Unity، ستظهر الرسائل التالية في نافذة Console (قد تختلف القيم العشرية قليلاً بسبب دقة الفاصلة العائمة):
--- بيانات اللاعب الأولية ---
الاسم: البطل الشجاع
النقاط: 0
الصحة: 100
هل اللاعب حي؟ True
--- بيانات اللاعب بعد التحديث ---
النقاط الجديدة: 250
الصحة المتبقية: 69.5
حالة البقاء: True
--- بيانات اللعبة العامة ---
عدد الأعداء في المستوى: 5
قوة القفز الافتراضية: 10
المستوى الحالي: الغابة المنسية
أقصى مضاعف نقاط ممكن: 1000
معلومات سرية (فقط للمطور): ALPHA-OMEGA
--- تقرير حالة اللعبة النهائي ---
البطل الشجاع يتقدم في الغابة المنسية ولديه 250 نقطة.
صحة البطل الشجاع هي: 69.5 وحالته: حي.