هوش مصنوعی در Unreal Engine 5؛ آموزش کامل MetaHuman، ML Deformer و ساخت NPC هوشمند

در این آموزش با ابزارهای هوش مصنوعی Unreal Engine 5 آشنا می‌شوید و یاد می‌گیرید چگونه MetaHuman متحرک، رفتار NPC و گفت‌وگوی پویا را با C++ و API درواره پیاده‌سازی کنید.

Share
هوش مصنوعی در Unreal Engine 5؛ آموزش کامل MetaHuman، ML Deformer و ساخت NPC هوشمند

Unreal Engine 5 فقط یک موتور بازی‌سازی نیست. این موتور برای تولید انیمیشن، جلوه‌های بصری، معماری، شبیه‌سازی، Virtual Production، طراحی خودرو، واقعیت مجازی و ساخت تجربه‌های تعاملی نیز استفاده می‌شود.

هوش مصنوعی در Unreal Engine چند مفهوم متفاوت را شامل می‌شود. بعضی ابزارها مانند Behavior Tree، State Tree، Navigation و Environment Query System رفتار شخصیت‌های بازی را کنترل می‌کنند. ابزارهایی مانند ML Deformer، MetaHuman Animator، Neural Network Engine و Learning Agents نیز از Machine Learning و شبکه‌های عصبی استفاده می‌کنند. در کنار این قابلیت‌ها، مدل‌های زبانی و چندوجهی را می‌توان از طریق API به بازی متصل کرد تا NPCها گفت‌وگوهای پویا داشته باشند، رفتار خود را توضیح دهند یا براساس وضعیت بازی پاسخ مناسب تولید کنند.

اما ساخت یک NPC هوشمند به این معنا نیست که تمام کنترل بازی را به مدل زبانی واگذار کنیم. معماری حرفه‌ای معمولاً ترکیبی است:

  • Unreal Engine حرکت، انیمیشن و قوانین بازی را کنترل می‌کند
  • Behavior Tree یا State Tree تصمیم‌های سریع و قطعی را اجرا می‌کند
  • مدل زبانی برای مکالمه، شخصیت‌پردازی و تصمیم‌های سطح بالا استفاده می‌شود
  • یک لایه اعتبارسنجی اجازه نمی‌دهد مدل هر عملی را اجرا کند

در این مقاله یاد می‌گیرید:

  • تفاوت Game AI، Machine Learning و Generative AI چیست
  • Unreal Engine چه ابزارهای هوشمندی دارد
  • چگونه MetaHuman بسازید و متحرک کنید
  • ML Deformer چگونه تغییر شکل طبیعی‌تر کاراکتر ایجاد می‌کند
  • Learning Agents چه کاربردی دارد
  • چگونه NPC را با Behavior Tree کنترل کنید
  • چگونه Unreal Engine را به API درواره متصل کنید
  • چگونه گفت‌وگوی پویا برای NPC بسازید
  • چگونه خروجی مدل را با JSON محدود کنید
  • چگونه هزینه، تأخیر و پایداری سیستم را مدیریت کنید
  • چگونه یک معماری مناسب برای بازی واقعی طراحی کنید

Unreal Engine 5 چیست؟

Unreal Engine یک موتور Real-Time سه‌بعدی است که توسط Epic Games توسعه داده می‌شود. این موتور ابزارهای متعددی برای ساخت محتوای تعاملی ارائه می‌کند:

  • Blueprint Visual Scripting
  • C++
  • Nanite
  • Lumen
  • MetaHuman
  • Niagara
  • Control Rig
  • Sequencer
  • Behavior Tree
  • State Tree
  • Environment Query System
  • Navigation System
  • Procedural Content Generation
  • Machine Learning Deformer
  • Neural Network Engine
  • Learning Agents
  • Movie Render Pipeline

در زمان نگارش این مقاله، مستندات رسمی Unreal Engine نسخه 5.7 را پوشش می‌دهند. بعضی ابزارهای یادگیری ماشین یا Python API ممکن است در وضعیت Experimental یا Beta باشند؛ بنابراین قبل از استفاده در محصول نهایی باید وضعیت همان نسخه بررسی شود.

هوش مصنوعی در Unreal Engine به چه معناست؟

عبارت «هوش مصنوعی در آنریل انجین» می‌تواند به سه دسته متفاوت اشاره کند.

هوش مصنوعی سنتی بازی

برای کنترل رفتار قابل‌پیش‌بینی شخصیت‌ها استفاده می‌شود:

  • دنبال‌کردن بازیکن
  • گشت‌زنی
  • فرار
  • انتخاب هدف
  • پناه‌گرفتن
  • جست‌وجوی مسیر
  • تغییر وضعیت
  • اجرای مأموریت

ابزارهای اصلی:

  • Behavior Tree
  • Blackboard
  • State Tree
  • AI Controller
  • Navigation Mesh
  • AI Perception
  • Environment Query System
  • Smart Objects

Machine Learning داخل موتور

برای آموزش یا اجرای مدل‌های یادگیری ماشین استفاده می‌شود:

  • Learning Agents
  • ML Deformer
  • Neural Network Engine
  • MetaHuman Animator
  • مدل‌های Neural Morph
  • اجرای بعضی مدل‌های ONNX

هوش مصنوعی مولد

معمولاً از طریق API یا سرویس بیرونی اضافه می‌شود:

  • مکالمه پویا برای NPC
  • تولید مأموریت
  • ساخت توضیحات آیتم
  • تولید Storyline
  • تحلیل رفتار بازیکن
  • تولید تصویر و تکسچر
  • تولید صدا
  • تبدیل متن به گفتار
  • ساخت Dialogue Summary
  • تولید پاسخ براساس Lore بازی

تفاوت Game AI و Generative AI

این دو مفهوم نباید به‌جای یکدیگر استفاده شوند.

ویژگیGame AIGenerative AI
زمان پاسخبسیار سریعمعمولاً کندتر
رفتارقابل‌پیش‌بینیاحتمالی
اجراداخل بازیاغلب از طریق API
هزینه هر درخواستمعمولاً نداردبراساس مصرف
مناسب برای حرکتبلهخیر
مناسب برای مسیریابیبلهخیر
مناسب برای گفت‌وگومحدودبسیار مناسب
کنترل خروجیزیادنیازمند اعتبارسنجی
وابستگی به اینترنتمعمولاً ندارددر حالت ابری دارد

