Advertisement
  1. Game Development
  2. Programming

كيفية تخصيص عمليا الخاص بك لعبة الوحدة الأصول مع القانون

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

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

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

هنا ما سيبدو اشجارنا إنشاء إجرائياً:


انقر فوق الزر لإنشاء مجموعة جديدة من الأشجار.

برنامج الإعداد

كما هو الحال في البرنامج التعليمي السابق ، ستحتاج إلى تثبيت Unity ، ولديك معرفة أساسية بها. (راجع كيفية تعلم الوحدة للحصول على مكان جيد للبدء.)

إنشاء مشروع جديد لهذا البرنامج التعليمي، ووضع علامة في خانة الاختيار المسماة وحدات التحكم بالحرف؛ وقد نحتاج إليها في وقت لاحق.

قمت بإعداد بعض الأشجار التي سوف نستخدم، الذي يمكن العثور عليه في المجلد ملفات-3d تحميل المصدر. ملفات المشروع بأكمله، في حال كنت ترغب في الاستفادة منها، ويمكن أيضا الاطلاع على تحميل المصدر، ولكن ليست ضرورية لهذا البرنامج التعليمي.

جاهز؟ لنذهب!


خلق شجرة

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

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

procedural_elements_01procedural_elements_01procedural_elements_01

الآن إنشاء مكعب ثم اسم شجرة. الانتقال إلى عنصر Mesh Filter ومبادلة خارج شبكة المكعب في mesh tree_01. وينبغي أن تظهر إذا كان لديك ملفات ثلاثية الأبعاد في المجلد الأصل.

procedural_elements_17procedural_elements_17procedural_elements_17

قد لا تظهر الشجرة بالكامل بعد. وذلك لأن النموذج الثلاثي الأبعاد للشجرة يدعم مادتين (اللحاء والأوراق) ، ولكن في الوقت الحالي لا يزال يتم ضبطه على واحد. من أجل حل هذه المشكلة، افتح مجموعة مواد في مكون "شبكة العارض" في المكعب، وتعيين الحجم إلى 2. ينبغي أن تبدو مثل هذا:

procedural_elements_02procedural_elements_02procedural_elements_02

الآن نحن بحاجة إلى مواد اللحاء والأوراق. إنشاء اثنين من المواد الجديدة وإعطائها لون الأخضر والبنى أساسية. تعيين تلك المواد اثنين بفتحه المواد فيMesh Renderer  شجرة، ويجب أن يظهر مع تلك المواد المعروضة، مثل هذا:

procedural_elements_03procedural_elements_03procedural_elements_03
procedural_elements_04procedural_elements_04procedural_elements_04

لإنهاء هذه الشجرة الأساسية ، أضف مصادم الكبسولة بالنقر فوق Component> Physics> Capsule Collider. هذا حتى أننا لن نحرك 'من خلال' الشجرة عندما نختبرها فيما بعد. الوحدة سوف تسأل عما إذا كنت تريد استبدال مصادم المربع الحالي على الشجرة، التي يجب عليك التأكد. حالما تتم إضافة مصادم جديدة، تغيير القيم حيث أن يتراكب على شكل الكبسولة تقريبا على جذع شجرة، كما يلي:

procedural_elements_16procedural_elements_16procedural_elements_16

وستعمل هذه القيم:

procedural_elements_15procedural_elements_15procedural_elements_15

الآن ، اسحب كائن الشجرة إلى مجلد المشروع لتحويله إلى prefab. شجرة الأساسية لدينا يتم!


تدوير شكل عشوائي الأشجار

إنشاء برنامج نصي جديد يسمى tree.js وإضافته إلى الجاهزة شجرة. والآن، أضف الأسطر التالية إلى الدالة start ():

1
transform.localEulerAngles.y = Random.Range(0, 360);

الآن سوف تكون الشجرة مستدير كمية عشوائية على المحور الصادي عند إنشائه. وهذا يعني أنه إذا قمت بوضع صف من الأشجار، مثل هذا:

procedural_elements_05procedural_elements_05procedural_elements_05

