-->
random

آخر المواضيع

random
recent
جاري التحميل ...
recent

تعلم لغة سي شارب C# لتصميم العاب Unity

 تعلم لغة سي شارب C# لتصميم العاب Unity


السلام عليكم ورحمة الله

اما بعد فان هذا الموضوع لتعلم لغة سي شارب مع التركيز اكثر على اليونيتي لتطوير العاب 

هذا درس اخر مشابه للدرس السابق حول لغة C#

الدرس السابق من هنا

كنت دخلت الى انرل انجن سابقا وكانت تجربة صعبة لان المشكلة كانت في اغلب الدروس باليوتيب تشرح في نسخة unreal engine 5 

والمشكلة ان هذا الاصدار الجديد يحتاج جهاز حاسوب قوي لذلك كان عندي لاق بتلك النسخة فحاولت العمل على نسخة 4.27 لكن مع الاسف هناك اختلافات بين هذا الاصدار والاصدار الخامس فمثلا انت تتابع دورة معينة حتى تجد نفسك عالق في نافذة معينة توجد بالشرح ولا توجد عندك انت في نسختك واكتشفت لاحقا ان انرل انجن فيه عيب كبير وهو ان كل نسخة جديدة تكون مختلفة عن الاخرى في بعض الاضافات ونوافذ جديدة وهذا يشكل مشكيل عند المبتدئين للتعلم البرنماج 

ثم الدروس باليوتيب فيها نوع من السطحية فلا يشرحون لك مثلا اذا قام باضافة نود جديد لماذا قام باضافته وكيف تتعامل معه بل فقط يقولك اتبع وافعل ما افعله ويغفلون شروحات مهمة لا يخبرونك بها بالدورات 

المشكلة الاخرى التي واجهتني بالبرنماج هي الملفات التي اقوم بحفظها بمجرد فتح واغلاق البرنماج تختفي كل الملفات ويختفي معها البلوبرينت الذي وضعته سابقا وهذا فعلا مثير للاعصاب هه المهم يمكن اضافات معلومات جديدة اذا توفرت عن انرل انجن ولان دعونا نبدا الرحلة في عالم سي شارب واليونيتي 

لغة سي شارب C#

اولا سنحتاج محرر اكواد للعمل عليه اثناء تنفيد اوامر الكود

لذلك قمت بتجربة اقوى برنماج لتحرير الاكواد وهو برنماج Visual studio community تقوم بتحميله ثم اثناء التثبيت سيطلب منك اختيار الاضافات التي تريد تحميلها وعلينا اختيار الاضافات التي تناسب لغة C# 

ASPNET و NET Desktop وNET Multi PLatform APP و Applications windows و Unity Games سيكون الحجم الكلي تقريبا 25GB جيكا 

ولكن اذا كنت تريد فقط سي شارب لليونيتي unity فان اضافة Develeppement Unity كافية للعمل على البرنماج ويعطيك حجم تحميل الاداة فقط 3 جيكا فقط وهذا جيد ثم يمكنك فيما بعد تحميل ادوات اخرى اذا كنت تريد العمل على تطبيقات و اشياء اخرى

للتاكد ان البرنماج يعمل مع اليونيتي تفتح يونيتي unity ثم تذهب الى قائمة Edit ثم Preferences ثم في External tools تاكد من اختيار Visual studio او اي محرر اكواد عندك بالحاسوب الذي تستخذمه

وهذا هو عيب البرنماج ان مساحات الملفات كبيرة لانه يحتوي على كل ما ستحتاجه مستقبلا يعني ولكن عيبه الثاني هو انه ثقيل على الجهاز وياخذ بعض الوقت ليفتح معك

ثم لدينا برنماج اخر لمحرر الاكواد وهو Visual studio code هو خفيف على الاجهزة ومناسب جدا 

ولكن فيه مشاكل كثيرة اثناء محاولة تنصيب سي شارب داخله او اي لغة اخرى وفيه مشاكل اثناء محاولة عمل compile للاكواد ومزعج جدا من هذه الناحية ويحتاج الى صيانة هذا العيب الكبير بكل صراحة

لذلك لدي حل نهائي لهذه البرامج التي تسبب وجع الراس وهو برنماج اخر صغير جدا وخفيف بحجم 35 ميغا فقط وهو برنماج Sharpdevelope انه البرنماج الذي استعمله مؤقتا فقط حتى اقوم بتنصيب visual studio community الاساسي 

