PDA

نسخه کامل مشاهده نسخه کامل : اموزش ساخت نارنجک در UDK



silsin
16-10-2011, 19:27
سلام

عادت جالب من اینه که اول تاپیک رو ایجاد می کنم و بعد توش می نویسم:31: حالا فعلا منتظر باشین
می خوام اموزش ساخت یک اسلحه نارنجک رو براتون بگم .

مواد لازم: اندر خم این اینترنت که یکمی بگردین در مورد CONTENT های UDK به موارد بسیار جالبی بر خواهید خورد . از جمله این موارد یه پکیج اسلحه مربوط به فکر کنم انریل تورنومنت یا یو دی کی نمی دونم حالا بیخیال .
یه مجموعه اسلحه هست توی نت به نام Crucible که بگردین پیداش کنین به من ربطی نداره :31:


یه نکته ای رو هم همین اول بگم اینه که شما باید با اصول طراحی اسلحه توی انریل انجین اشنا باشین وگرنه توی این قسمت با مشکل مواجه خواهید شد .
خب ادامه بدیم :

قدم اول : تنظیم فایل .uc :

ما برای ساخت این نارنجک به چهار فایل .uc احتیاج داریم

1- کلاس مربوط به بیس نارنجک ما که توی اون کد های مربوط به کنترل اسلحه ما نگه داری میشه خب شروع کنید به ساختن یه کلاس به نام RTWeap_Grenade بسازید

2-مورد دوم مربوط میشه به کلاس مربوط به تعیین میزان اسیب پذیری این نارنجک شما که توش میزان اسیب پذیری حاصل از انفجار این نارنجک رو کنترل می کنه .خب برای این یه کلاس به نام RTDmgType_Grenade بسازید .

3-کلاس مربوط به اشیائیی که می خوایم به این اسلحه مون بچسبونیم . عمرا اگه فهمیده باشین :31: خب ببینید توی خود یو دی کی وقتی شما یه اسلحه می سازید یا نه با همون اماده ش مثال میزنم فرض کنین ما یه اسلحه Link gun رو داریم . در حقیقت این اسلحه توی بازی ما دوتا حساب میشه . وقتی که برای اولین بار در حالت اول شخص این رو اجرا کنیم یه اسلحه میاد و اگه این حالت رو به سوم شخص تغییر بدین اگه توجه کنین یه اسلحه دیگه میاد . در حقیقت اینا دوتا اسلحه هستن که اولی مربوط میشه به حالت اول شخص و دومی مربوط میشه به حالت سوم شخص . ما توی این کلاس شیئ یی رو معلوم می کنیم که توی حالت دید سوم شخص خواهیم دید . امیدوارم تفهیم شده باشه :27:
اسم این کلاس رو بزارین RTAttachment_Grenade

4- واخری هم برای کنترل خاصیت projectile که فکر می کنم همتون بدونید چیه و نیازی نیست دوباره توضیح بدم .
اسم اینرو بزارین RTProj_Grenade


خب ادامه می دیم :

خب حالا باید این کلاس هایی که ایجاد کردیم رو پر کنیم .
ابتدا میریم سراغ کلاس DamageType خودمون که اسیب پذیری این یارو نارنجکه رو به وجود بیاریم .
خب حالا کلاس مربوط به DamageType خودتون رو از کلاس UTDamageType مشتق بگیرید (( extend کنید ))
و در داخل اون کد های زیر رو وارد کنید :



defaultProperties
{
GibTrail=ParticaleSystem'Envy_Effects.Tests.Effect s.P_Vehicle_Damage_1'
bSplashDamage=True
RadiusToDmgFactor=2.000000
bThrowRagdoll=True
GibPerterbation=0.150000
AlwaysGibDamageThreshold=-25
DamageWeaponClass=Class'RIFT.RTWeap_Grenade'
NodeDamageScaling=1.300000
KillStatsName="KILLS_ROCKETLAUNCHER"
DeathStatsName="DEATHS_ROCKETLAUNCHER"
SuicideStatsName="SUICIDES_ROCKETLAUNCHER"
RewardCount=15
RewardAnnouncementSwitch=10
RewardEvent="REWARD_ROCKETSCIENTIST"
bKRadialimpulse=True
KDamageImpulse=1000.000000
kDeathUpKick=200.000000
VehicleDamageScaling=0.800000
VehicleMomentumScaling=4.00000
}