بهترین معماری، ترکیب این دو است. مدل زبانی نباید در هر Frame درباره حرکت NPC تصمیم بگیرد.

آیا PCG همان هوش مصنوعی است؟

Unreal Engine دارای Procedural Content Generation Framework یا PCG است که برای تولید رویه‌ای محیط، ساختمان، پوشش گیاهی و جهان بازی استفاده می‌شود.

PCG لزوماً Machine Learning یا Generative AI نیست. این سیستم معمولاً براساس Graph، Rule، Seed و ورودی‌های هندسی کار می‌کند.

براساس مستندات رسمی Unreal Engine، PCG به هنرمندان و طراحان اجازه می‌دهد ابزارهای سریع و تکرارشونده برای تولید ساختمان، Biome یا حتی جهان‌های بزرگ ایجاد کنند.

هوش مصنوعی می‌تواند در کنار PCG برای تولید Rule، Parameter یا توضیح محیط استفاده شود، اما خود PCG یک سیستم قاعده‌محور است.

نصب Unreal Engine 5

مرحله اول: نصب Epic Games Launcher

  1. Epic Games Launcher را از وب‌سایت رسمی Epic Games دریافت کنید.
  2. Launcher را نصب کنید.
  3. وارد حساب کاربری شوید.
  4. بخش Unreal Engine را باز کنید.
  5. وارد Library شوید.
  6. نسخه پایدار موردنیاز را اضافه کنید.
  7. مسیر نصب و Componentها را انتخاب کنید.
  8. نصب را آغاز کنید.

مرحله دوم: نصب Visual Studio برای C++

اگر قصد استفاده از کد این مقاله را دارید، در Windows به Visual Studio نیاز دارید.

در Visual Studio Installer این Workload را فعال کنید:

Game development with C++

Componentهای پیشنهادی:

  • MSVC Toolchain
  • Windows SDK
  • C++ Profiling Tools
  • Visual Studio Tools for Unreal Engine
  • C++ AddressSanitizer در صورت نیاز

مرحله سوم: ساخت پروژه

در Unreal Project Browser:

  1. دسته Games را انتخاب کنید.
  2. قالب Third Person را انتخاب کنید.
  3. نوع پروژه را روی C++ قرار دهید.
  4. Target Platform را Desktop انتخاب کنید.
  5. Quality Preset را متناسب با سیستم تعیین کنید.
  6. Starter Content را در صورت نیاز فعال کنید.
  7. پروژه را ایجاد کنید.

معماری ابزارهای هوش مصنوعی Unreal Engine

یک پروژه ممکن است از این اجزا استفاده کند:

ابزاروظیفه
AI Controllerکنترل Pawn یا Character
NavMeshپیداکردن مسیر
AI Perceptionدیدن، شنیدن و تشخیص رویداد
Blackboardنگه‌داری وضعیت
Behavior Treeاجرای رفتار مرحله‌ای
State Treeمدیریت وضعیت‌های سطح بالا
EQSانتخاب بهترین موقعیت یا هدف
MetaHumanساخت انسان دیجیتال
MetaHuman Animatorساخت انیمیشن صورت
ML Deformerبهبود تغییر شکل Mesh
Learning Agentsآموزش رفتار با ML
LLM APIگفت‌وگو و استدلال سطح بالا
Structured Outputمحدودکردن پاسخ مدل
Backendنگه‌داری کلید و مدیریت درخواست

ساخت NPC ساده با Behavior Tree

قبل از اتصال مدل زبانی، بهتر است حرکت و رفتار پایه NPC را با ابزارهای داخلی Unreal Engine بسازید.

هدف نمونه:

  • NPC در محیط گشت بزند
  • بازیکن را تشخیص دهد
  • به بازیکن نزدیک شود
  • در فاصله مناسب توقف کند
  • امکان شروع مکالمه داشته باشد

مرحله اول: ساخت NavMesh

  1. در Level یک Nav Mesh Bounds Volume قرار دهید.
  2. حجم را طوری Scale کنید که فضای قابل‌حرکت را بپوشاند.
  3. کلید P را فشار دهید.
  4. سطح سبزرنگ قابل‌حرکت را بررسی کنید.

اگر سطح سبز نیست:

  • Collision کف را بررسی کنید
  • NavMesh Bounds را بزرگ‌تر کنید
  • Agent Radius و Height را کنترل کنید
  • مسیرهای باریک را اصلاح کنید

مرحله دوم: ساخت AI Controller

یک Blueprint از کلاس AIController بسازید:

BP_NPCController

در Character NPC، مقدار AI Controller Class را روی این Blueprint قرار دهید.

گزینه Auto Possess AI را متناسب با Spawn یا Placement تنظیم کنید:

Placed in World or Spawned

مرحله سوم: ساخت Blackboard

یک Blackboard بسازید:

BB_NPC

Keyهای پیشنهادی:

نامنوعکاربرد
TargetActorObjectبازیکن یا هدف
PatrolLocationVectorنقطه گشت
IsTalkingBoolوضعیت مکالمه
CanSeePlayerBoolتشخیص بازیکن
CurrentStateEnum یا Nameوضعیت فعلی

مرحله چهارم: ساخت Behavior Tree

یک Behavior Tree بسازید:

BT_NPC

ساختار پیشنهادی:

Root
└── Selector
    ├── Sequence: Talk
    ├── Sequence: Follow Player
    └── Sequence: Patrol

اولویت‌ها:

  1. اگر IsTalking=True است، NPC متوقف شود.
  2. اگر بازیکن دیده شده، NPC نزدیک شود.
  3. در غیر این صورت گشت‌زنی انجام دهد.

Behavior Tree باید مسئول حرکت و رفتار سریع باشد. مدل زبانی فقط محتوای مکالمه یا تصمیم سطح بالا را تولید کند.

AI Perception

AI Perception به NPC اجازه می‌دهد Stimulusهای مختلف را دریافت کند:

  • Sight
  • Hearing
  • Damage
  • Touch
  • Team
  • Prediction