Download here تحميل البرنماج هنا https://bit.ly/4aq65OY You will need also SDK ستحتاج لهذا البرنماج كذلك ضروري لكل برامج محرر الاكواد Download SDK Here https://dotnet.microsoft.com/en-us/download/dotnet/9.0


تقوم بتنصيب SDK اولا ثم تفتح البرنماج تضغط New solution ثم console application

وهكذا نكون مستعدين للبدء الان

اساسيات سي شارب C#

اي كود سنكتبه لبد من كتابته بين هذه الاقواس

 {
        public static void Main(string[] args)
        {
            Console.Title ="lhob";
            Console.WriteLine("Hello yass baby");
    
            
            // TODO: Implement Functionality Here
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);

        }

consol writeline هو امر بقراءة الاكواد او استخرج لي العبارة التالية

console title هو امر بتغيير اسم النافذة التي يظهرها لنا الconsole

console readkey هو امر بتوقيف الشاشة كي لا تنغلق تلقائيا حتى نضغط على احد ازرار

الامر باللون الاخضر // لاضافة ملاحظات وعناوين داخل محرر الكود ولا يستطيع البرنماج قراءتها

الاكواد لبد ان تنتهي دائما ب علامة ; يطلق عليها statment

نضغط F5 للقيام بعملية compile او قراءة للكود

العلامات المطلوبة دائما اثناء كتابة الكود في حاسوب محمول مثلا

" " تجدها بالضغط رقم 3 بالاعلى الكيبورد

; تجدها بالضغط زر النقطة فوق Alt Gr

= تجدها عند الضغط زر يساوي بالاعلى

. النقطة تجدها بالضغط shift مع زر النقطة

) تجدها قرب زر يساوي