خب خب اینم از این . یکمی درباره این کد ها می خوام بتوضیحم:

خب :
GibTrail=ParticaleSystem'Envy_Effects.Tests.Effect s.P_Vehicle_Damage_1'

این که کارش کاملا معلومه و نیاز به توضیح نداره

خب باز چی هست توش ؟ اها

DamageWeaponClass=Class'RIFT.RTWeap_Grenade'

منظور همون اسلحه ای هستش که این damage type به اون مربوط میشه . همون شیئ سه بعدی نارنجک


خب سه تا مورد هم اینجاست :

KillStatsName="KILLS_ROCKETLAUNCHER"
DeathStatsName="DEATHS_ROCKETLAUNCHER"
SuicideStatsName="SUICIDES_ROCKETLAUNCHER"

این سه تا برای تعیین نوع اسیب پذیرین . این بدین معناست که اسیب پذیری که این نارنجک ایجاد می کنه مثل همون شلیک راکت لانچر توی خود udk اه.

اینم هست:
RewardEvent="REWARD_ROCKETSCIENTIST"

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


اینم هست . این حرکتش جالبه :
VehicleDamageScaling=0.800000

دیدید که وقتی با یه اسلحه به ماشین توی یو دی کی شلیک می کنید ماشین تکون می خوره . این گزینه واسه تنظیم همونه .



خب صحبت اضافه بسه . بقیه اش رو اگه کسی خواست بگه تا توضیح بدم چین وگرنه مهم هاش رو گفتم .
میریم بعدی :


کلاس بعدی که ما می خوایم پر کنیم مربوط به همون شیئیه که ما می خوایم توی حالت سوم شخص ببینیم .
خب کلاس Attachment خودتون رو از کلاس UTWeaponAttachment مشتق بگیرید . و کد های زیر رو توی اون وارد کنید :




defaultProperties
{

Begin Object Name=SkeletalMeshComponent0
SkeletalMesh=SkeletalMesh'WP_Cx_Grenade.Mesh.SK_WP _Cx_Grenade_3p'
Animations=MeshSequenceA
CullDistance=5000.000000
Scale=0.200000
end object
Mesh=SkeletalMeshComponent0
WeaponClass=Class'RIFT.RTWeap_Grenade'
}

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

خب بیاین یکمی اینو توضیح بدیم .


SkeletalMesh=SkeletalMesh'WP_Cx_Grenade.Mesh.SK_WP _Cx_Grenade_3p'

خب این مربوط به نسخه سوم شخص این ابجکت نارنجکیه که ما می خوایم ببینیم . . . . .

WeaponClass=Class'RIFT.RTWeap_Grenade'

اسلحه ای که این کلاس می خواهد به ان به قول معروف بچسبد . :31:

خب اینم از این بریم سراغ کلاس سوم
حالا وقتشه که کلاس بیس مون رو تنظیم کنیم :

کلاس بیس خودتو رو باز کنید . فکر کنم کلاس اولمون بود .
داخلش اینا رو وارد کنید :


Function Float SuggestAttackStyle()
{
local float Dist;
if(!HasBotOwner() || (BotOwner. Enemy==none))

return 0.5

Dist=VSize(BotOwner.Enemy.Location-Instigator.Location);
if (Dist>2048) return 1.0;
if (Dist > 1024) return 0.3;
if (Dist < 384) return -1.0;
return -0.5;
}



Function Float SuggestDefenseStyle()
{

if (!HasBotOwner() || (BotOwner.Enemy ==None))
return 0;

if (VSize(BotOwner.Enemy.Location-instigator.Location)< 1536)
return -0.7;
return 0.0;
}


Function Byte BestMod()
{
return 0;

}



function boll ShouldFireWithoutTarget()
{

if(HasBotOwner() && (WorldInfo.TimeSeconds-BotOwner.LastSeenTime)< 3.0)
return true;

return false;

}