برای تشخیص بازیکن:

  1. در AI Controller یک AI Perception Component اضافه کنید.
  2. AI Sight را فعال کنید.
  3. Sight Radius را تنظیم کنید.
  4. Lose Sight Radius را کمی بزرگ‌تر قرار دهید.
  5. Peripheral Vision Angle را تعیین کنید.
  6. بازیکن را به‌عنوان Stimuli Source معرفی کنید.
  7. رویداد Target Perception Updated را مدیریت کنید.
  8. Blackboard Key را به‌روزرسانی کنید.

State Tree چیست؟

State Tree یک سیستم Hierarchical State Machine است که ساختار State Machine و Selectorهای Behavior Tree را ترکیب می‌کند.

برای NPC مکالمه‌ای می‌توان Stateهای زیر را تعریف کرد:

  • Idle
  • Patrol
  • Suspicious
  • Following
  • Talking
  • Combat
  • Returning

مدل زبانی نباید نام State دلخواه تولید کند. پاسخ باید فقط یکی از Stateهای مجاز را برگرداند و Unreal Engine آن را اعتبارسنجی کند.

MetaHuman چیست؟

MetaHuman مجموعه ابزار Epic Games برای ساخت انسان دیجیتال واقع‌گرایانه است. در نسخه‌های جدید Unreal Engine، Workflow ساخت و استفاده از MetaHuman بیشتر در اکوسیستم خود Editor یکپارچه شده است.

قابلیت‌ها:

  • ساخت چهره
  • تنظیم بدن
  • مو و Groom
  • لباس
  • Rig صورت
  • Rig بدن
  • انیمیشن چهره
  • استفاده در Sequencer
  • اتصال Live Link
  • تولید Animation Sequence

ساخت MetaHuman

فرایند کلی ممکن است براساس نسخه تغییر کند، اما ساختار آن چنین است:

  1. Pluginهای MetaHuman موردنیاز را فعال کنید.
  2. Editor را Restart کنید.
  3. یک MetaHuman Character ایجاد یا وارد کنید.
  4. چهره، بدن، مو و لباس را تنظیم کنید.
  5. کیفیت Assembly را انتخاب کنید.
  6. Character را Assemble کنید.
  7. MetaHuman Actor را وارد Level کنید.
  8. Animation Blueprint و Control Rig را بررسی کنید.

در نسخه‌های جاری، API مربوط به MetaHuman Character و Spawn کردن MetaHuman Actor در مستندات Unreal Engine 5.7 موجود است.

MetaHuman Animator

MetaHuman Animator برای تبدیل Capture Data به انیمیشن صورت استفاده می‌شود.

منابع ورودی می‌توانند شامل مواردی مانند:

  • ویدئوی صورت
  • Footage Capture
  • Depth Data در سخت‌افزار پشتیبانی‌شده
  • اجرای ضبط‌شده بازیگر
  • Audio در Workflowهای پشتیبانی‌شده

باشند.

براساس مستندات MetaHuman Identity در Unreal Engine 5.7، سیستم می‌تواند ویژگی‌های صورت را از Capture Data رهگیری کند، Template Mesh را براساس توپولوژی MetaHuman تطبیق دهد و از خروجی برای تولید Animation Sequence استفاده کند.

Workflow انیمیشن چهره

  1. MetaHuman Character را آماده کنید.
  2. Footage یا Capture Source را وارد کنید.
  3. MetaHuman Identity بسازید.
  4. Frame مناسب برای تطبیق صورت انتخاب کنید.
  5. Markerها و Tracking را بررسی کنید.
  6. Identity را Solve کنید.
  7. MetaHuman Performance Asset بسازید.
  8. Footage یا Audio را به Performance متصل کنید.
  9. فرایند Processing را اجرا کنید.
  10. حرکت چشم و صورت را بررسی کنید.
  11. Animation را Export کنید.
  12. خروجی را در Sequencer قرار دهید.
  13. Keyهای اضافی را اصلاح کنید.

خروجی خودکار باید از نظر موارد زیر بازبینی شود:

  • حرکت لب
  • پلک
  • جهت نگاه
  • فک
  • ابرو
  • هماهنگی صدا و لب
  • لرزش‌های ریز
  • تغییرات غیرطبیعی چهره

ML Deformer چیست؟

ML Deformer از یادگیری ماشین برای تقریب تغییر شکل‌های پیچیده Mesh استفاده می‌کند. این ابزار می‌تواند تغییر شکل حاصل از Simulation یا Rig پیچیده را با یک مدل قابل‌اجرای Real-Time تقریب بزند.

کاربردها:

  • تغییر شکل عضلات
  • پوست
  • لباس
  • صورت
  • اصلاح Skinning خطی
  • انتقال Simulation باکیفیت به Runtime

براساس مستندات Unreal Engine، ML Deformer می‌تواند Rigهای پیچیده، Deformerهای غیرخطی یا تغییر شکل دلخواه را با مدلی تقریب بزند که در زمان واقعی اجرا می‌شود.

Workflow کلی ML Deformer

  1. Skeletal Mesh را آماده کنید.
  2. Animation Sequence آموزشی بسازید.
  3. Geometry Cache با تغییر شکل صحیح تهیه کنید.
  4. Pluginهای ML Deformer را فعال کنید.
  5. یک ML Deformer Asset بسازید.
  6. Skeletal Mesh را تعیین کنید.
  7. Animation و Geometry Cache متناظر را وارد کنید.
  8. مدل مناسب را انتخاب کنید.
  9. Training را اجرا کنید.
  10. Error و Heat Map را بررسی کنید.
  11. نتیجه را با Ground Truth مقایسه کنید.
  12. LOD، حافظه و Performance را کنترل کنید.
  13. ML Deformer Component را به Actor اضافه کنید.

انواع مدل ML Deformer

بسته به نسخه و Pluginهای فعال ممکن است گزینه‌هایی مانند این موارد وجود داشته باشند:

  • Neural Morph Model
  • Vertex Delta Model
  • Nearest Neighbor Model
  • Detail Pose Model

انتخاب مدل به پیچیدگی تغییر شکل، حافظه، سرعت و کیفیت موردنیاز وابسته است.