( تجدها في الرقم 5 بالاعلى

{ تجدها بالضغط Alt Gr مع 4 بالاعلى

} تجدها بالضغط Alt Gr وزر يساوي

[ تجدها بالضغط Alt Gr ورقم 5 بالاعلى

] تجدها بالضغط Alt Gr وزر قرب الصفر بالاعلى

> بالضغط على زر قرب واحد بالاعلى

< بالضغط shift مع نفس الزر قرب واحد

/ زر المتواجد فوق ctrl

\ بالضغط Alt Gr و 8

; فاصلة منقوطة انتباه هذه العلامة دائمة في نهاية كل سطر اكواد لكن في هذا الموضوع تظهر لي في بداية العملية اوك كي لا تختلط عليكم الامور


المتغاييرات Variables

المتغاييرات تستعمل لتخزين بيانات مؤقتة او دائمة في الذاكرة memory بغرض التعامل معها اثناء تنفيد البرنماج

مثلا لو اردنا انشاء برنماج يعطينا مجموع عددين سيكون علينا حجز في الذاكرة مكانين لمتغايرين رقميين

ثم نعطي كل متغايير منهما قيمة كي نتمكن من حساب المجموع

وطريقة الاعلان عن متغايير كما يلي

كتابة نوع المتغايير اولا لان فيه انواع متعددة والقيمة التي نريد تخزينها فيه

قيمة رقمية --- متغايير رقمي

قيمة حرفية --- متغايير حرفي

قيمة نصية --- متغايير نصي الى اخره

الرقمي اعداد صحيحة : int // العشري ذات دقة عالية : Double

النصي : String // العشري ذات ذقة عادية : Float

منطقي صح او خطاء : bool // التاريخ : DateTime

الحروف : Char // وانواع اخرى

شروط كتابة المتغايير

يجب ان يبدا بحرف ام علامة _

لا يحتوي على مسافة ولا يبدا برقم ولا يبدا برمز ولا يجب استعمال اسماء محجوزة مثل int لانها اسمها متغاييرات ولا اي اسم يستعمله البرنماج مثل static وغيره

الفرق بين float و Double

float يصل فقط الى سبع احرف بعد الفاصلة

يحجز فقط 4 بايت من الذاكرة نواة 32بايت ونطاق اضيق و سريع في العمليات الحسابية مناسب للارقام غير حاسمة مثل الالعاب او الرسومات ثلاثي الابعاد فهو يكفي ويوفر اداء افضل واستهلاك اقل للذاكرة

Double تصل اعداده العشرية الى 15 رقم بعد الفاصلة

يحجز 8 بايت من الذاكرة نواة 64بايت ونطاق اوسع بطيء بالعمليات الحسابية لكنه اكثر دقة ضروري فقط اثناء الحسابات الدقيقة جدا مثل الفزياء او الاموال

1. المتغيرات الأساسية (Primitive Types) أ. الأرقام الصحيحة int: لتخزين الأعداد الصحيحة. int score = 100; long: لتخزين أعداد صحيحة أكبر حجمًا. long highScore = 1000000L; ب. الأرقام العشرية float: للأرقام العشرية ذات الدقة العادية. float speed = 5.5f; double: للأرقام العشرية ذات الدقة الأعلى. double precision = 3.141592653589793; ج. القيم المنطقية bool: لتخزين قيم "true" أو "false". bool isGameOver = false; د. الأحرف والنصوص char: لتخزين حرف واحد. char grade = 'A'; string: لتخزين النصوص. string playerName = "Alice"; 2. المتغيرات المصفوفية (Array and List Types) Array: لتخزين قائمة ثابتة من العناصر. int[] scores = { 10, 20, 30 }; List<T>: لتخزين قائمة ديناميكية يمكن تعديل حجمها. List<string> inventory = new List<string>(); inventory.Add("Sword"); 3. المتغيرات المرجعية (Reference Types) GameObject: يشير إلى كائن في المشهد. GameObject player = GameObject.Find("Player"); Transform: يُستخدم لإدارة الموقع والدوران والقياس. Transform playerTransform = player.transform; Component: للإشارة إلى مكونات معينة مثل Rigidbody أو Collider. Rigidbody rb = GetComponent<Rigidbody>(); 4. أنواع Unity المخصصة أ. المتغيرات ثلاثية الأبعاد Vector2: يُستخدم لتمثيل الإحداثيات ثنائية الأبعاد. Vector2 position = new Vector2(5, 10); Vector3: للإحداثيات ثلاثية الأبعاد. Vector3 position = new Vector3(1, 2, 3); ب. Quaternions تُستخدم لتحديد الدوران. Quaternion rotation = Quaternion.Euler(0, 90, 0); ج. Color لتحديد الألوان. Color color = Color.red; 5. الأنواع المخصصة (Custom Types) يمكنك إنشاء أنواع مخصصة باستخدام struct أو class. public struct PlayerStats { public int health; public int mana; } 6. المتغيرات الزمنية Time.deltaTime: لحساب الفرق الزمني بين الإطارات، مما يجعل الحركة سلسة. transform.Translate(Vector3.forward * speed * Time.deltaTime); 7. المتغيرات الفيزيائية Rigidbody: للتحكم في الجسم الفيزيائي. Rigidbody rb = GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * 10); 8. المتغيرات المتعلقة بالدخل (Input Variables) Input.GetAxis: للحصول على القيم من لوحة المفاتيح أو وحدة التحكم. float horizontal = Input.GetAxis("Horizontal"); 9. الأنواع الثابتة (Constant Types) const: متغير لا يمكن تغييره بعد التهيئة. const int MaxHealth = 100; readonly: متغير يُحدد عند التشغيل فقط. readonly string GameTitle = "My Unity Game"; 10. المتغيرات الثابتة عالميًا (Static Variables) تُستخدم لمشاركة القيم عبر جميع الكائنات من نفس النوع. public static int playerCount = 0; اختر نوع المتغير بناءً على احتياجات اللعبة لتحسين الأداء.

لكتابة ملاحظات داخل البرنماج في عدة اسطر نستعمل كود

/* ....... */

الثوابت مثل المتغاييرات لكنها تبقى ثابتة ولا تتغير اثناء تنفيد البرنماج

الاعلان عن الثوابت نستعمل كلمة const 

مثلا

const int myNumber=3;

const string name="karim";


الفرق بين اوامر الاخراج write و writeLine

write يطبع الكلمات في سطر واحد

writeline يطبع كل كلمة في سطر لوحدها


الان سنقوم بانشاء برنماج يطلب منا ادخال الاسم وحين نكتب الاسم سوف يظهر لنا رسالة ترحيبية

Console.Write("enter your name: ");

string name=Console.ReadLine();


Console.Write("Hello mr: "+name);


ملاحظة تاكد من الحجم الصحيح للحروف فمثلا لبد الحرف C كبير في كلمة Console والحرف الكبير ايضا في كلمة Write اوك حجم الحروف مهم جدا لان اي حرف كبير اذا كتبته صغير سيعطيك خطاء في قراءة الكود 

نستعمل + لدمج مع المتغايير 

طلبنا من البرنماج حفظ القيمة التي سيكتبها الشخص ثم يستدعي الرسالة الترحيبية بعد ادخال الاسم المخزن داخل name 


