PDA

نسخه کامل مشاهده نسخه کامل : یک مثال ساده از ساخت هوش مصنوعی در UDK



silsin
15-10-2011, 21:15
نمی دونم من چرا امروز اینقدر فعال شدم :31:

خب دوستان عزیز بریم سراغ اموزشمون :31:

یه چیزی که گفته چرا همیشه هر کسی می خواد یه مقاله یا یه اموزش بنویسه حتما باید کتابی باشه ؟ من دلم می خواد ایتجوری بنویسم هم بهتره هم خواننده ترغیب میشه تا اخرش بخونه
خب ما می خوایم چیکار کنیم / ؟ می خوایم یه تمرین ساده رو با هوش مصنوعی یو دی کی انجام بدیم . خب این هوش مصنوعی که ما می خوایم ایجاد کنیم از نوع .... از نوع . ... . ولش کن انگلیسیش رو یادم رفت ولی طوریه که شما رو دنبال میکنه یعنی مسیر حرکتش رو از زاویه دیدش و هنگامی که در دید اون قرار گرفتین تعیین می کنه . نمی دونم درسته یا نه ولی یه جا خونده بودم که اینجور سیستم هوش مصنوعی که مسیر خودش رو از اخرین مسیری که شما رفته بودین تعیین می کنه حالا نمی دونم درسته یا نه بیخیال ولش کن بریم سراغ سپلمون :


مواد لازم :

یک کلاس برای تعریف کارکتر

و دومین کلاس برای تعیین کنترل این کارکتر

خب اولین کلاس رو تشکلیل بدین »



class ZombiePawn extends UTPawn
placeable;

var Pawn P; // variable to hold the pawn we bump into

// members for the custom mesh
var SkeletalMesh defaultMesh;
var MaterialInterface defaultMaterial0;
var AnimTree defaultAnimTree;
var array<AnimSet> defaultAnimSet;
var AnimNodeSequence defaultAnimSeq;
var PhysicsAsset defaultPhysicsAsset;

simulated function SetCharacterClassFromInfo(class<UTFamilyInfo> Info)
{
Mesh.SetSkeletalMesh(defaultMesh);
Mesh.SetMaterial(0,defaultMaterial0);
Mesh.SetPhysicsAsset(defaultPhysicsAsset);
Mesh.AnimSets=defaultAnimSet;
Mesh.SetAnimTreeTemplate(defaultAnimTree);

}

simulated event Bump( Actor Other, PrimitiveComponent OtherComp, Vector HitNormal )
{
`Log("Bump");

Super.Bump( Other, OtherComp, HitNormal );

if ( (Other == None) || Other.bStatic )
return;

P = Pawn(Other); //the pawn we might have bumped into

if ( P != None) //if we hit a pawn
{
if (P.Health >1) //as long as pawns health is more than 1
{
P.Health --; // eat brains! mmmmm
}
}
}

defaultproperties
{
defaultMesh=SkeletalMesh'CH_IronGuard_Male.Mesh.SK _CH_IronGuard_MaleA'
defaultAnimTree=AnimTree'CH_AnimHuman_Tree.AT_CH_H uman'
defaultAnimSet(0)=AnimSet'CH_AnimHuman.Anims.K_Ani mHuman_BaseMale'
defaultPhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Me sh.SK_CH_Corrupt_Male_Physics'

Begin Object Name=WPawnSkeletalMeshComponent
AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_ Human'
End Object

RagdollLifespan=180.0

ControllerClass=class' ZombieBot'


}

خب یکمی در باره این توضح می دیم .این کلاسی که اینجا تشریف دارن یه سمپل از ساخت یه کارکتر زامبیه . توی بازی های مختلف دیدید که زامبی ها به محض دیدن شما به طرفتون میان . اصول کاری این هم همینجوریه . حالا بهتره یکمی در باره خطوط توضیح بدیم .

احساس می کنم که این خط یکمی نا مفهمومه واسه همین ازاینجا نشون می دم :


// members for the custom mesh
var SkeletalMesh defaultMesh;
var MaterialInterface defaultMaterial0;
var AnimTree defaultAnimTree;
var array<AnimSet> defaultAnimSet;
var AnimNodeSequence defaultAnimSeq;
var PhysicsAsset defaultPhysicsAsset;

ببینید اصول ساختاری انریل اسکریپت به این صورته که ما میایم یه سری کلاس رو از کلاس های دیگه مشتق می گیریم Extends بدین معناست که همان توابع موجود در کلاس والد به همراه تغییرات در انها و توابع و کلاس های جدید تا جایی که بتوان عمل کرد . خوشبختانه UDK توی این مورد خیلی خوب عمل کرده و خود من به شخصه برای هیچ ایده ای تا به حال مهدودیت نداشتم . خب متغییر های فوق بدین دلیل تعریف شده اند چون ما می خواهیم مقدارهای موجود رو جایگزین مقدار هایی که وجود دارن بکنیم . ((البته دلتون رو صابون نزنین که بتونین همیشه از این روش استفاده کنین برین دنبال یاد گرفتن متد های بیشتر و این رو هم بگم این کاری که من دارم می کنم یکی از روش های ساخت کارکتره و روش های بیشتری واسه این کار وجود داره که من الان دلم می خواد اینو بگم به کسی چه مربوطه؟:31:))حالا می گفتیم . این متغییر ها از اسمشون معلومه که چی هستن و نیاز به توضیح اضافه ندارن خوشبختانه :27:



simulated function SetCharacterClassFromInfo(class<UTFamilyInfo> Info)
{
Mesh.SetSkeletalMesh(defaultMesh);
Mesh.SetMaterial(0,defaultMaterial0);
Mesh.SetPhysicsAsset(defaultPhysicsAsset);
Mesh.AnimSets=defaultAnimSet;
Mesh.SetAnimTreeTemplate(defaultAnimTree);

}

خب این خط می گه که این متغییر هایی که من تعریف کردم اینجا رو برو توی فایل UTFamily Info .uc جایگزین کن . همین .


simulated event Bump( Actor Other, PrimitiveComponent OtherComp, Vector HitNormal )
{
`Log("Bump");

Super.Bump( Other, OtherComp, HitNormal );

if ( (Other == None) || Other.bStatic )
return;

P = Pawn(Other); //the pawn we might have bumped into

if ( P != None) //if we hit a pawn
{
if (P.Health >1) //as long as pawns health is more than 1
{
P.Health --; // eat brains! mmmmm
}
}
}