در Unreal Engine 5.7، ML Deformer Component یک Model Instance ایجاد می‌کند که ورودی‌های شبکه عصبی را آماده کرده و Inference را در Runtime اجرا می‌کند. جزئیات در API رسمی ML Deformer 5.7 موجود است.

Learning Agents چیست؟

Learning Agents یک Plugin برای آموزش Agentها با روش‌های Machine Learning است. هدف آن جایگزینی کامل Behavior Tree نیست؛ بلکه می‌تواند رفتارهایی را یاد بگیرد که تعریف دستی آن‌ها دشوار است.

کاربردهای احتمالی:

  • کنترل وسیله نقلیه
  • حرکت فیزیکی
  • رفتار کاراکتر
  • Imitation Learning
  • Reinforcement Learning
  • تست خودکار Gameplay
  • هدایت Agent در محیط
  • یادگیری کنترل پیچیده

Epic هنگام معرفی این Plugin توضیح داده بود که Learning Agents می‌تواند برای تقویت یا جایگزینی بخشی از Game AI سنتی و استفاده از Reinforcement و Imitation Learning به کار رود.

چه زمانی Learning Agents مناسب نیست؟

برای این موارد Behavior Tree یا State Tree معمولاً ساده‌تر است:

  • گشت‌زنی
  • دنبال‌کردن هدف
  • بازکردن در
  • اجرای مأموریت مشخص
  • تغییر State ساده
  • انتخاب دیالوگ ثابت

Learning Agents زمانی ارزش بیشتری دارد که نوشتن Ruleهای دستی برای رفتار موردنظر دشوار باشد.

Generative AI برای NPC

یک NPC مبتنی بر مدل زبانی می‌تواند:

  • به سؤال بازیکن پاسخ دهد
  • تاریخچه جهان بازی را توضیح دهد
  • شخصیت و لحن مشخص داشته باشد
  • اطلاعات مأموریت را براساس وضعیت بازی ارائه کند
  • مکالمه قبلی را خلاصه کند
  • احساس مناسب انتخاب کند
  • پیشنهاد تعامل بدهد
  • پاسخ را با زبان کاربر هماهنگ کند

اما مدل نباید مستقیماً:

  • آیتم دلخواه ایجاد کند
  • پول بازیکن را تغییر دهد
  • Quest را تکمیل کند
  • Actor حذف کند
  • دستور Console اجرا کند
  • فایل ذخیره را بازنویسی کند
  • State نامعتبر ایجاد کند

هر Action باید در Unreal Engine اعتبارسنجی شود.

معماری پیشنهادی NPC هوشمند

Player Input
→ Unreal Engine
→ Game Context Builder
→ Backend
→ Darvareh API
→ Structured Response
→ Validator
→ Dialogue UI / Allowed Action

Game Context Builder

فقط اطلاعات لازم را جمع‌آوری می‌کند:

  • نام NPC
  • شخصیت NPC
  • مکان فعلی
  • Quest فعال
  • رابطه با بازیکن
  • آخرین پیام‌ها
  • اطلاعات مجاز Lore

Validator

پاسخ مدل را بررسی می‌کند:

  • JSON معتبر است
  • Intent مجاز است
  • Emotion در فهرست تعریف‌شده است
  • Action مجاز است
  • متن بیش از حد طولانی نیست
  • Quest ID واقعی است
  • دستور دلخواه اجرا نمی‌شود

ساختار پاسخ پیشنهادی

به‌جای دریافت متن آزاد، پاسخ را ساختاریافته کنید:

{
  "reply": "دروازه شمالی از غروب بسته می‌شود.",
  "emotion": "serious",
  "intent": "world_information",
  "action": "none"
}

فیلدهای مجاز:

emotion

neutral
happy
sad
angry
serious
surprised

intent

greeting
quest_information
world_information
trade
farewell
unknown

action

none
open_trade_ui
show_quest_marker
end_conversation

مدل فقط Action پیشنهاد می‌دهد. Unreal Engine تصمیم نهایی را می‌گیرد.

اتصال Unreal Engine به API درواره

درواره یک API هوش مصنوعی سازگار با ساختار OpenAI ارائه می‌دهد.

آدرس پایه:

https://api.darvareh.ir/v1

Endpoint:

https://api.darvareh.ir/v1/chat/completions

مقادیر نمونه:

YOUR_DARVAREH_API_KEY
YOUR_MODEL_ID

برای مشاهده مدل‌ها، قابلیت‌ها و قیمت به‌روز به صفحه مدل‌های درواره مراجعه کنید.

ساخت Component اتصال به API

یک C++ Actor Component می‌سازیم که پیام را ارسال و پاسخ را به Blueprint تحویل دهد.

در Unreal Editor:

  1. از منوی Tools یا Add یک New C++ Class بسازید.
  2. کلاس پایه را ActorComponent انتخاب کنید.
  3. نام کلاس را قرار دهید:
DarvarehAIComponent
  1. پروژه را Compile کنید.

تنظیم Build.cs

فایل زیر را باز کنید:

Source/YourProject/YourProject.Build.cs

ماژول‌های HTTP و JSON را اضافه کنید:

PublicDependencyModuleNames.AddRange(
    new string[]
    {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "HTTP",
        "Json",
        "JsonUtilities"
    }
);

نام YourProject در پروژه شما متفاوت خواهد بود.

فایل DarvarehAIComponent.h

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "DarvarehAIComponent.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(
    FDarvarehAIResponse,
    bool,
    bSuccess,
    const FString&,
    ResponseText
);

UCLASS(
    ClassGroup=(AI),
    meta=(BlueprintSpawnableComponent)
)
class YOURPROJECT_API UDarvarehAIComponent
    : public UActorComponent
{
    GENERATED_BODY()

public:

    UDarvarehAIComponent();

    UPROPERTY(
        BlueprintAssignable,
        Category="Darvareh AI"
    )
    FDarvarehAIResponse OnResponse;

    UPROPERTY(
        EditAnywhere,
        BlueprintReadWrite,
        Category="Darvareh AI"
    )
    FString ApiKey = TEXT("YOUR_DARVAREH_API_KEY");

    UPROPERTY(
        EditAnywhere,
        BlueprintReadWrite,
        Category="Darvareh AI"
    )
    FString ModelId = TEXT("YOUR_MODEL_ID");

    UFUNCTION(
        BlueprintCallable,
        Category="Darvareh AI"
    )
    void AskAI(
        const FString& SystemPrompt,
        const FString& UserMessage
    );

private:

    void HandleResponse(
        FHttpRequestPtr Request,
        FHttpResponsePtr Response,
        bool bWasSuccessful
    );
};