لو حاولنا القيام مثلا بطلب الشخص ادخال عمره باستعمال متغايير رقمي int هكذا

Console.Write("enter your age: ");

int age=Console.ReadLine();

فسوف يعطينا خطاء لان الدالة Console.ReadLine هي دالة نصية ولا يمكن وضعها داخل متغايير الرقمي 

اذا طريقة تحويل الدالة النصية الى دالة رقمية بطريقتين

الطريقة الاولى باستعمال Parse على الشكل التالي


Console.Write("enter your name: ");

string name=Console.ReadLine();


Console.Write("enter your age: ");


التحويل

int age=int.Parse(Console.ReadLine());

ثم نكتب

Console.Write("Hello Mr: "+ name +"your age is: "+age);


الطريقة الثانية

int age=Convert.ToInt32(Console.ReadLine());


ToInt32 تقوم باخذ قيمة مدخلة من نوع معين مثل string - float-double

وتحاول تحويلها الى عدد صحيح int


امثلة

تحويل نص رقمي الى عدد صحيح

لدينا

string numberText="123";

int number=

الحل

Convert.ToInt32(numberText);

Console.WriteLine(number);

الناتج 123


تحويل رقم عشري الى عدد صحيح تقريبي

لدينا

double decimalNumber=12.9;

int integer=

الحل

Convert.ToInt32(decimalNumber);

Console.WriteLine(integer);

الناتج 13


تحويل قيمة منطقية boolean

لدينا

bool isTrue=true;

int number =

Convert.ToInt32(isTrue);

Console.WriteLine(number);

الناتج 1 true

لدينا الروابط او القواعد

وهي مجموعة من الرموز المستعملة لانجاز مجموعة من العمليات

1 روابط رياضية

تستعمل من اجل القيام بعمليات حسابية وهي رموز معروفة

+ للجمع . - للطرح , / القسمة , * الضرب , % باقي القسمة

2 الروابط المنطقية

ترجع لنا النتيجة صح او خطا حسب العملية المنطقية سواء كانت عبارة او مجموعة عبارات

الرابط && : يعني And و : يعطي قيمة صحيحة اذا كانت كل الاطراف صحيحة

الرابط II : يعني Or او : يعطي قيمة صحيحة اذا كانت كل الاطراف صحيحة

الرابط Cond?Var1:Var2 : يتحقق من الشرط اذا لم يتحقق يمر الى الامر الذي يليه

3 الروابط المقارنة

تستعمل للمقارنة بين المتغايرات غالبا يستعمل معها متغايير bool

IS : للتحقق من نوع المتغايير

> : اصغر قطعا

< : اكبر قطعا

=> , =< : اصغرمن او يساوي , اكبر من او يساوي

=! : يخالف

== : يساوي

4 روابط اعطاء قيمة :

= : لاعطار قيمة لمتغايير

- - , ++ : تزيد او تنقص بمقدار واحد

=% , =* ; =/ ; =- ; =+ : لها نفس دور العمليات الحسابية العادية

مثال عمليات حسابية

Arithmetic Operators

int x , y,sum;

x=7;

y=9;

sum=x+y;

للطباعة الامر نكتب

;Console.Write("answer is:"+sum)

هذا الكود لوقف الشاشة طبعا اذا لم تكتبه سابقا نكتبه تحته ِ;()Console.readkey

يمكنك تغير عبارة answer is وتضع في مكانها اي عبارة اخرى

وسيعطينا النتيجة 16 التي هي عملية الجمع بين قيمة X و Y

مثال روابط المقارنة :
تعطينا فقط صح true او خطا false
لذلك سنعلن عن متغايير من نوع bool ونكتب التالي
bool test = 5>6 ;
;Console.Write(test)
سيعطينا النتيجة خطا false لان 5 ليس اكبر من 6

البنية الشرطية الجزء الاول IF اذا احيانا نحتاج لاجراء تحقق من شرط معين وطلب تنفيد كود معين دون باقي الاكواد وتنقسم الى ثلاث انواع سنشرحها في هذا الموضوع انشاء الله

كل انواع الجمل الشرطية

1. جملة if (الشرط الأساسي) 🔹 تستخدم عندما يكون هناك شرط واحد فقط نريد التحقق منه وتنفيذ كود بناءً عليه. 🔹 لا يجب استخدامها عندما يكون لديك العديد من الشروط المتفرعة التي يمكن إدارتها بطريقة أفضل، مثل switch. مثال :
int age = 20;
if (age >= 18)
{
    Console.WriteLine("أنت بالغ ويمكنك الدخول.");
}

