نظام تفاعل مرن وسهل الاستخدام مع Blueprint. اكتشف الكائنات القريبة، وتنقّل بينها، وتفاعل معها فورًا أو بالضغط المطوّل، مع أحداث واجهة مستخدم مدمجة.

يمنح OmniInteraction أي Actor القدرة على العثور على الكائنات القابلة للتفاعل من حوله واستخدامها. أضِف مكوّنًا واحدًا إلى شخصيتك، وطبّق واجهة واحدة على كائناتك، لتحصل على الاكتشاف، وفحوصات خط الرؤية، وقائمة قابلة للتحديد، والتفاعل بالضغط المطوّل، وأحداث واجهة المستخدم.
OmniInteraction، ثم أعد تشغيل المحرر.Interaction System.Interactable.Interact، Get Interact Text، Get Interact Icon، Get Interaction Duration وShould Remove On Interact.Interact(Get Current Index) عند الضغط، وStop Interact عند الإفلات، وIndex Up / Down عند التمرير.طبّق IInteractable على أي Actor. جميع الدوال هي Blueprint Native Events، لذا يمكنك تنفيذها في Blueprint أو تجاوز _Implementation في C++.
| الدالة | القيمة المُرجَعة | الغرض |
|---|---|---|
Interact(Interactor) | void | يُستدعى عند نجاح التفاعل. Interactor هو مالك المكوّن. |
GetInteractText | String | التسمية المعروضة في واجهة المستخدم، مثل «التقط السيف». يتم استطلاعها في كل إطار، لذا يمكن أن تكون ديناميكية. |
GetInteractIcon | Texture2D | أيقونة اختيارية لعنصر واجهة المستخدم. |
GetInteractionDuration | float | 0 = فوري. أكبر من 0 = عدد الثواني التي يجب على اللاعب الضغط خلالها. |
ShouldRemoveOnInteract | bool | إذا كانت true، يغادر العنصر القائمة بعد تفاعل ناجح (العناصر الملتقطة، المستهلكات). |
OnHighlightStart | void | يُستدعى عندما يصبح العنصر هو المحدَّد. استخدمه للحواف المضيئة أو التوهّج. |
OnHighlightEnd | void | يُستدعى عند إلغاء تحديده أو خروجه من النطاق. |
class AMyPickup : public AActor, public IInteractable
{
GENERATED_BODY()
public:
virtual void Interact_Implementation(AActor* Interactor) override;
virtual FString GetInteractText_Implementation() override { return TEXT("Pick up"); }
virtual float GetInteractionDuration_Implementation() override { return 0.0f; }
virtual bool ShouldRemoveOnInteract_Implementation() override { return true; }
};
الفئة: UInteractionSystem (مكوّن Actor). أضِفه إلى الـ Actor الذي يقوم بالتفاعل.
| الخاصية | الافتراضي | الوصف |
|---|---|---|
InteractionRadius | 90.0 | نصف قطر الاكتشاف بوحدات Unreal. قابل للقراءة والكتابة في Blueprint. |
bWrapSelection | false | يلتف التحديد من الأخير إلى الأول (والعكس) عند التمرير. |
bShowDebugRadius | false | يرسم كرة الاكتشاف. أخضر عند الخمول، وأحمر أثناء الضغط المطوّل. |
bShowDebugState | false | يطبع الفهرس المحدَّد وقائمة العناصر وتقدّم الضغط المطوّل على الشاشة. |
| الدالة | النوع | الوصف |
|---|---|---|
Interact(Index) | Callable | تتفاعل مع العنصر عند الفهرس Index. تُنفَّذ العناصر الفورية على الفور؛ أما عناصر الضغط المطوّل فتبدأ مؤقّت الضغط. |
StopInteract | Callable | تلغي الضغط المطوّل الحالي وتعيد ضبط التقدّم. استدعِها عند تحرير الإدخال. |
IndexUp / IndexDown | Callable | تنقل التحديد وتُطلق بداية/نهاية التمييز. |
InteractAll(bOnlyInstant) | Callable | تتفاعل مع كل عنصر قريب. الافتراضي هو العناصر الفورية فقط. |
ClearAllInteractables | Callable | تمسح القائمة وتلغي أي ضغط مطوّل. |
RegisterWidgetReference(Widget) | Callable | تربط عنصر واجهة تم إنشاؤه بخانة العنصر التالي ليتمكن من إزالته بشكل صحيح لاحقًا. |
GetHoldProgress | Pure | من 0 إلى 1. اربطها بشريط تقدّم. |
GetCurrentIndex | Pure | الفهرس المحدَّد حاليًا. |
GetSelectedActor | Pure | الـ Actor المحدَّد، أو null. |
IsHoldInteractionAtIndex(Index) | Pure | تكون true إذا كان العنصر يتطلب ضغطًا مطوّلًا. |
GetUpdatedTextAtIndex(Index) | Pure | نص التفاعل الحالي لعنصر ما. |
GetDistanceToInteractable(Index) | Pure | المسافة من المالك إلى العنصر. |
اربطها في Blueprint (عبر عُقد Assign) أو في C++ باستخدام AddDynamic.
| الحدث | المعاملات | متى يُطلَق |
|---|---|---|
OnItemEntered | ItemName, ItemIcon | عند دخول كائن جديد قابل للتفاعل إلى النطاق وكونه مرئيًا. |
OnItemRemoved | WidgetRef, Index | عند خروج عنصر من النطاق أو استهلاكه. استخدمه لتدمير عنصر الواجهة. |
OnSelectionChanged | NewSelectedIndex | عند تغيّر الفهرس المحدَّد. |
OnUpdateInteractionText | Index, NewText | في كل إطار لكل عنصر، ليبقى النص الديناميكي متزامنًا. |
OnItemEntered. أنشئ عنصر الواجهة الخاص بالإدخال (الاسم + الأيقونة) وأضِفه إلى Vertical Box.RegisterWidgetReference مع عنصر الواجهة ذلك. افعل ذلك مباشرةً بعد إنشائه، بواقع عنصر واجهة واحد لكل عنصر داخل.OnItemRemoved. استدعِ Remove From Parent على WidgetRef.OnSelectionChanged لتمييز الإدخال عند NewSelectedIndex.OnUpdateInteractionText لتحديث التسمية عند Index.GetHoldProgress.bShowDebugState لترى بالضبط ما الذي يتتبّعه النظام.Interactable، وأنه داخل نصف القطر، وله تصادم يستجيب لقناة Visibility. كما أن الجدران بينك وبين الكائن ستحجبه أيضًا.Interactor هو ببساطة المالك.GetInteractionDuration. استدعِ Interact عند الضغط، وStop Interact عند الإفلات.