عبارت زیر را با API Macro پروژه خود جایگزین کنید:

YOURPROJECT_API

برای مثال اگر پروژه SmartNPC نام دارد، ممکن است Macro به شکل زیر باشد:

SMARTNPC_API

فایل DarvarehAIComponent.cpp

#include "DarvarehAIComponent.h"

#include "HttpModule.h"
#include "Serialization/JsonReader.h"
#include "Serialization/JsonSerializer.h"
#include "Dom/JsonObject.h"

UDarvarehAIComponent::UDarvarehAIComponent()
{
    PrimaryComponentTick.bCanEverTick = false;
}

void UDarvarehAIComponent::AskAI(
    const FString& SystemPrompt,
    const FString& UserMessage
)
{
    if (ApiKey.IsEmpty() || ModelId.IsEmpty())
    {
        OnResponse.Broadcast(
            false,
            TEXT("API Key or Model ID is missing.")
        );

        return;
    }

    TSharedPtr<FJsonObject> RootObject =
        MakeShared<FJsonObject>();

    RootObject->SetStringField(
        TEXT("model"),
        ModelId
    );

    RootObject->SetNumberField(
        TEXT("temperature"),
        0.4
    );

    TArray<TSharedPtr<FJsonValue>> Messages;

    TSharedPtr<FJsonObject> SystemMessage =
        MakeShared<FJsonObject>();

    SystemMessage->SetStringField(
        TEXT("role"),
        TEXT("system")
    );

    SystemMessage->SetStringField(
        TEXT("content"),
        SystemPrompt
    );

    Messages.Add(
        MakeShared<FJsonValueObject>(SystemMessage)
    );

    TSharedPtr<FJsonObject> UserMessageObject =
        MakeShared<FJsonObject>();

    UserMessageObject->SetStringField(
        TEXT("role"),
        TEXT("user")
    );

    UserMessageObject->SetStringField(
        TEXT("content"),
        UserMessage
    );

    Messages.Add(
        MakeShared<FJsonValueObject>(UserMessageObject)
    );

    RootObject->SetArrayField(
        TEXT("messages"),
        Messages
    );

    FString RequestBody;

    TSharedRef<TJsonWriter<>> Writer =
        TJsonWriterFactory<>::Create(&RequestBody);

    FJsonSerializer::Serialize(
        RootObject.ToSharedRef(),
        Writer
    );

    TSharedRef<IHttpRequest> Request =
        FHttpModule::Get().CreateRequest();

    Request->SetURL(
        TEXT("https://api.darvareh.ir/v1/chat/completions")
    );

    Request->SetVerb(TEXT("POST"));

    Request->SetHeader(
        TEXT("Content-Type"),
        TEXT("application/json")
    );

    Request->SetHeader(
        TEXT("Authorization"),
        TEXT("Bearer ") + ApiKey
    );

    Request->SetContentAsString(RequestBody);

    Request->OnProcessRequestComplete().BindUObject(
        this,
        &UDarvarehAIComponent::HandleResponse
    );

    if (!Request->ProcessRequest())
    {
        OnResponse.Broadcast(
            false,
            TEXT("Could not start HTTP request.")
        );
    }
}

void UDarvarehAIComponent::HandleResponse(
    FHttpRequestPtr Request,
    FHttpResponsePtr Response,
    bool bWasSuccessful
)
{
    if (!bWasSuccessful || !Response.IsValid())
    {
        OnResponse.Broadcast(
            false,
            TEXT("Network request failed.")
        );

        return;
    }

    const int32 StatusCode =
        Response->GetResponseCode();

    const FString ResponseBody =
        Response->GetContentAsString();

    if (StatusCode < 200 || StatusCode >= 300)
    {
        OnResponse.Broadcast(
            false,
            FString::Printf(
                TEXT("HTTP %d: %s"),
                StatusCode,
                *ResponseBody
            )
        );

        return;
    }

    TSharedPtr<FJsonObject> RootObject;

    TSharedRef<TJsonReader<>> Reader =
        TJsonReaderFactory<>::Create(ResponseBody);

    if (!FJsonSerializer::Deserialize(
        Reader,
        RootObject
    ) || !RootObject.IsValid())
    {
        OnResponse.Broadcast(
            false,
            TEXT("Invalid JSON response.")
        );

        return;
    }

    const TArray<TSharedPtr<FJsonValue>>* Choices;

    if (!RootObject->TryGetArrayField(
        TEXT("choices"),
        Choices
    ) || Choices->Num() == 0)
    {
        OnResponse.Broadcast(
            false,
            TEXT("No choices found in response.")
        );

        return;
    }

    const TSharedPtr<FJsonObject>* ChoiceObject;

    if (!(*Choices)[0]->TryGetObject(
        ChoiceObject
    ) || !ChoiceObject->IsValid())
    {
        OnResponse.Broadcast(
            false,
            TEXT("Invalid choice object.")
        );

        return;
    }

    const TSharedPtr<FJsonObject>* MessageObject;

    if (!(*ChoiceObject)->TryGetObjectField(
        TEXT("message"),
        MessageObject
    ) || !MessageObject->IsValid())
    {
        OnResponse.Broadcast(
            false,
            TEXT("Message object is missing.")
        );

        return;
    }

    FString Content;

    if (!(*MessageObject)->TryGetStringField(
        TEXT("content"),
        Content
    ))
    {
        OnResponse.Broadcast(
            false,
            TEXT("Message content is missing.")
        );

        return;
    }

    OnResponse.Broadcast(true, Content);
}

استفاده در Blueprint