.. مواساة كل بدوره في التوجيه الخاصة بهم عند بدء تشغيل اللعبة. وضع حفنة من الأشجار في مستوى الخاص بك ومحاولة بها!

procedural_elements_06procedural_elements_06procedural_elements_06

ضبط الحجم

بطريقة مماثلة ، يمكننا تغيير حجم أي كائن. قم بإضافة التعليمة البرمجية التالية إلى البرنامج النصي tree.js:

1
transform.localScale = transform.localScale * Random.Range(0.5, 1.5);

سيؤدي ذلك إما إلى تقليل حجم الشجرة أو زيادته. إذا كنت تبدأ مع مقياس 1 (والذي ينبغي أن يكون عليه الحال إذا كان كل شيء معداً بشكل صحيح)، سوف يكون الجدول الجديد بين 0.5 (نصف كبيرة) و 1.5 (50% أكبر). الآن يجب أن تبدو الأشجار الخاص بك حتى أكثر تنوعاً:

procedural_elements_07procedural_elements_07procedural_elements_07

استخدام مختلف نماذج ثلاثية الأبعاد

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

وللقيام بذلك، إضافة التعليمات البرمجية التالية إلى البرنامج النصي tree.js:

1
var treeMeshes: Mesh[];
2
function Start()
3
{
4
  gameObject.GetComponent(MeshFilter).mesh = treeMeshes[Random.Range(0, treeMeshes.Length)];
5
}

قبل البدء في مكان الحادث، على الرغم من تعيين الشبكات الثلاث لدينا لأن الصفيف، مثل هذا:

procedural_elements_09procedural_elements_09procedural_elements_09

إذا قمت بتشغيل المشهد الخاص بك ، فسوف تلاحظ أنك الآن تحصل على ثلاثة شبكات شجرة مختلفة ، تم تعيينها بشكل عشوائي.

procedural_elements_08procedural_elements_08procedural_elements_08

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


تغيير اللون

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

أولاً، نحن بحاجة إلى معرفة كيفية الحصول على الألوان. يمكن عادة الوصول إلى مادة كائن عن طريق renderer.material.color. وفي حالتنا، مع ذلك، لدينا اثنين من الألوان، مما يعني أننا بحاجة إلى الوصول إليها عن طريق renderer.materials[0].color و renderer.materials[1].color. تحقق من العارض مش الشجرة لمعرفة المواد التي (الأوراق أو اللحاء) في فتحه 0، والذي يتمثل في فتحه 1.

procedural_elements_03procedural_elements_03procedural_elements_03

إنشاء لون عشوائي يعمل بشكل مشابه للخطوات السابقة. إذا قمت بإضافة هذه الأسطر:

1
renderer.materials[0].color = Color(Random.Range(0, 1.1), Random.Range(0, 1.1), Random.Range(0, 1.1));
2
renderer.materials[1].color = Color(Random.Range(0, 1.1), Random.Range(0, 1.1), Random.Range(0, 1.1));

.. مواساة مادة اللحاء وأوراق المواد سوف تحصل على تعيين لون جديد تماما. دعونا التحقق من ذلك:

procedural_elements_10procedural_elements_10procedural_elements_10

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

استبدال رمز اللون أضفنا فقط مع هذا:

1
renderer.materials[0].color = Color(Random.Range(0.8, 1.1), Random.Range(0.4, 0.6), Random.Range(0, 0.2));
2
renderer.materials[1].color = Color(Random.Range(0, 0.4), Random.Range(0.6, 1.1), Random.Range(0, 0.4));

وجربه:

procedural_elements_11procedural_elements_11procedural_elements_11

