قائمة
مجانا
تحقق في
الرئيسية  /  النصيحة / ما الأحداث الموجودة في الوحدة. ملاحظاتي

ما الأحداث الموجودة في الوحدة. ملاحظاتي

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

ملحوظة: هذه المقالة ليست حقيقة حقيقية. هذا هو مجرد عرضي وتجربتي.

لا وقت لصنع صور للمقال، وهذا ضروري! لذلك، صورة من جوجل!

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

  1. خطي. هذا الخيار يعني أن N "OE عدد الأحداث يتم تنفيذها بعد التالي.
  2. موازي. اتصل بأكثر من حدث واحد على معالج واحد.
  3. مختلط. هذا مزيج من الخيار الأول والثاني.

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

بحيث تفهم ما أعنيه بموجب المعالجين، إليك أمثلة: مشغلات، أزرار مضغوطة (مفاتيح لوحة المفاتيح)، الأشعة (Raycast)، إلخ.
حسنا، ضمن المشغلات: إعادة إنتاج الأصوات، حركة الكائنات، إلخ.

مجردة، لقد أنشأت الهندسة المعمارية التالية:

يبدو بسيطا جدا، أليس كذلك؟ حتى في خطة البرنامج، لا تحتاج إلى تحميل صالات الألعاب الرياضية (على الرغم من أنني قادر على التوصل إلى تحقيق

هنا هو ما تبدو الفئة الأساسية لجميع الأحداث:

باستخدام unityengine؛ // system.collections.gollations. A NOMENT COORE COORENT: MONOBEHAVIOUR (NEXEVENT الجمهور NextEvent؛ // الحدث التالي // القائمة العامة listevents. اختصار جمهور عمل الفراغ ()؛ في

في التعليقات، حددت قائمة الأحداث التي قد تعمل / يجب أن تعمل. مثال صغير:

باستخدام unityengine؛ الرائد في الطبقة العامة: CoreEvent (التجاوز العام إجراء الفراغ () (// إذا كان (nextevent! \u003d null) nextevent.action ()؛ // آخر الطباعة ("انظر")؛)

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

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

عمل باطل الجمهور () (Base.action ()؛ // نوع من الوظيفة)

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

المعالجة الصف العام: Monobehaviour (القائمة العامة الأحداث؛ // الإشارة إلى الطبقة الأساسية. إطلاق VOIB الظاهري العام (ل (Forte Countevent \u003d 0؛ Dillevent< events.Count; countEvent++) { if (events != null) events.Action(); // Вызываем только те события, которые указаны в листе (не null). } } } public enum TriggerType { Enter, Stay, Exit } public class TriggerHandler: HandlerEvents { public TriggerType triggerType; private void OnTriggerEnter2D(Collider2D other) { if (triggerType == TriggerType.Enter && other.GetComponent()) إطلاق ()؛ ) void void ontrigperexit2d (collider2d الأخرى) (إذا (triggertype \u003d\u003d triggertype.exit && othercomponent ()) إطلاق ()؛ ) void void ontriggerstay2d (collider2d أخرى) (إذا (triggertype \u003d\u003d triggertype.stay && othercomponent ()) إطلاق ()؛ ))

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

هذا يبدو أن كل شيء. اذا لديك سؤال، اسأل!

قريبا سأتحدث عن العديد من المبادئ المثيرة للاهتمام التي أستخدمها والتي يمكن أن تساعد عند العمل مع الوحدة.
حسنا، هناك منظمة مشروع، قراءة مع XML، رمز التنظيم، إلخ. هكذا!

يتم تقسيم المحركات في Unity3D إلى ثلاث مجموعات كبيرة:

الأحداث الناجمة عن زيت الزيت الحدث (مشهد التحميل، خرج المستخدم)
يتم تنفيذ هذه المجموعة من الأحداث على أساس غير منتظم.

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

الأحداث الناجمة عن حساب الفيزياء
والفريق الأخير. لحساب الفيزياء، يتم إنشاء مؤشر ترابط مستقل منفصل، والأحداث التي يتم استدعاؤها في فترة زمنية معينة. يمكن تكوين حجم هذا الفاصل في عنصر القائمة: تحرير -\u003e إعدادات المشروع -\u003e الوقت -\u003e TimeStep الثابت.

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

الآن دعنا نتحول مباشرة إلى ترجمة قسم المساعدة.

الإجراء لأداء الأحداث
في Unity3D، هناك عدد من الأحداث التي يتم تنفيذها بطريقة معينة. نحن تصف هذا الطلب أدناه:

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

قبل التحديث الأول من الإطارات

بداية: اتصل قبل رسم الإطار الأول، فقط إذا تم تعريف البرنامج النصي.

في الفاصل بين الإطارات

onapplicationPause: يتم استدعاء هذا الحدث في نهاية الإطار عند اكتشاف وقفة، في الواقع بين المرطبات المعتادة للإطارات. بعد إيقاف التشغيل، يتم رسم إطار إضافي واحد من أجل إظهار النافذة التي يتم عرضها أثناء الإيقاف المؤقت.

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

Inflactupdate: لا يعتمد FIXICDUPDATE () على التحديث ()، ويمكن استدعاؤه في كثير من الأحيان أقل في كثير من الأحيان (عادة ما يكونا أقل في كثير من الأحيان إذا كان FPS مرتفعا بما فيه الكفاية). يمكن أن تسبب هذا الحدث عدة مرات في الإطار إذا كان FPS منخفضا أو ربما ليس على الإطلاق الناجمة عن الإطارات إذا كان FPS مرتفعا. يتم حدوث جميع الحسابات المادية للمحرك وتحديثها مباشرة بعد fixforupdate (). عند استخدام حسابات الحركة داخل fixfolupdate ()، لا تحتاج إلى مضاعفة قيمتك إلى Time.deltatime. وذلك لأن fixmedupdate () يسمى من مؤقت مستقل عن تردد الإطار.
تحديث: التحديث () يسمى مرة واحدة لكل إطار. هذا هو الحدث الرئيسي لرسم إطار.
LATTUPDate: يطلق عليه LateUpdate () مرة واحدة في الإطار، بعد الانتهاء (). سيتم الانتهاء من أي حسابات يتم تنفيذها في التحديث () عند الاتصال بتوقيت التامت (). عادة ما يتعقب الاستخدام الرئيسي ل Lateupdate () غرفة طرف ثالث. إذا قمت بنقل شخصيتك في حدث التحديث الحدث ()، فيمكن إجراء حركات الكاميرا وحسابات موقعه في الحدث اللاتبي (). سوف يضمن أن الشخصية مرت تماما أمام الكاميرا، وتأمل موقعها.

تقديم المشهد (التقديم)

onprecull: دعا قبل تجميع المشهد على الكاميرا. تحدد الجمعية الكائنات المرئية للكاميرا. يطلق على OnPreCull فقط إذا حدث مشاهد "تقليم" من كائنات غير مرئية.
onbecamevisible / onbecameinvisible: اتصل عندما يصبح كائن مرئي / غير مرئي لأي كاميرا.
onwillrenderobject: اتصل مرة واحدة لكل كاميرا إذا كان الكائن مرئيا.
OnPreerender: دعا قبل أن تبدأ الكاميرا في رسم مشهد
onrenderobject: دعا عند رسم جميع كائنات المشهد. يمكنك استخدام وظائف GL أو Graphics.drawmeshnow التي من شأنها إنشاء رسوماتك على هذه الكاميرا.
OnPosTrender: دعا بعد نهاية رسم المشهد على الكاميرا.
OnRenderImage (إصدار Pro فقط): دعا بعد رسم المشهد، لصور ما بعد العملية على الشاشة.
ongui: دعا عدة مرات في الإطار استجابة لأحداث الواجهة. تتم معالجة الأحداث الترتيب وملء في المقام الأول، ثم أحداث الإدخال من لوحة المفاتيح / الماوس.
Ondrawgizmos: تستخدم لرسم gizmo على خشبة المسرح.

soprogram.
عادة، يتم إجراء مكالمة نقل بعد إرجاع وظيفة التحديث (). السبرغرام هو وظيفة يمكن أن تعلق التنفيذ (العائد) حتى يتم تنفيذها. أنواع مختلفة من استخدام التحويلات:

أثمر: ستستمر المعلمة بعد كل وظائف التحديث ()، والتي سيتم استدعاؤها في الإطار التالي.
العائد waitforseconds (2): تابع بعد وقت التأخير المحدد، عندما تكون كل تحديث الوظائف () تسببت بالفعل في الإطار
العائد waitforfixedupdate (): تواصل عندما تم بالفعل تسبب جميع وظائف Fixforupdate ()
المحصول www: يستمر عند اكتمال تنزيل محتوى WWW.
العائد startcoroutine (MYFUNC): سيرفوجوجرامس الاتصالات، ستتوقع مكالمة نقل الانتهاء من وظيفة MyFunc.

تدمير الأشياء

ondestroy: يتم استدعاء هذه الميزة للإطار الأخير من وجود كائن (يمكن تدمير الكائن استجابة لكائن .destroy أو عند إغلاق المشهد).

عند الخروج
يتم استدعاء هذه الوظائف لجميع الكائنات النشطة في المشهد:

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

وبالتالي، هذا هو ترتيب تنفيذ البرامج النصية:

جميع الأحداث المستيقظة
جميع الأحداث تبدأ
دورة (بخطوة في متغير Delta Time)
جميع وظائف FIXIMSDATE
- علاج المحرك المادي
-إضافة المشغلات onter / الخروج / البقاء
- OnEnter / الخروج / الاصطدامات
تحويل جامدة، وفقا لتحويل.
onmousedown / onmouseup الدكتور المدخلات الأحداث
جميع الأحداث التحديث ()
الرسوم المتحركة، الخلط والتحول
جميع الأحداث الاطرة.
الرسم (التقديم)

النصيحة
إذا قمت بتشغيل Soprograms في Lairpdate، فسيتم استدعاؤها أيضا بعد التسعين مباشرة قبل التقديم.
يتم تنفيذ القوائم بعد جميع وظائف التحديث ().

العمل مع محرك لعبة Unity3D هو أحد المفاهيم الأولى التي يجب تعلمها - وهذا هو ترتيب استدعاء الأحداث في اللعبة ومعالجة هذه الأحداث ذاتها.

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

مقدمة مترجم

ولكن، قبل بدء الشهادات الرسمية، أريد أن أشير إلى أن الأحداث في وحدة Unity3D تنقسم إلى أربع مجموعات كبيرة:

  1. الأحداث الناجمة عن رسم الإطار
    في هذه الحالة، يتم استدعاء جميع البرامج النصية المستخدمة في دورة رسم الشاشة، وبالتالي ستؤثر مباشرة على FPS (معدل الإطار في الثانية). لذلك، من الضروري العمل بعناية فائقة مع الوظائف التي تتطلب الكثير من الوقت لمعالجة.
  2. الأحداث الناجمة عن حساب الفيزياء
    لحساب الفيزياء، يتم إنشاء مؤشر ترابط مستقل منفصل، والأحداث التي يتم استدعاؤها في فترة زمنية معينة. يمكن تكوين حجم هذا الفاصل في عنصر القائمة: تحرير -\u003e إعدادات المشروع -\u003e الوقت -\u003e TimeStep الثابت.
  3. الأبوجرام (كوروتينا).
    والفريق الأخير. إذا كان بعيد المنال جدا، فيمكن مقارنتها بالعمليات الفردية، ولكن نظرا لأنه في وحدة Unity3D غير مسموح لها بإنشاء تدفقات فردية، فهذا هو حل وسط. يسمح لك بمقاطعة الحسابات، وإعطاء الموارد إلى الدفق الرئيسي، ثم استئناف الجزء التالي من الحسابات. مثال مشرق - إعادة حساب دائم لتكلفة البضائع في مختلف المنافذ. سوف يذهب بحد ذاتها، لن تبطئ عملية اللعبة، وسوف تكون الأسعار في المتاجر ذات صلة دائما.

معرفة هذا الانهيار يمكنك بالفعل اتخاذ القرارات بشأن المكان الذي من الأفضل وضعه.

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

الآن دعنا نتحول مباشرة إلى ترجمة قسم المساعدة.

الإجراء لأداء الأحداث

في Unity3D، هناك عدد من الأحداث التي يتم تنفيذها بطريقة معينة. نحن تصف هذا الطلب أدناه:

مشهد التحميل الأول

يتم استدعاء هذه الوظائف عندما يبدأ المشهد (مرة واحدة لكل كائن في الإطار).

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

قبل التحديث الأول من الإطارات

  • بداية: اتصل قبل رسم الإطار الأول، فقط إذا تم تعريف البرنامج النصي.

في الفاصل بين الإطارات

  • onapplicationPause: يتم استدعاء هذا الحدث في نهاية الإطار عند اكتشاف وقفة، في الواقع بين المرطبات المعتادة للإطارات. بعد إيقاف التشغيل، يتم رسم إطار إضافي واحد من أجل إظهار النافذة التي يتم عرضها أثناء الإيقاف المؤقت.

تحديث الطلب

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

  • Inflactupdate: لا يعتمد FIXICDUPDATE () على التحديث ()، ويمكن استدعاؤه في كثير من الأحيان أقل في كثير من الأحيان (عادة ما يكونا أقل في كثير من الأحيان إذا كان FPS مرتفعا بما فيه الكفاية). يمكن أن تسبب هذا الحدث عدة مرات في الإطار إذا كان FPS منخفضا أو ربما ليس على الإطلاق الناجمة عن الإطارات إذا كان FPS مرتفعا. يتم حدوث جميع الحسابات المادية للمحرك وتحديثها مباشرة بعد fixforupdate (). عند استخدام حسابات الحركة داخل fixfolupdate ()، لا تحتاج إلى مضاعفة قيمتك إلى Time.deltatime. وذلك لأن fixmedupdate () يسمى من مؤقت مستقل عن تردد الإطار.
  • تحديث: التحديث () يسمى مرة واحدة لكل إطار. هذا هو الحدث الرئيسي لرسم إطار.
  • LATTUPDate: يطلق عليه LateUpdate () مرة واحدة في الإطار، بعد الانتهاء (). سيتم الانتهاء من أي حسابات يتم تنفيذها في التحديث () عند الاتصال بتوقيت التامت (). عادة ما يتعقب الاستخدام الرئيسي ل Lateupdate () غرفة طرف ثالث. إذا قمت بنقل شخصيتك في حدث التحديث الحدث ()، فيمكن إجراء حركات الكاميرا وحسابات موقعه في الحدث اللاتبي (). سوف يضمن أن الشخصية مرت تماما أمام الكاميرا، وتأمل موقعها.

تقديم المشهد (التقديم)

  • onprecull: دعا قبل تجميع المشهد على الكاميرا. تحدد الجمعية الكائنات المرئية للكاميرا. يطلق على OnPreCull فقط إذا حدث مشاهد "تقليم" من كائنات غير مرئية.
  • onbecamevisible / onbecameinvisible: اتصل عندما يصبح كائن مرئي / غير مرئي لأي كاميرا.
  • onwillrenderobject: اتصل مرة واحدة لكل كاميرا إذا كان الكائن مرئيا.
  • OnPreerender: دعا قبل أن تبدأ الكاميرا في رسم مشهد
  • onrenderobject: دعا عند رسم جميع كائنات المشهد. يمكنك استخدام وظائف GL أو Graphics.drawmeshnow التي من شأنها إنشاء رسوماتك على هذه الكاميرا.
  • OnPosTrender: دعا بعد نهاية رسم المشهد على الكاميرا.
  • onrenderimage. (الإصدار المحترف فقط): اتصل بعد رسم مشهد، لنشر الصورة على الشاشة.
  • ongui: دعا عدة مرات في الإطار استجابة لأحداث الواجهة. تتم معالجة الأحداث الترتيب وملء في المقام الأول، ثم أحداث الإدخال من لوحة المفاتيح / الماوس.
  • Ondrawgizmos: تستخدم لرسم gizmo على خشبة المسرح.

soprogram.

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

  • أثمر: ستستمر المعلمة بعد كل وظائف التحديث ()، والتي سيتم استدعاؤها في الإطار التالي.
  • العائد waitforseconds (2): تابع بعد وقت التأخير المحدد، عندما تكون كل تحديث الوظائف () تسببت بالفعل في الإطار
  • العائد waitforfixedupdate (): تواصل عندما تم بالفعل تسبب جميع وظائف Fixforupdate ()
  • العائد startcoroutine (MYFUNC): سيرفوجوجرامس الاتصالات، ستتوقع مكالمة نقل الانتهاء من وظيفة MyFunc.

تدمير الأشياء

  • ondestroy: يتم استدعاء هذه الميزة للإطار الأخير من وجود كائن (يمكن تدمير الكائن استجابة لكائن .destroy أو عند إغلاق المشهد).

عند الخروج

يتم استدعاء هذه الوظائف لجميع الكائنات النشطة في المشهد:

  • onapplicationquit: يتم استدعاء هذه الميزة لجميع كائنات اللعبة قبل إغلاق التطبيق. في المحرر، يحدث هذا عندما يتوقف المستخدم عن تشغيل PlayMode. في مشغل الويب، يحدث هذا عندما يتم إغلاق مشغل الويب.
  • ondisable: يتم استدعاء هذه الميزة عند إيقاف تشغيل الكائن أو يصبح غير نشط.

وبالتالي، عند الانتهاء، يتم استدعاء الحدث بالترتيب التالي:

  • جميع الأحداث المستيقظة
  • جميع الأحداث تبدأ
  • دورة (بخطوة في متغير Delta Time)
    • جميع ميزانات FILIVERUPDATE
    • تشغيل محرك مادي
    • onener / خروج / البقاء الأحداث الزناد
    • onenter / خروج / أحداث الاصطدام
  • تحويل جامدة، وفقا لتحويل.
  • onmousedown / onmouseup الدكتور المدخلات الأحداث
  • جميع الأحداث التحديث ()
  • الرسوم المتحركة، الخلط والتحول
  • جميع الأحداث الاطرة.
  • الرسم (التقديم)

إذا قمت بتشغيل Soprograms في Lairpdate، فسيتم استدعاؤها أيضا بعد التسعين مباشرة قبل التقديم.

يتم تنفيذ القوائم بعد جميع وظائف التحديث ().

ملاحظة. ملحق من leopotam المستخدم

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

على سبيل المثال:

ienumerator findbozons () (var isfound \u003d false؛ var collidersectionid \u003d 0؛ var collidersectioncount \u003d 10؛ بينما (! isfound) ( / / معالجة قسم واحد فقط في وقت واحد للحد من الحمل iSfound \u003d processdatafromsection (collidsectionIsicle)؛ ColliderSectionIne \u003d (collidersectionid ++)٪ collidersectionCountcount العائد عودة فارغة. في // شراء اليخوت / البواخر // soprogram ينتهي ) بداية الفراغ () (startcoroutine (findbozons ())؛)

ستحفظ آلية السوبروجرام تلقائيا حالة سياق وظيفة وظيفة الوظيفة والعودة إلى موقع المقاطعة (العائد).

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

أحداث التحديث العادي

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

تحديث VOID () (تعويم المسافة \u003d السرعة * الوقت.

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

Void InflactuPdate () (Vector3 Force \u003d Transform.Forward * DriveForce * Input.getaxis ("رأسية")؛ Rigidbody.addforce (القوة)؛)

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

الفراغ اللاتبي () (كاميرا.main.transform.lookat (الهدف.ترانفورم)؛)

أحداث التهيئة

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

واجهة المستخدم الرسومية الأحداث

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

باطل ongui () (gui.label (lameRect، "اللعبة أكثر من")؛

يمكنك أيضا تحديد أحداث الماوس التي يتم تشغيلها بواسطة GameObject ذلك في مكان الحادث. يمكن استخدام هذا لتوجيه الأدوات أو لعرض معلومات الأحرف تحت مؤشر الماوس. هناك مجموعة من وظائف الأحداث OnMouseXXX (على سبيل المثال، OnMouseover، OnMousedown)، والتي تسمح للنظام النصي بالرد على الإجراءات ذات الماوس المستخدم. على سبيل المثال، إذا تم الضغط على زر الماوس في وقت واحد عندما يكون مؤشر الماوس فوق كائن محدد، فما إذا كانت وظيفة OnMousedown موجودة في البرنامج النصي، فسوف يكون سبب ذلك.

أحداث الفيزياء

سيقوم المحرك الفعلي بالإبلاغ عن التصادم مع كائن عن طريق استدعاء وظائف الأحداث في البرنامج النصي لهذا الكائن. المهام


يوم جيد!

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

سنفكيك كل هذا العمل على مثال نظام إدارة الصوت. هذا النظام سوف تسمح لنا بتمكين / تعطيل الموسيقى والأصوات في إعدادات اللعبة.

قبل أن ننشئ مدير فئة سيدير \u200b\u200bإعدادات الصوت والموسيقى، سنقوم بإنشاء فئة متسلسلة بسيطة. سيتم استخدامه كطراز بيانات للحفظ إلى JSON.

باستخدام system.collections؛ باستخدام system.collections.genic؛ باستخدام unityengine؛ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d // audiosettingsmodel // usage النموذج الصغير للإعدادات الصوتية // // النطق // https://cdbits.net/ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AudiosettingsModelsModel (موسيقى Bool العامة \u003d صحيح؛ // العلم المسؤول عن الموسيقى Bool Sounds \u003d True؛ // العلم، المسؤول عن الأصوات)
الآن يمكنك المتابعة لكتابة مدير الفصل. سيتم تثبيتنا على المشهد الأول نفسه. سيكون هذا المدير كائن عالمي ولن يتم حذفه عند الانتقال من المشهد على المسرح.

باستخدام system.collections؛ باستخدام system.collections.genic؛ باستخدام unityengine؛ باستخدام system.io؛ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d / / Audio Manager // usage يعمل مع إعدادات الصوت // // تم تطويره بواسطة CodeBits Interactive / https://cdbits.net/ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AudiOmanager الطبقة العامة: Monobehaviour (// المعلمات العامة، مثيل AudioManager Static STATION \u003d NULL؛ // Instance Manager Public Static AudiosettingsModel الإعدادات \u003d NULL؛ // نموذج الإعدادات الصوتية سلسلة ثابتة خاصة _settings_path \u003d ""؛ // المسار إلى ملف إعدادات الصوت / / تهيئة مدير مستيقظ الفراغ () (// تعيين المسار لحفظ الإعدادات _settings_path \u003d التطبيق. persistentdatapath + "/ adiosettings.gdf"؛ // نحن نتحقق مما إذا كانت مثيلاتنا إذا لم يكن مديرنا (NULL \u003d null) (// مثيل محدد \u003d هذا؛ // اضبط الكائن الحالي في المثال) // المعلمة التي تشير إلى أنه، // ماذا هذا الكائن لا ينبغي إزالتها عند تفريغ / / مستوى dontdestroyonload (gameobject)؛ / / تهيئة إعدادات التهوية الخاصة بنا ()؛ ) // private void jicitionizedings () Manager () Manager (// // إذا لم يتم تحديد نموذج الإعدادات (الإعدادات \u003d\u003d NULL) \u003d AudiosettingsModel () جديد نموذج جديد إذا (file.exists (_settings_path)) (//\u003e إذا كان هناك ملف مع إعدادات loadsettings ()؛ // تحميل ملف إعدادات الصوت)) // تنزيل إعدادات الصوت Loadsettings العام () (سلسلة _data \u003d ملف .ReadallText (_settings_path)؛ // قراءة النص بأكمله من إعدادات الملف \u003d jsonutility.fromjson (_البيانات)؛ // deserialize it في النموذج الحالي) // حفظ إعدادات الصوت SaveSettings Public Void Savesettings () (سلسلة _json_data \u003d jsonutility.tojson (الإعدادات)؛ // تسلسل الإعدادات الحالية من ملف file.writealltext (_settings_path، _json_data)؛ // احتفظ بملفنا) // إنشاء مندوبين لحدثنا، والذي سيتم استخدامه فيما يلي // في تتبع التغييرات في إعدادات المفوض العام الصوتي باطل Void Audiosettingschanged ()؛ // إضافة حدث مندوب جديد للأحداث السقوفة السقوفة onaudiosettingschanged؛ / / قم بإنشاء حدث على ذلك // تمكين / تعطيل ToSted Togglesounds (تمكين Bool) (Settings.Sounds \u003d ممكن؛ // تغيير إعدادات الصوت في نموذج SaveSettings الحالي (_settings_path، الإعدادات)؛ // احفظ الإعدادات ifaudiosettingschanged! \u003d NULL) onaudiosettingschanged ()؛ // دعوة الحدث لدينا) // تمكين / تعطيل الموسيقى التفسيرية الفراغ العامة (الإعدادات. music \u003d ممكن؛ // تغيير إعدادات الموسيقى في نموذج SaveSettings الحالي (_settings_path، الإعدادات)؛ // حفظ ifaudiosettingschanged! \u003d null) onaudiosettingschanged ()؛ // دعوة حدثنا))
الآن أن المدير جاهز، يمكنك إنشاء كائن فارغ على مشهدك الأولي واتصل به، على سبيل المثال "_audio_manager"، بعد ذلك، أضف مديرنا الدراسي الخاص بنا. يمكنك القيام بذلك ببساطة عن طريق استدعاء قائمة إضافة مكونات على الكائن واختيار "مديري اللعبة" \u003d\u003e مدير الصوت.

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

باستخدام system.collections؛ باستخدام system.collections.genic؛ باستخدام unityengine؛ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d / / Audio muter // usage usd on / off المصادر الصوتية على الكائنات // // وضعت بواسطة codbits التفاعلية // https://cdbits.net/ // \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d AudioMuter الفئة العامة: Monobehaviour (// المعلمات العامة من مكون BOOL Public IS_MUSIC \u003d FALSE؛ // هذا العلم يجعل من الواضح أن صفنا هو ما إذا كان مفهودا هو صوت أو موسيقي. // Private Private Audiosource _as المعلمات؛ // الصوت Floatour Private _Base_Volume \u003d 1F؛ // حجم الصوت Basic Directorce // تهيئة كائن بدء Void () (/ / احصل على مكون مفصل الصوت وحجمه الأولي _as \u003d this.gameobject.getComponent. ()؛ // الحصول على المكون _base_volume \u003d _as.volume؛ // الحصول على الحجم الأساسي // هنا نضيف المستمع الذي ستنفذه الطريقة _audiosettingschanged، // عندما تم تعديل إعدادات الموسيقى / الصوت بواسطة Audioomanager.instance.onaudiosettingschaged + \u003d _Audiosettingschanged؛ // تثبيت // حسنا، وفي البداية علينا أن نتحقق الوضع الحالي الأصوات / الموسيقى _Audiosettingschanged ()؛ ) // عند تدمير كائن Void OnDestroy () كائن (Audioomanager.instance.onaudiosettingschanged - \u003d _audiosettingschanged؛ // نحن ندمر المستمع) // هذه الطريقة تستخدم لتمكين / إيقاف تشغيل / إيقاف تشغيل Vidiosource Void _AudiosettingsChanged () (If_Music) _as.volume \u003d (Audiomanager.settings.music)؟ _base_volume: 0f؛ إذا (! is_music) _as.volume \u003d (audiomanager.settings.sounds) _Base_Volume: 0F؛))
لذلك يمكننا التحكم في الصوت / الموسيقى في اللعبة. لا يقول هذا المثال في أي حال، كيف يجب أن يتم ذلك بشكل صحيح، ولكن يوضح فقط تشغيل نظام الحدث والمستمعين في وحدة Unity3D.

وأخيرا، أريد أن أتحدث عن ما استخدمناه الآن. في المثال أدناه، تم الإعلان عن مندوب تم إنشاء مستمع:

مندوب عمومي باطل صوتيشن ()؛ حدث عام صحي يسحق onaudiosgettingschased؛
يمكنك ضبط المستمع في ظروف معينة وتشبث بها طرق معينة سيتم تنفيذها عند تحقيق هذه الشروط.

وبمساعدة المندوبين، على أساس ما أنشأنا مستمعا، يمكنك إنشاء وظائف رد الاتصال. قد يكون هذا مفيدا بشكل خاص للطرق غير المتزامنة (على سبيل المثال، عند إرسال طلبات النشر غير المتزامنة).

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

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