خب این خیلی جالبه کارش . این رو بزارین و جرات کنین برین پهلوی این جناب زامبی اونوقت کارایش واستون مشخص میشه :31:


defaultproperties
{
defaultMesh=SkeletalMesh'CH_IronGuard_Male.Mesh.SK _CH_IronGuard_MaleA'
defaultAnimTree=AnimTree'CH_AnimHuman_Tree.AT_CH_H uman'
defaultAnimSet(0)=AnimSet'CH_AnimHuman.Anims.K_Ani mHuman_BaseMale'
defaultPhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Me sh.SK_CH_Corrupt_Male_Physics'

Begin Object Name=WPawnSkeletalMeshComponent
AnimTreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_ Human'
End Object

RagdollLifespan=180.0

ControllerClass=class' ZombieBot'


}

اینم که چیز خاصی نداره . حالا شاید به نظر من اینجوریه ولی اگه چیزی بود حتما بگین .
فقط یه تعریف اینجا هست که مربوط به ControllerClass=class' ZombieBot'
که وقتی که می خواین کنترل یکی از همین کارکتر های خودتون رو بدین دست هوش مصنوعی باید کلاس مربوط به هوش مصنوعی رو اینطوری تعریف کنین
خب تا اینجا دوتا حالت پیش میاد
1- هم می تونید این کلاس رو از توی actor class بردارین بیارین بندازین توی صحنه اگه شد که مشکلی نیست و اگه نشد قسمت مربوط به pleacable ؤو پاک کنید و ایندفعه با actor factory امتحان کنید .

خب بریم سراغ کلاس مربوط به کنترل این جناب زامبی ما :31:


class ZombieBot extends GameAIController;

var Pawn thePlayer; //variable to hold the target pawn

simulated event PostBeginPlay()
{
super.PostBeginPlay();

}

event SeePlayer(Pawn SeenPlayer) //bot sees player
{
if (thePlayer ==none) //if we didnt already see a player
{
thePlayer = SeenPlayer; //make the pawn the target
GoToState('Follow'); // trigger the movement code
}
}

state Follow
{

Begin:

if (thePlayer != None) // If we seen a player
{

MoveTo(thePlayer.Location); // Move directly to the players location
GoToState('Fire'); //when we get there
}

}

state Looking
{
Begin:
if (thePlayer != None) // If we seen a player
{

MoveTo(thePlayer.Location); // Move directly to the players location
GoToState('Follow'); // when we get there
}

}

defaultproperties
{

}

خب این رو هم یکمی توضیح می دم که نگین یارو اومد همین جوری انداخت رو رفت :31:

خب توی این خط


event SeePlayer(Pawn SeenPlayer) //bot sees player
{
if (thePlayer ==none) //if we didnt already see a player
{
thePlayer = SeenPlayer; //make the pawn the target
GoToState('Follow'); // trigger the movement code
}
}

اسم تابع رو بخونین متوجه میشین . لازم نیست من کارکتر حروم کنم الکی:27:


state Follow
{

Begin:

if (thePlayer != None) // If we seen a player
{

MoveTo(thePlayer.Location); // Move directly to the players location
GoToState('Fire'); //when we get there
}

}

state Looking
{
Begin:
if (thePlayer != None) // If we seen a player
{

MoveTo(thePlayer.Location); // Move directly to the players location
GoToState('Follow'); // when we get there
}

}