پس از Compile:

  1. Blueprint مربوط به NPC را باز کنید.
  2. روی Add Component کلیک کنید.
  3. Darvareh AI Component را اضافه کنید.
  4. در Event Graph، رویداد تعامل با بازیکن را پیدا کنید.
  5. تابع Ask AI را فراخوانی کنید.
  6. System Prompt و پیام بازیکن را وارد کنید.
  7. رویداد On Response را Bind کنید.
  8. اگر bSuccess=True بود، پاسخ را در Widget نمایش دهید.
  9. اگر false بود، پیام جایگزین نمایش دهید.

ساختار Blueprint:

Player Interact
→ Disable Input Field
→ Show Loading
→ Ask AI
→ On Response
→ Hide Loading
→ Set Dialogue Text
→ Enable Input Field

System Prompt نمونه NPC

تو نگهبان دروازه شمالی شهر آرمان هستی.

شخصیت:
- جدی اما محترم
- پاسخ‌های کوتاه
- آشنا با قوانین شهر
- نسبت به غریبه‌ها محتاط

اطلاعات مجاز:
- دروازه هنگام غروب بسته می‌شود
- بازار در میدان مرکزی قرار دارد
- بازیکن هنوز مجوز ورود شبانه ندارد

قوانین:
- اطلاعاتی خارج از Lore نساز
- حداکثر در سه جمله پاسخ بده
- اگر پاسخ را نمی‌دانی، صادقانه بگو
- دستور فنی، کد یا اطلاعات خارج از بازی ارائه نکن
- خود را مدل هوش مصنوعی معرفی نکن

پیام کاربر:

چطور می‌توانم شب وارد شهر شوم؟

افزودن Context بازی

فقط پیام بازیکن کافی نیست. وضعیت بازی را نیز ارسال کنید:

Player name: Arman
Current location: North Gate
Current time: 19:20
Reputation with guards: Neutral
Active quest: Find the missing merchant
Has night permit: false

Player message:
چطور می‌توانم شب وارد شهر شوم؟

مدل براساس این Context پاسخ دقیق‌تری تولید می‌کند.

حافظه مکالمه

برای ادامه‌دارشدن گفت‌وگو باید بخشی از تاریخچه پیام‌ها ارسال شود.

روش ساده:

  • آخرین 4 تا 10 پیام را نگه دارید
  • پیام‌های قدیمی را خلاصه کنید
  • اطلاعات ثابت NPC را در System Prompt قرار دهید
  • وضعیت بازی را هر بار تازه‌سازی کنید
  • پیام‌های غیرضروری را حذف کنید

ارسال تمام تاریخچه باعث افزایش:

  • هزینه
  • تعداد توکن
  • زمان پاسخ
  • احتمال گم‌شدن اطلاعات مهم

می‌شود.

چرا کلید API نباید در نسخه نهایی بازی باشد؟

اگر API Key را داخل بازی Package کنید، امکان استخراج آن وجود دارد. کد مستقیم مقاله برای Prototype محلی مناسب است.

معماری Production:

Game Client
→ Your Backend
→ Darvareh API

Backend باید:

  • کاربر را شناسایی کند
  • درخواست را محدود کند
  • Context را پاک‌سازی کند
  • هزینه را کنترل کند
  • API Key را نگه دارد
  • پاسخ را اعتبارسنجی کند
  • Log مناسب ثبت کند

کلید اصلی نباید به Game Client، Blueprint یا فایل Config عمومی تحویل داده شود.

خروجی JSON برای NPC

برای کنترل دقیق‌تر، System Prompt را تغییر دهید:

فقط یک JSON معتبر برگردان.

Schema:
{
  "reply": "string",
  "emotion": "neutral|happy|sad|angry|serious|surprised",
  "intent": "greeting|quest_information|world_information|trade|farewell|unknown",
  "action": "none|open_trade_ui|show_quest_marker|end_conversation"
}

قوانین:
- هیچ فیلد اضافی ایجاد نکن
- خارج از JSON چیزی ننویس
- Action فقط پیشنهاد است
- حداکثر طول reply برابر 250 کاراکتر باشد

سپس در Unreal Engine:

  1. پاسخ را Parse کنید.
  2. فیلدها را بررسی کنید.
  3. Emotion را به Animation یا Expression نگاشت کنید.
  4. Intent را برای Analytics یا Logic نگه دارید.
  5. Action را با فهرست مجاز مقایسه کنید.
  6. فقط Action تأییدشده را اجرا کنید.

نگاشت Emotion به MetaHuman

یک جدول نگاشت بسازید:

EmotionAnimation یا Control
neutralحالت عادی
happyلبخند ملایم
sadابرو و نگاه پایین
angryابرو جمع و فک محکم
seriousنگاه ثابت
surprisedچشم باز و ابرو بالا

مدل فقط نام Emotion را برمی‌گرداند. Unreal Engine Animation Asset یا Control Rig مناسب را اجرا می‌کند.

تبدیل متن پاسخ به صدا

برای ساخت NPC سخنگو، پاسخ متنی را می‌توان به مدل Text-to-Speech ارسال کرد.

Workflow:

Player Message
→ LLM Response
→ Text Validation
→ Text-to-Speech
→ Audio
→ MetaHuman Lip Sync
→ Playback

نکات مهم:

  • متن قبل از تبدیل به صدا بررسی شود
  • پاسخ کوتاه باشد
  • Audio Cache شود
  • در صورت خطا نسخه متنی نمایش داده شود
  • صدای شخصیت در تمام مکالمات ثابت بماند
  • مجوز استفاده از صدا بررسی شود

مدیریت تأخیر

درخواست API ممکن است چند صد میلی‌ثانیه تا چند ثانیه زمان ببرد. بازی نباید متوقف شود.

راهکارها:

  • درخواست Async باشد
  • Loading Indicator نمایش دهید
  • NPC یک Animation انتظار اجرا کند
  • پاسخ‌های رایج Cache شوند
  • Timeout تعریف شود
  • Fallback Dialogue داشته باشید
  • درخواست‌های هم‌زمان محدود شوند
  • پاسخ Streaming در صورت پشتیبانی استفاده شود

Fallback:

الان وقت مناسبی برای صحبت نیست. کمی بعد دوباره تلاش کن.

کاهش هزینه