أفضل بكثير. (إذا كان فجأة يترك البنى والجذع باللون الأخضر، مبادلة 1 و 0 في [renderer.materials[0.)

يعطي الرمز لونًا جديدًا في بداية لون البرنامج. تنتقل القيم الثلاث العشوائية من 0 (الحد الأدنى) إلى 1 (الحد الأقصى) ، والتي تتوافق مع القيم الحمراء والخضراء والزرقاء في اللون. عن طريق الحد من نطاق العشوائية، مثل بقول (Random.Range (0.3، 0.6، القيم التي تقتصر على طائفة معينة. وهذا يسمح لنا لإنشاء مجموعة من الألوان الجديدة التي لا تزال 'خضراء'، أو أيا كان لون أننا قد تحدد.


إمالة الشجرة (اختياري)

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

1
transform.localEulerAngles.x = Random.Range(-10, 10);

هذه المرة يتم تطبيق استدارة صغيرة جداً على المحور س، مما يجعل الشجرة الهزيل في هذا الاتجاه. للتأكد من أن ليس هناك "فجوة" بين جذور الأشجار والأرض، "محور" (أو المركز) من الشجرة-تنسجم قليلاً فوق الجذور، مما يعني أن هناك تذبذب-مساحة كافية متوفرة.

الشجرة أسرة-البرنامج النصي يجب أن تبدو مثل هذا:

1
var treeMeshes: Mesh[];
2
function Start()
3
{
4
    transform.localEulerAngles.y = Random.Range(0, 360);
5
    transform.localEulerAngles.x = Random.Range(-10, 10);
6
    transform.localScale = transform.localScale * Random.Range(0.5, 1.5);
7
    gameObject.GetComponent(MeshFilter).mesh = treeMeshes[Random.Range(0, treeMeshes.Length)];
8
    renderer.materials[0].color = Color(Random.Range(0.8, 1.1), Random.Range(0.4, 0.6), Random.Range(0, 0.2));
9
    renderer.materials[1].color = Color(Random.Range(0, 0.4), Random.Range(0.6, 1.1), Random.Range(0, 0.4));
10
}

يمكنك تجربة كل ذلك في هذا العرض التوضيحي:


خلق مستوى إجراءات بسيط

دعونا نرى كيف تشعر هذه في لعبة الفعلية.

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

ثم ، ضع جهاز تحكم أول شخص في المشهد. يمكن العثور عليها في وحدات تحكم الأحرف التي تم استيرادها في بداية البرنامج التعليمي. (إذا لم يكن لديك ، انقر فوق Assets> Import Package> Character Controllers). بعد أن تقوم بوضع أجهزة التحكم في FPS ، قم بإزالة الكاميرا الرئيسية. تأتي وحدة التحكم بمفردها ، لذا لن نحتاج إلى الكاميرا في المشهد بعد الآن. أيضا ، إضافة ضوء اتجاهي.

لإنشاء الأشجار تلقائيًا ، قم بإنشاء ملف JavaScript جديد ثم قم بتسميته treeGenerator.js. ضع التعليمة البرمجية التالية في ذلك:

1
var treePrefab: GameObject;
2
var numberOfTrees: int = 20;
3
function Start()
4
{
5
    for(var i: int = 0; i < numberOfTrees; i++)
6
    Instantiate(treePrefab, Vector3(transform.position.x + Random.Range(-40.0, 40.0), 0, transform.position.z + Random.Range(-40.0, 40.0)), transform.rotation);
7
}

ضع نص الشجرة treeGenerator.js على الأرضية ، وقم بتعيين الشجرة الجاهزة إلى الشجرة المتغيرة treefab ، وجرّبها:

procedural_elements_12procedural_elements_12procedural_elements_12
procedural_elements_13procedural_elements_13procedural_elements_13

وقمت! الآن لديك لعبة استكشافية بسيطة ، والتي سوف تخلق مستوى فريد من نوعه كل تشغيل.

مزيد من التحسينات

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


استنتاج

اللمسات الإجرائية هي طريقة بسيطة وفعالة لإنشاء التفاصيل تلقائيًا. بدلا من وجود عشرة أشياء يمكن أن يكون لديك عدد لا نهائي.

يمكنك استخدام العناصر التي لعبنا بها في لعبتك الخاصة ، أو يمكنك تفريقها وإعادة كتابتها لتلائم أغراضك الخاصة. على سبيل المثال ، لقد صنعت نظامًا يخلق أطوالًا مختلفة من الخيزران:

procedural_elements_14procedural_elements_14procedural_elements_14

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.