function float GetAIRating()
{
local float EnemyDist,Result,EnemyZ;
local vactor EnemyDir;

if(!HasBotOwner() || (BotOwner.enemy==none))

return AIRating-0.3;

EnemyDir=BotOwner.Enemy.Location-Instigator.Location;

EnemyDist=Vsize(EnemyDir);

Result=AIRating;

if( BotOwner.IsRetreating()) Result +=0.3;

else if(EnemyDist < 512) Result -=0.3;

else if((BotOwner.Enemy.Weapon !=None) &&
BotOwner.Enemy.Weapon.bMeleeWeapon) Result+=0.2;

EnemyZ=EnemyDir.Z/EnemyDist;

if (enemyZ<-0.4) Result +=EnemyZ* 0.5;

if (EnemyDist > 1500 && EnemyZ >-0.8)

Result -=((EnemyDist-1500)/2048);

if (Enemy Dist > 512 && !BotOwner.LineOfSightTo(BotOwner.Enemy))

Result +=0.2;

return Result;

}


خب خب از این خط شروع می کنم .



Function Float SuggestAttackStyle()
{
local float Dist;
if(!HasBotOwner() || (BotOwner. Enemy==none))

return 0.5

Dist=VSize(BotOwner.Enemy.Location-Instigator.Location);
if (Dist>2048) return 1.0;
if (Dist > 1024) return 0.3;
if (Dist < 384) return -1.0;
return -0.5;
}

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








Function Byte BestMod()
{
return 0;

}


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


این خط:


function boll ShouldFireWithoutTarget()
{

if(HasBotOwner() && (WorldInfo.TimeSeconds-BotOwner.LastSeenTime)< 3.0)
return true;

return false;

}

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

خب این اخری هم واسه کنترل وضعیت استفاده این توسط AI استفاده میشه



function float GetAIRating()
{
local float EnemyDist,Result,EnemyZ;
local vactor EnemyDir;

if(!HasBotOwner() || (BotOwner.enemy==none))

return AIRating-0.3;

EnemyDir=BotOwner.Enemy.Location-Instigator.Location;

EnemyDist=Vsize(EnemyDir);

Result=AIRating;

if( BotOwner.IsRetreating()) Result +=0.3;

else if(EnemyDist < 512) Result -=0.3;

else if((BotOwner.Enemy.Weapon !=None) &&
BotOwner.Enemy.Weapon.bMeleeWeapon) Result+=0.2;

EnemyZ=EnemyDir.Z/EnemyDist;

if (enemyZ<-0.4) Result +=EnemyZ* 0.5;

if (EnemyDist > 1500 && EnemyZ >-0.8)

Result -=((EnemyDist-1500)/2048);

if (Enemy Dist > 512 && !BotOwner.LineOfSightTo(BotOwner.Enemy))

Result +=0.2;

return Result;



خب خب تموم شد . فقط چندتا نکته در پایان هست که باید بگم :
1- یه سری کد هم بود که من اشاره ای بهشون نکردم . مثل قسمت defaultproperties کلاس base این نارنجک . که این قسمت رو می تونید از روی کلاس های بیس دیگر اسلحه ها تکمیل کنید

2-یه سری مسائل دیگه هم بود که سلاح ندیدم بگم یعنی خودش نیاز به یه مقاله جدا داشت که اگه وقت کنم میزارمش . مثل سیستم inventory برای ذخیره Ammo های این نارنجک چون همونجوری که می دونید این نارنجک هم یک اسلحه است و باید ammo داشته باشه . یا عوض کردن تصویر ویا ایکون این اسلحه دربازی و تعریف این اسلحه برای هنگامی که از بازی خروجی می گیریم و عیره ((البته این دومورد اخر رو راغبم که بگم اگه می خواین بگین که بگم وگرنه بیخیال))
3-اگه نکته ای بود که نا مفهوم بود و حتی اگه جایی رو من اشتباه کردم بهم بگین لطفا .

با تشکر فراوان

پایان

NINJA0098
17-10-2011, 12:51
GibTrail=ParticaleSystem'Envy_Effects.Tests.Effect s.P_Vehicle_Damage_1
حسن داداش شرمنده من نفهميدم اين چيه ... اين همون پارتيكله كه موقع انفجار اجرا ميشه؟

يه چيز ديگه اين ميزان سلامتي كه از پلير كم ميشه رو با توجه به شعاع انفجاري بر چه اساسيه؟يعني مثلتا 2048 چقدر از سلامتي كم ميكنه؟ چطور ميشه اونو تغيير داد...كلا واحد بر چه نسبتيه؟