برای کاهش مصرف API:

  • System Prompt را فشرده کنید
  • فقط Context ضروری را ارسال کنید
  • تاریخچه را خلاصه کنید
  • پاسخ را کوتاه بخواهید
  • سؤال‌های تکراری را Cache کنید
  • مدل مناسب هر وظیفه را انتخاب کنید
  • مکالمات ساده را با Dialogue ثابت پاسخ دهید
  • فقط در تعامل واقعی API را فراخوانی کنید

مدل زبانی نباید در Tick، Perception Update یا حرکت NPC فراخوانی شود.

معماری ترکیبی NPC

بهترین NPC معمولاً سه لایه دارد.

لایه اول: رفتار Real-Time

  • حرکت
  • نگاه
  • Animation
  • Navigation
  • Combat
  • فاصله
  • Collision

ابزار:

  • Behavior Tree
  • State Tree
  • AI Controller

لایه دوم: منطق بازی

  • Quest
  • Inventory
  • Reputation
  • Faction
  • Permission
  • Trading
  • Save Game

ابزار:

  • Blueprint
  • C++
  • Gameplay Tags
  • Data Assets

لایه سوم: هوش مصنوعی مولد

  • گفت‌وگو
  • لحن
  • خلاصه‌سازی
  • توضیح Lore
  • پیشنهاد پاسخ
  • Emotion
  • Intent

ابزار:

  • API مدل زبانی
  • Structured Output
  • Backend

تولید Asset با هوش مصنوعی برای Unreal Engine

هوش مصنوعی فقط برای NPC نیست. می‌توان از آن در Content Pipeline نیز استفاده کرد.

تولید کانسپت

برای:

  • شخصیت
  • محیط
  • سلاح
  • وسیله
  • ساختمان
  • رابط کاربری

ساخت تکسچر

برای:

  • Base Color
  • Normal
  • Roughness
  • Height
  • Mask

تولید مدل اولیه

مدل Text-to-3D یا Image-to-3D می‌تواند Blockout بسازد، اما خروجی باید از نظر توپولوژی، UV و LOD اصلاح شود.

تولید انیمیشن

مدل‌های Video-to-Motion یا Motion Generation می‌توانند حرکت اولیه بسازند. Retargeting و Foot Sliding باید بررسی شوند.

تولید صدا

برای:

  • صدای NPC
  • Ambient
  • افکت
  • موسیقی موقت
  • Prototype

پرامپت تولید کانسپت شخصیت

یک کانسپت Character Sheet برای نگهبان یک شهر فانتزی تولید کن.

مشخصات:
- مرد میانسال
- زره سبک چرمی و فلزی
- رنگ غالب قهوه‌ای تیره و برنز
- ظاهر جدی اما قابل‌اعتماد
- بدون کلاه
- تجهیزات کاربردی و قابل‌ساخت
- نمای روبه‌رو، پشت و سه‌ربع
- پس‌زمینه خنثی
- نور یکنواخت
- نسبت‌های آناتومی واقع‌گرایانه
- مناسب مدل‌سازی سه‌بعدی و ساخت کاراکتر Unreal Engine

پرامپت تحلیل Screenshot بازی

این Screenshot از یک صحنه Unreal Engine 5 است.

آن را از نظر موارد زیر بررسی کن:
1. Composition
2. Lighting
3. Lumen artifacts
4. Shadow quality
5. Material consistency
6. Texture scale
7. Nanite detail
8. Character readability
9. Visual hierarchy
10. Performance risks visible in scene
11. نشانه‌های Upscaling یا Ghosting
12. پیشنهاد سه اصلاح فوری

درباره FPS یا مصرف حافظه بدون داده Profiler ادعای قطعی نکن.

ابزارهای Profiling را فراموش نکنید

مدل بینایی نمی‌تواند جای ابزارهای اندازه‌گیری Unreal Engine را بگیرد.

برای بررسی عملکرد از ابزارهای واقعی استفاده کنید:

  • Unreal Insights
  • Stat Unit
  • Stat GPU
  • GPU Visualizer
  • Memory Insights
  • Animation Insights
  • Behavior Tree Debugger
  • Rewind Debugger

مدل هوش مصنوعی می‌تواند Log و گزارش Profiler را توضیح دهد، اما داده باید از ابزار رسمی جمع‌آوری شود.

اشتباهات رایج

استفاده از LLM برای حرکت NPC

مدل زبانی برای تصمیم‌های Frame-by-Frame مناسب نیست. Navigation و Behavior Tree را به کار ببرید.

اجرای Action بدون Validation

هیچ Action تولیدشده توسط مدل نباید مستقیماً اجرا شود.

قراردادن API Key در بازی منتشرشده

کلید باید در Backend نگه‌داری شود.

ارسال کل وضعیت بازی

فقط Context ضروری را ارسال کنید. اطلاعات داخلی و غیرضروری را حذف کنید.

انتظار پاسخ فوری

API ممکن است تأخیر داشته باشد. UI انتظار و Fallback طراحی کنید.

استفاده از ML برای مسئله ساده

اگر یک Behavior Tree کوچک مسئله را حل می‌کند، Learning Agents ممکن است پیچیدگی غیرضروری ایجاد کند.

معرفی PCG به‌عنوان Generative AI

PCG عمدتاً قاعده‌محور است، هرچند می‌توان آن را با مدل‌های مولد ترکیب کرد.

اعتماد کامل به Asset تولیدشده

مدل سه‌بعدی، تکسچر و انیمیشن تولیدشده باید از نظر فنی بررسی شوند.

چک‌لیست Production

رفتار NPC

  • حرکت با سیستم داخلی کنترل می‌شود
  • Behavior Tree یا State Tree قابل‌دیباگ است
  • Fallback Dialogue وجود دارد
  • NPC بدون اینترنت نیز حداقل رفتار پایه دارد

API

  • کلید در Backend است
  • Timeout تعریف شده است
  • Rate Limit وجود دارد
  • خطا مدیریت می‌شود
  • درخواست Async است
  • هزینه ثبت می‌شود

پاسخ مدل

  • JSON اعتبارسنجی می‌شود
  • Action محدود است
  • طول پاسخ کنترل می‌شود
  • Lore بررسی می‌شود
  • Emotion به فهرست مجاز محدود است