🔹 متى لا يجب استخدامها؟
إذا كان لديك اختيارات متعددة، فمن الأفضل استخدام switch.

2. جملة if-else (الشرط مع بديل)
🔹 تُستخدم عندما يكون لديك خيارين (شرطان متعاكسان).
🔹 يجب تجنب استخدامها إذا كان هناك أكثر من خيارين، لأن switch قد يكون أوضح.

مثال:
int age = 16;
if (age >= 18)
{
    Console.WriteLine("يمكنك القيادة.");
}
else
{
    Console.WriteLine("لا يمكنك القيادة بعد.");
}

🔹 متى لا يجب استخدامها؟
عندما يكون لديك أكثر من خيارين متفرعين، عندها من الأفضل استخدام if-else if أو switch.

3. جملة if-else if-else (عدة شروط متتابعة)
🔹 تُستخدم عندما يكون هناك أكثر من احتمال للحالة، ولكن ليس عددًا كبيرًا جدًا.

مثال:
int score = 85;
if (score >= 90)
{
    Console.WriteLine("تقدير ممتاز!");
}
else if (score >= 75)
{
    Console.WriteLine("تقدير جيد.");
}
else
{
    Console.WriteLine("تحتاج إلى التحسين.");
}

🔹 متى لا يجب استخدامها؟
عندما يكون لديك الكثير من القيم المحتملة، عندها من الأفضل استخدام switch.

4. جملة switch (لاختيار أحد القيم المحددة)
🔹 تُستخدم عندما يكون هناك عدة خيارات محتملة ولكن جميعها تعتمد على قيمة واحدة.
🔹 لا يجب استخدامها عندما تعتمد الشروط على عمليات حسابية أو منطقية معقدة.
  مثال :
char grade = 'B';
switch (grade)
{
    case 'A':
        Console.WriteLine("ممتاز!");
        break;
    case 'B':
        Console.WriteLine("جيد جدًا.");
        break;
    case 'C':
        Console.WriteLine("جيد.");
        break;
    default:
        Console.WriteLine("لم تنجح.");
        break;
}

🔹 متى لا يجب استخدامها؟
عندما يكون القرار يعتمد على مقارنات رياضية (>, <, <=، إلخ)، لأنه لا يمكن تنفيذ ذلك في switch.

5. جملة الشرط الثلاثي (?: - Ternary Operator)
🔹 تُستخدم عندما يكون لديك شرط بسيط جدًا، وتريد كتابة الكود بشكل مختصر.

مثال:
int age = 20;
string result = (age >= 18) ? "بالغ" : "قاصر";
Console.WriteLine(result);

🔹 متى لا يجب استخدامها؟
عندما يكون هناك أكثر من شرطين، لأن الكود يصبح صعب القراءة.

أنواع الشروط التي يستخدمها Unity في تطوير الألعاب

في Unity، تُستخدم شروط C# نفسها ولكن غالبًا داخل تحديثات اللعبة (Update، FixedUpdate، إلخ). من الشروط الأكثر استخدامًا في Unity:

1. استخدام if للتحقق من مدخلات اللاعب
مثال :
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))  // عند الضغط على زر المسافة
    {
        Debug.Log("تم الضغط على زر القفز!");
    }
}

2. استخدام if مع تصادم الكائنات
مثال :
void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Enemy")  // عند لمس عدو
    {
        Debug.Log("لقد اصطدمت بالعدو!");
    }
}

3. استخدام switch لمعالجة حالات اللعبة
مثال :
enum GameState { Start, Playing, GameOver }
GameState currentState = GameState.Start;
void Update()
{
    switch (currentState)
    {
        case GameState.Start:
            Debug.Log("اللعبة في وضع البداية.");
            break;
        case GameState.Playing:
            Debug.Log("اللعبة قيد اللعب.");
            break;
        case GameState.GameOver:
            Debug.Log("انتهت اللعبة!");
            break;
    }
}

شرح بصيغة اخرى :
























 











سيتم اضافة معلومات جديدة في هذا الموضوع كلما توفر لدينا الوقت لذلك

فابقى على الاطلاع قدر الامكان ونتمنى للجميع الاستفادة والنفع وتكون صدقة جارية انشاء الله ادعي لنا من قلبك وبتوفيق انشاء الله

اشترك بالقناة لدعمنا

Yokagi

ProvigiL


التعليقات



إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

إتصل بنا

جميع الحقوق محفوظة

Yassine Agourram

2016