خب یه موردی اینجا هست که باید توضیح بدم . توی مدل مفت خوری ببخشید :31: نه بزارین اینجوری بگم برنامه نویسی هوش مصنوعی توی یو دی کی شامل یکسری مسائل کاملا خفن ناک میشه که میشه اون رو دو دسته کرد . اولی استفاده از یک موجودیتی به نام navigation mesh که انشالله وقت کنم از این یه مثال خفن ناک میزنم و دومی مربوط میشه به path node هاو امثال اون که از قضا اسم اینگلسی این روش هم یادم رفته:31: به قول یکی از رفقای برنامه نویسم که خودش هم توی این انجمن هست روش دوم باعث میشه کارکترت خنگ به نظر بیاد حالا از حرکت های غیر عادی تا رسیدن به مسیر های دیگه بگیر تا پایین . مورد اولی که یه سیستم دقیق و عالیه شامل کلی کلاس های جور وا جور میشه ولی روش خیلی خیلی دقیقه که می تونیم ازش واسه هر کاری که دلمون می خواد استفاده کنیم (( کارایش رو به چشم دیدم و دیدیم ملت با این کارایی کردن که سازنده های Gears of ware هم نتونستن بکنن ) ) حالا جدایی اینکه این شامل obstrac mesh و navgation point و کلی چیز جور وا جور میشه ((دلیل اینکه خیلی از شرکت های ایرانی که با UDK کار میکنن و هی غر غر می کنن که این هوش مصنوعیش مشکل داره اینکه که بلد نیستن که از اینا استفاده کنن حالا غرور هم دارن نمی گن ما بلد نیستیم میگن انجین مشکل داره:27:)) مورد مفت خوری که من می گم مربوط میشه به روش اول البته فکر کنما . اره حالا که یکمی فکر می کنم می فهمم همون روش اوله. خب توی این روش یه سری STATE اماده هست که شرط هم میبندم خیلی از کسایی که در باره هوش مصنوعی یو دی کی حرف میزنن فقط از همین قسمت استفاده کردن . حالا این تکه برنامه ها شامل حالت هایی مثل flow / fire idle و غیره میشه ... یه جا هم دیده بودم که توی این لیست اماده state هایی مربوط به کاور گرفتن هم بود حالا واسه شروع استفاده از اینها خیلی خوبه ولی باید یواش یواش یاد بگیرید که از مورد اول که خیلی دقیق تره استفاده کنین .
خب خطوط کد های این بخش هم فکر کنم اونقدر واضحه که نیاز به توضیح نیست . واقعا حالا می فهمم چرا به انریل اسکریپت می گن زبان سطح بالا


خب چند تا نکته »:

1- واسه تعریف کارکتر شما علاوه بر این روش می تونید از روش تعریف معمولی ابجکت هم استفاده کنید
همون begin object خودمون

2- یه راه دیگه هم هست که بدون زحمت بیاین یه هوش مصنوعی تعریف کنین . فقط این میشه همون کارکتر هوش مصنوعی یو دی کی .
هوم . ......... نه نه ولش کن بد عادت میشین:31: اینجور کلک ها عاقبت نداره :27:

خب بیا مثل اینکه بعضی ها دارن خودشکی می کنن سر اینکه این توی فروم اپیک هست .:13: اره این توی فروم اپیک هست حوصله نداشتم تایپ کنم مستقیم کپی پست کردم اینجا . ناراحتین کلش رو پاک می کنم
پایان

anti-military
15-10-2011, 21:25
اینکه تو فروم اپیک بودش حسن . من اومدم تو تاپیک فکر کردم کامل توضیح دادی :D

silsin
15-10-2011, 21:52
اینکه تو فروم اپیک بودش حسن . من اومدم تو تاپیک فکر کردم کامل توضیح دادی :D

دو دقیقه دندون روی جیگر میزاشتی اونش رو هم می گفتم :13:

anti-military
15-10-2011, 22:44
دو دقیقه دندون روی جیگر میزاشتی اونش رو هم می گفتم :13:

خوب تقصیر خودته حسن اول اومدی فقط اون کدو گذاشتی هیچ توضیحی نذاشتی من فکر کردم همینو باید نگاه کنیم یاد بگیریم :31:

Veria70
07-11-2011, 01:11
سلام
ممنون میشم اگه توضیح بدید که اسم این فایل ها و محل قرار گرفتنشون کجاست و یه توضیح بدین که از کجا شروع کنیم برای هوش مصنوعی ممنون.

mohammadali1375
11-11-2011, 18:54
آقای سیلسین دمت گرم
ولی اگه میشه این آنریل اسکریپت رو از اول قدم به قدم یاد بده
من الان میتونم اینارو کپی کنم و یه هوش مصنوعی بسازم
ولی نمیتونم خودم تغیرات مورد نیاز رو بدم
اگه از اول شروع کنی و چند تا چیز کوچیک و در هد پایین بگی خیلی خوبه
راستی من اون 4 آموزش رو هم خوندم
خیلی خوب بود
ولی چرا ادامه ندادی تا برسی به کار عملی ؟