تجربه کاربری

  • Loading نمایش داده می‌شود
  • امکان لغو مکالمه وجود دارد
  • پاسخ دیرهنگام UI را خراب نمی‌کند
  • Subtitle در دسترس است
  • صدا و متن هماهنگ‌اند

عملکرد

  • API در Tick فراخوانی نمی‌شود
  • Audio و پاسخ‌های رایج Cache می‌شوند
  • تعداد NPCهای هم‌زمان محدود است
  • Profiler استفاده شده است
  • Memory و Network بررسی شده‌اند

پرسش‌های متداول

آیا Unreal Engine 5 هوش مصنوعی دارد؟

بله. Unreal Engine ابزارهای Game AI مانند Behavior Tree و State Tree و ابزارهای Machine Learning مانند ML Deformer، Learning Agents، MetaHuman Animator و Neural Network Engine دارد.

آیا می‌توان در Unreal Engine NPC سخنگو ساخت؟

بله. ورودی بازیکن را می‌توان به مدل زبانی فرستاد و پاسخ را در UI یا سیستم Text-to-Speech استفاده کرد.

آیا برای اتصال به مدل هوش مصنوعی به C++ نیاز داریم؟

برای Prototype می‌توان از افزونه‌ها یا Blueprintهای HTTP استفاده کرد، اما C++ کنترل و انعطاف بیشتری می‌دهد. نمونه این مقاله با C++ پیاده‌سازی شده است.

آیا API Key را می‌توان در Blueprint قرار داد؟

برای آزمایش محلی ممکن است، اما برای بازی منتشرشده مناسب نیست. کلید باید در Backend نگه‌داری شود.

آیا MetaHuman Animator از هوش مصنوعی استفاده می‌کند؟

بله. این سیستم از روش‌های پردازش و یادگیری ماشین برای حل حرکت چهره از Capture Data استفاده می‌کند.

آیا Learning Agents جایگزین Behavior Tree است؟

همیشه خیر. Learning Agents برای رفتارهای قابل‌آموزش و پیچیده مناسب است؛ Behavior Tree برای رفتارهای قاعده‌محور معمولاً ساده‌تر و قابل‌کنترل‌تر است.

تفاوت ML Deformer و MetaHuman Animator چیست؟

ML Deformer برای تقریب تغییر شکل Mesh استفاده می‌شود. MetaHuman Animator بیشتر روی تبدیل اجرای صورت به انیمیشن MetaHuman تمرکز دارد.

آیا مدل زبانی می‌تواند Quest بسازد؟

می‌تواند پیشنهاد Quest یا متن آن را تولید کند، اما Quest نهایی باید از IDها، Objectiveها و Rewardهای معتبر پروژه استفاده کند.

بهترین مدل برای NPC چیست؟

مدلی را انتخاب کنید که گفت‌وگوی مناسب، سرعت قابل‌قبول و هزینه متناسب داشته باشد. برای خروجی JSON باید توانایی پیروی از ساختار را نیز بررسی کنید. فهرست مدل‌ها در صفحه مدل‌های درواره موجود است.

آیا می‌توان از زبان فارسی برای NPC استفاده کرد؟

بله. مدل‌های زبانی مناسب می‌توانند پیام فارسی را دریافت و پاسخ فارسی تولید کنند. فونت، راست‌به‌چپ و نمایش Subtitle باید در UMG به‌درستی تنظیم شوند.

جمع‌بندی

هوش مصنوعی در Unreal Engine 5 فقط یک قابلیت نیست، بلکه مجموعه‌ای از فناوری‌ها و Workflowهای متفاوت است:

  • Behavior Tree و State Tree برای رفتار قطعی
  • AI Perception و NavMesh برای درک و حرکت
  • MetaHuman Animator برای انیمیشن چهره
  • ML Deformer برای تغییر شکل Real-Time
  • Learning Agents برای یادگیری رفتار
  • Neural Network Engine برای اجرای مدل‌های عصبی
  • مدل‌های زبانی برای مکالمه و شخصیت‌پردازی
  • مدل‌های تصویر، صدا و ویدئو برای تولید محتوا

معماری درست باید مسئولیت‌ها را تقسیم کند. حرکت، Combat، Quest و قوانین بازی باید در Unreal Engine باقی بمانند. مدل زبانی برای گفت‌وگو، Emotion، Intent و تصمیم‌های سطح بالا استفاده شود. تمام خروجی‌ها نیز باید پیش از اجرا اعتبارسنجی شوند.

برای ساخت NPC مکالمه‌ای، دستیار داخل بازی، مولد روایت یا ابزار هوشمند تولید محتوا می‌توانید از API هوش مصنوعی درواره استفاده کنید. فهرست مدل‌های موجود، قابلیت‌ها و قیمت به‌روز در صفحه مدل‌های درواره ارائه می‌شود.

مقالات مرتبط

برای مطالعه شرایط استفاده و محدودیت‌های مسئولیت، صفحه «سلب مسئولیت» را مشاهده کنید.

Read more

اتوماسیون هوش مصنوعی چیست؟ کاربردها و آموزش ساخت AI Automation

اتوماسیون هوش مصنوعی چیست؟ کاربردها و آموزش ساخت AI Automation

اتوماسیون هوش مصنوعی با ترکیب گردش‌کارهای خودکار و مدل‌های هوش مصنوعی، پردازش متن، دسته‌بندی، استخراج اطلاعات و تصمیم‌های پیشنهادی را خودکار می‌کند. در این راهنما، معماری و ساخت نمونه عملی آن با API درواره را می‌آموزید.

Agentic Commerce چیست؟ آینده خرید با ایجنت هوش مصنوعی

Agentic Commerce چیست؟ آینده خرید با ایجنت هوش مصنوعی

Agentic Commerce شیوه‌ای جدید برای خرید اینترنتی است که در آن ایجنت هوش مصنوعی می‌تواند نیاز کاربر را بفهمد، محصولات را جست‌وجو و مقایسه کند و فرایند خرید را پیش ببرد. در این راهنما با معماری، UCP، ACP و پیاده‌سازی آن با API درواره آشنا می‌شوید.