Documente Academic
Documente Profesional
Documente Cultură
Autor:
Profesor:
LUCRAREA DE
CURS SDA
CUPRINS
Introducere1
Interfaa UDK.............2
Geometria UDK..........4
Introducere.
Content Browser........6
ISTORIC
Unreal Engine este un motor de jocuri creat si sustinut
de compania Epic Games. Prima joaca , care a fost
creata pe motorul dat este Unreal, a aparut in 1998. Deatunci diferite versiuni ale acestui motor au fost folosite
pentru a unui numar extrem de mare de jocuri precum:
Deus Ex, Dishonored, Lineage II, Thief:Deadly Shadows,
Postel2, seriile de jocuri: Brothers in Arms, Tom Clancy's
Splinter Cell, Tom Clancy's Rainbow Six, de-asemenea si
proiectul de baza de la Epic Games - Unreal
Tournament.Chiar daca Unreal Engine era proiectat in
special pentru jocuri FPS, el este folositfoarte des si la
crearea RTS,RPG,Arcade,Racing etc.
Colizia....................9
Actor Classes.......11
Lumina......................17
Kismet.......................28
Ui.......................30
Lumina................37
Anunuri..............40
I.A........................42
CheckPoint.........44
Finisarea...................45
Visual Studio.......45
Logo....................48
Conculuzia................48
Bibliografia...............49
Interfata.
UDK are o interfata destul de comoda , unde toate tool-urile mereu
stau sub mina, ceea ce face acest motor mult mai atractiv pe fonul
altora precum CryEngine sau Unity.
Bara laterala
In fig.1 sunt prezente instrumentele de modelare a
nivelului:Geometry Mode permite de schimbat dimensiunele
brush-urile deja create, sau extinderea lor. Butonul Terrain si
Landscape deschide accesul la crearea reliefului si a terenului.
In fig.2 sunt prezente instrumentele geometrice Geometry Brush
cu ajutorul carora se creaza geometria nivelului.
In fig.3 sunt prezente posibilitatile de transformare a brush-urilor
geometrice in dependenta de ceea ce doreste utilizatorul.
In fig.4 sunt prezente posibilitatile de transformare a obiectului
geometric intr-unul de volum. (ex: pentru a crea apa, magma ,
lumina etc.)
Bara Superioara
Bara superioara contine cele mai multe butoane de pe interfata UDK, insa asta nu
trebuie as sperie, totul este foarte intuitiv si usor de folosit.
Butonul din fig.1 permite schimbarea unghiului de vizionare a nivelului in editor
(din fata , din stinga , de sus si din perspectiva) iar la dreapta de dinsul este
prezent butonul ce permite vizionarea nivelului creat in timp-direct (real-time
pentru ca toate efectele si animatiile sa functioneze)
Butoanele din fig.2 permite afisarea nivelului sub diferite forme:doar geometria,
geometria poligonala, geometria cu material fara calculul luminii si cu calculul
luminii.
Butonul din fig.3 permite vizionarea nivelului in acel mod cum el va fi privit de
catre jucator.
Butoanele din fig.4 schimba viteza de miscare a camerei in viziunea din
perspectiva.
Butoanele din fig.5 si 10 pornesc nivelul din editor, butonul 5 din fereastra de
vizionare a nivelului , iar 10 il deschide intr-o fereastra noua.
Butoanele 6,7,8 deschid:Content Browserul, Kismetul si Matinee (mai jos vor
fi explicate functia la toate acestea)
Butoanele din fig.9 ofera insturmente de redactarea a obiectelor din nivel, precum
miscarea lor, marirea,micsorarea scalara si non-scalara si rotirrea lor.
Butonul 11 aprinde sunetul din nivel in editor.
Butoanele din fig.12 sunt vital necesare deoarece ele pornesc functia de
recalcularea a nivelului:construirea obiectelor geometrice,construirea luminii
(recalcularea ei), construirea pathnod-uriloe (obiectelor de interactiune a
jucatorului si a intelegentii artificiale)
Iar butonul 13 porneste nivelul in modul final al editarii, asa cum va arata cind
proiectul va fi finisat.
Ferestrele de navigare
Geometria.
Geometria nivelului in UDK se creaza (daca nu e importat din alte programe 3D)
prin intermediul instrumentelor Brush
1.Brush cubic
2.Brush conic.
3,5,6. Brush-uri pentru scari.
4.Brush cilindric
7.Brush poligonal.
8.Brush de plan.
9.Brush sferic.
Indiferent de faptul ca sunt tocmai 9 brush-uri, ele in folosinta sunt similare.
Pentru a accesa vreun brush e nevoie de facut click pe butonul sting pe
pictograma necesara, astfel se va crea brush-ul ales de utilizator cu dimensiunele
implicite, insa pentru a oferi propriile dimensiuni , e nevoie de accesat pictograma
cu click-ul pe butonul drept.
Mai sus a fost explicat cum de consturit un contur prin Builder Brush, insa asta
inca nu e obiectul finalizat, e doar conturul lui, pentru a oferi acesuti contur careva
proprietati fizice, e nevoie de accesat una din optiunele din CSG
1.CSG Add ofera conturului nostru o forma fizica plina.
2.CSG Substract Taie dintr-un obiect deja creat fizic,
obiectul de contur (brush-ul de sus).
3.CSG Intersect Creaza un brush de contur dupa forma
intersectiei a conturului nostru cu un obiect geometric fizic, deja
creat.
4.CSG Deintersect e anapoda la optiunea precedenta, creaza
un brush de contur, fara elementele ce se interseactea cu alt obiect geometric fizi,
deja creat.
Content Browser.
Materiale
Dupa cum putem observa, uneori materialul nu se pune drept si uniform, de-aceea
apasat click drept (dintii inseram toate suprafetele) si accesam Surface
Propoerties.
10
Actor Classes
11
Din utilita Content Browser poate fi accesata fereastra Actor Classes care contine
toate obiectele interactive din Content Browser, prin Actor Classes se poate de
adaogat in proiectul nostru: arme, vehicule, jumpadu-uri, healthpack-uri, amunitie
si multe altele precum vint, sunet,apa, lumina, efecte etc.
Arme
Pentru a adaoga arme prin Actor Classes in UDK selectam
NavigationPoint>PickUpFactory>UDKPickUpFactory>UTPickUpFactory>UTWeaponL
ocker_Content
(desigur se poate deodata de ales Pickups>Weapon>UTWeaponLocker_Content ,
insa in cazul dat armele vor fi vazute doar de jucator, iar botii (inteligenta
artificiala) nu va putea interactiona cu ele , de-aceea in pirmul caz noi alegem
NavigationPoint ca I.A. al nostru sa le recunoasca.)
12
Jumpad
Jumpad-ul reprezinta o zona in care intra jucaturul si imediat este aruncat, printro sariturat in alt loc, progrmat de noi.
Pentru a adaoga un Jumpad trebuie dintii sa-l gasim in Actor Classes :
NavigationPoint>PickUpFactory>UDKPickUpFactoryUTPickUpFactory>UTP
owerPickUpFactory>UTPickUpFactory_JumpBoots
13
Pentru ca Jumpad-ul nostru sa functioneze, trebuie dintii de creat unde noi dorim
sa aterizeze jucatorul un PathNode, pentru asta e nevoie de apasat pe click
drept si alegem Add Actor>Add PathNode
Apoi intram in setarile jumpad-ului creat mai inainte (accesam meniul prin
inserarea obiectului (jumpad) si apasarea tastei F4)
Dupa inseram pathnode-ul creat si in meniul Jumpad-ului , in compartimentul
UDKJump Pad la linia Jump Target apasam pe sageata <= , astfel se va
copia numele pathnode-ului impreuna cu coordonatele sale si se va transfera la
jumpad ca acesta sa calculeze traiectoria zborului personajului.
Acum daca prsonajul se va atinge de jumpad-ul nostru, el va fi lansat in zbor spre
punctul de pathnode.
Vehicul
Vehicolele in UDK se adaoga la fel cum si obiectele de mai sus, adresa lui fiind:
NavigationPoint>UDKVehicleFactory>UTVehicleFactory>UTVehicleFactory
_Cicada [Referinta la codul sursa: UTVehicle_Cicada]
14
Teleport
Teleportul in UDK are functia de a teleporta jucatorul dintr-un punct in altul ,
indiferent daca sunt obstacole geometrice. El lucreaza dupa acelasi principiu cum
si Jumpad-ul, este nevoie de un pathnode care va fi introdus ca target (URL)
in proprietatile teleportului (F4), adresa lui fiind :
NavigationPoint>Teleporter>UDKTeleporter>UTTeleporter
15
Obiectele
Toate obiectele in UDK , indiferent daca sunt adaogate prin Content Browser sau
din Actor Classes, pot fi miscate, rotite, micsorate-marite scalar si non-scalar.
1.Pentru a misca obiectul , e nevoie doar de
facut click sting pe dinsul si va aparea axele
de miscare: XYZ.
16
Lumina.
Lumina este unul din cele mai importante elemente a unui joc, datorita luminii se
paote de creat o atmosfera macabra sau mai vesela, fara de lumina corecta
pestera nu va mai arata aidoma unei pesteri iar orasul subacvatic va fi fara de
suflet.
In UDK luminile se impart in mai multe feluri:PointLight, SpotLight,
DirectionalLight SkyLight.
1. PointLight-urile (punct de lumina) reprezinta cel mai simplu element de lumina
a carui contur de iluminare este sferic, adica nu are unghi de iluminare intern si
extern.
17
2.SpotLight (Pata de lumina) este un element mai complex de lumina, care are
traiectorie conica de iluminare , cu unghi intern si extern de iluminare.
18
19
Emisive Light
In UDK unele obiecte pot avea lumina proprieEmisive Light, ceea ce usureaza
lucrul cu nivelul. Pentru a aprinde aceasta functie, este nevoie de intrat in
optiunele obiectului si de pus bifa la Use Emisive Light
20
21
PostProcessVolume.
PostProcessVolume reprezinta o prelucrarea a luminii complexa , pentru a crea
efecte mai vii, desigur aceasta necesita mai multe resurse dar si rezultatul e mult
mai frumos.
Setarile la PostProcessVolume
22
Scene High Lights, Scene Mid Tones Lights si Scene Shadow raspund pentru
canalale de culoare RGB (Red Green Blue) pe diferite nivele, nivelul superior,
tonurile medii si al umbrelor.
Daca la Scene High Lights si mid Tones valorile apropiate de 1 ofera lumina
simpla, pai la Scene Shadow e viceversa, pentru a intelege mai bine, va propun sa
eperimentati cu valorile XYZ ca sa intelegeti cum ele schimb gama cromaticala
nivel, mai jos sunt prezentate exemplele folosite in proiectul de curs.
23
Fara PostPorcess.
24
Cu PostProcess.
High-1,1,1 Mid-0.4,0.4,0.9 Shadow-0.5,0.1,0.1
Fara PostPorcess.
25
Fara PostPorcess.
26
Fara PostPorcess.
27
Kismet
Kismet este un instrument extrem de felxibil si puternic care permite de a
programa joaca si elementele din gameplay fara de a scrie cod. Modul de lucru in
acest sistem consta in unirea a mai multor secvente functionale simple in scopul
crearii unei mai complexe. Toate secventele din Kismet sunt aranjate dupa ierarhie
si classe functionale, astfel tot de ce are nevoie un programator in Kismet e doar
logica si gindire analitica.
In compartimentul dat vor fi explicate doar functiile care au fost folosite in
proiectul de curs.
BehindView
Pentru a crea un joc de la a treea persoana e nevoie de scris o functie prin care
UDK va intelege unde se amplaseaza camera fata de jucator.
Pentru aceasta trebuie dintii de accesat World Propreties ca sa punem tipul de joc
utGame care presupune careva functii implicite pentur un joc FPS (First Person
Shooter)
28
29
Usi
Pentru a crea in Kismet o functie care sa deschida usa nu e de-ajuns doar
schemele bloc , mai e nevoie de animatia deschiderii usii, pentru asta se foloseste
instrumentul Matinee din UDK
La inceput , se creaza trebuie sa se deschida.
Dupa ce usa a fost inclusa in nivel,
ea se insereaza si se apasa clickdrept, se alege Conver>Convert to
mover.
30
Track, astfel noi am creat in librarie loc pentru animatia noastra si am definit ca e
animatie de miscare.
31
32
33
In proprietatile Play Sound , la linia Play Sound, apasind pe sageata <= vom
importa sunetul care-l vom alege in Content Browser in compartimentul Sounds.
Sunetele trebuie sa fie prezente la inceputul deschiderii usii, la sfirsitul deschiderei
usii, la inceputul inchiderii usii si la sfirsitul inchiderii usii.
Dupa acest model si schimbindu-l putin lucreaza toate usile din proiectul de curs.
34
35
36
Lumina.
Pentru a crea un punct de lumina care se aprinde prin intermediul unui buton, este
nevoie: 1.De creat un trigger care sa fie introdus in schema ksimet ca
NewEventUsingTrigger>Used, 2.De creat SpotLight sau PointLight care sa
fie Toggable(click drept pe Light-ul creat>Convert Light>Convert__Toggable
si inclus in Kismet prin click-drept New Object ____LightToggable3.De amplasat in
nivel un static mesh care sa aiba rol de buton.(Triggerul trebuie sa fie amplasat
linga Static Mesh)
37
Deodata predifinim ca trigerul nostru sa aiba Max Trigger Count=0 (ca sa poata
fi folosit de o infinitate de ori) si punem bifa la Aim To Interact pentru ca
jucatorul sa fie nevoit sa priveasca la buton cind il va folosi.
38
39
Anunturi
Anunturile se folosesc pentru a amplasa pe ecran un mesaj pentru jucator pentru
a-l informa despre ceva.
Pentru asta in Kismet e nevoie de: 1.Trigger>Touch/Used(Touch cind jucatorul
intra intr-o zona, Used atunci cind el a activat ceva) 2.Functie de anuntare.
Triggerul se amplaseaza in nivel unde doriti sa apara mesajul, apoi se introduce in
Kismet (deja stiti cum)
Functia de anuntare se creaza in Kismet: New Event>Voice
/Announcements>Play Announcement.
40
41
42
43
CheckPoint
CheckPoint-urile in jocuri reprezinta zona in care jucatorul se reintoarce dupa
moarte, ele sunt amplasate pe nivelul jocului pentur ca jucatorul sa nu reinceapa
nivelul de la capat , ci mai aproape de locul unde a murit.
In UDK checkpoint-urile la fel ca si alte functii logice se creaza prin Kismet ,
pentru asta e nevoie de: 1. Un Trigger (indiferent ce tip) , 2. O functie din
Kismet-Player Star, 3. Si un comutator (toggle).
Triggerul va reprezinta zona in care trebuie sa ajunga jucatorul ca sa-si salveze
joaca (sa se creeze checkpoint-ul), punctul de Player Start reprezinta zona de
unde va incepe utilizatorul joaca, daca va muri ne-atingind urmatorul checkpoint,
iar comutatorul deconecteaza checkpoint-ul precedent si-l include in functiune pe
acel care e legat de trigger-ul creat mai sus.
Schema in Kismet arata astfel:
In proprietate la Trigger se
indicaMax Trigger
Count-1 daca
checkpoint-ul se va
aprinde odata (in cazul de
jocuri de tip coridor) sau 0
ca el sa poate fi reaprins in
cazaul jocurilor cu
deplasare deschisa in
lume.
44
Finisarea.
Dupa ce am creat nivelul, cu toate elementele sale, l-am setat, e nevoie sa
arhivam tot proiectul intr-un install, pentru aceasta folosim programara ce vine
impreuna cu UDK , Frontend.
Visual Studio
Pentru a personaliza proiectul de curs , eu am folosit Visual Studio pentru a crea
un launcher, in care am programt functia de deschidere a jocului, iesirea din
launcher si un meniu de setare a proprietatilor grafice de pornire a jocului:
Resolution Ambient Oclusion Motion Blur.
45
Codul:
Public Class MainForm
Private Sub SettingsBtn_Click(sender As System.Object, e As System.EventArgs) Handles
SettingsBtn.Click
SettingsForm.ShowDialog()
End Sub
Private Sub StartBtn_Click(sender As System.Object, e As System.EventArgs) Handles
StartBtn.Click
Try
Shell(Application.StartupPath & "\Binaries\Win32\UDK.exe")
Me.Close()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
Me.Close()
End Try
End Sub
46
47
Logo
E cert ca fiecare joaca trebuie sa aiba semnul ei , ce o va defini, un logou si
denumire: PROJECT Maricha.
(Logo-ul a fost creat impreuna cu Cotofana Leonid, coleg de grupa si simplu bun
prieten).
Concluzia.
48
Programatorii de le Epic Games in opinia mea au creat unul din cele mai
bune instrumente (motor de joc) pentru crearea diferitor proiecte, UDK se
evidentiaza extrem de mult pe fonul altor motoare precum: Unity3D, CryEngine
sau GameMaker prin aceea ca el este mult mai performant, codul este generat in
timp direct cind utilizatorul face modificari in proiect, nu este nevoie obligatorie ,
desi e binevenit, cunostinta unui limbaj la perfectiune ( UDK foloseste Uscript ,
bazat pe C,C++,Java)- ceea ce e total diferit de Unity3D, posibilitatea de
importare a proiectelor grafice, sunetelor, modelelor , animatiilor, efectelor din alte
programe , precum 3DsMax, Maya, zBrush etc.
Crearea proiectului in UDK necesita cel mai mult de imaginatie si logica
foarte buna, insa are si careva ne-ajunsuri, in primul rind , comparativ cu Unity si
GameMaker el este mai complex, asta nu inseamna ca e mult mai greu de inteles,
ba dincontra el e destul de intuitiv, insa are atitea posibilitati pe care utilizatorul le
doreste sa implementeze in proiect incit el se zapaceste, deci primul minus consta
in aceea ca e nevoie de o echipa intreaga de oameni , unde fiecare trebuie sa-si
stie lucrul sau(Landscape-ul, Lumina, Geometria nivelului, I.A. etc.)
Al doilea minus consta in optimizarea rea cu Windows 8 si 8.1 , intrucit am
intilnit numeroase crash-uri, insa aceasta cu timpul se va rezolva, mai mult ca atit,
degraba va aparea UDK si la Linux , unde se preconizeaza ca totul va lucra mult
mai stabil.
In fine as dori sa ma repet ca UDK e un insturment perfect pentru o echipa de
oameni cu initiativa si inspiratie de a crea o joaca de nivel destul de inalt.
Bibliografia.
Pentru crearea acestui proiect de curs, am folosit cunostintele obtinute din
documentatia oficiala a UDK-ului , de pe site-ul sau oficial:
https://www.unrealengine.com/products/udk/documentation
Si din lectiile video de pe Youtube a lui SneakyJoes Russian Salad:
https://www.youtube.com/watch?v=7vDbqQxhJ2s&list=PL8kfl_eyvRGTUtrhLMQF1
9V1Pgktc_SIy
49
B = UTBot(Instigator.Controller);
if ( (B == None) || (B.Enemy == None) || Pawn(B.Focus) == None )
return AIRating;
50
if ( bWaitForCombo )
return 1.5;
if ( !B.ProficientWithWeapon() )
return AIRating;
if ( B.Stopped() )
{
if ( !B.LineOfSightTo(B.Enemy) && (VSize(B.Enemy.Location Instigator.Location) < 5000) )
return (AIRating + 0.5);
return (AIRating + 0.3);
}
else if ( VSize(B.Enemy.Location - Instigator.Location) > 1600 )
return (AIRating + 0.1);
else if ( B.Enemy.Location.Z > B.Location.Z + 200 )
return (AIRating + 0.15);
return AIRating;
}
/**
* Overriden to use GetPhysicalFireStartLoc() instead of
Instigator.GetWeaponStartTraceLocation()
* @returns position of trace start for instantfire()
*/
simulated function vector InstantFireStartTrace()
51
return GetPhysicalFireStartLoc();
}
function SetComboTarget(UTProj_ShockBall S)
{
if ( !bRegisterTarget || (UTBot(Instigator.Controller) == None) ||
(Instigator.Controller.Enemy == None) )
return;
bRegisterTarget = false;
bWaitForCombo = true;
ComboStart = Instigator.Location;
ComboTarget = S;
ComboTarget.Monitor(UTBot(Instigator.Controller).Enemy);
}
B = UTBot(Instigator.Controller);
if ( (B == None) || (B.Enemy == None) )
return 0;
if ( B.CanComboMoving() )
52
return 0;
function DoCombo()
{
53
if ( bWaitForCombo )
{
bWaitForCombo = false;
if ( (Instigator != None) && (Instigator.Weapon == self) )
{
StartFire(0);
}
}
}
function ClearCombo()
{
ComboTarget = None;
bWaitForCombo = false;
}
/* BestMode()
choose between regular or alt-fire
*/
function byte BestMode()
{
local float EnemyDist;
local UTBot B;
54
bWaitForCombo = false;
B = UTBot(Instigator.Controller);
if ( (B == None) || (B.Enemy == None) )
return 0;
if (B.IsShootingObjective())
return 0;
if ( !B.LineOfSightTo(B.Enemy) )
{
if ( (ComboTarget != None) && !ComboTarget.bDeleteMe &&
B.CanCombo() )
{
bWaitForCombo = true;
return 0;
}
ComboTarget = None;
if ( B.CanCombo() && B.ProficientWithWeapon() )
{
bRegisterTarget = true;
return 1;
}
return 0;
}
55
ComboTarget = None;
56
p = Super.ProjectileFire();
if (UTProj_ShockBall(p) != None)
{
SetComboTarget(UTProj_ShockBall(P));
}
return p;
}
57
return Super.GetAdjustedAim(StartFireLoc);
}
58
{
if ( (ComboTarget == None) || ComboTarget.bDeleteMe )
bWaitForCombo = false;
else
{
StopFire(CurrentFireMode);
GotoState('Active');
return;
}
}
Super.RefireCheckTimer();
}
}
59
{
local byte NewFireMode;
if( Instigator != None )
{
if (bWasACombo)
{
NewFireMode = 3;
}
else
{
NewFireMode = CurrentFireMode;
}
Instigator.SetFlashLocation( Self, NewFireMode , HitLocation );
}
}
60
if ( !bWasACombo )
{
NewPath = Rand(3);
if (NewPath == CurrentPath)
{
NewPath++;
}
CurrentPath = NewPath % 3;
PathValues[CurrentPath % 3] = 1.0;
PSC.SetFloatParameter('Path1',PathValues[0]);
PSC.SetFloatParameter('Path2',PathValues[1]);
PSC.SetFloatParameter('Path3',PathValues[2]);
}
else
{
PSC.SetFloatParameter('Path1',1.0);
PSC.SetFloatParameter('Path2',1.0);
PSC.SetFloatParameter('Path3',1.0);
}
}
else
{
PSC.SetFloatParameter('Path1',0.0);
PSC.SetFloatParameter('Path2',0.0);
61
PSC.SetFloatParameter('Path3',0.0);
defaultproperties
{
// Weapon SkeletalMesh
Begin Object class=AnimNodeSequence Name=MeshSequenceA
End Object
// Weapon SkeletalMesh
Begin Object Name=FirstPersonMesh
62
SkeletalMesh=SkeletalMesh'WP_ShockRifle.Mesh.SK_WP_ShockRifle_1P'
AnimSets(0)=AnimSet'WP_ShockRifle.Anim.K_WP_ShockRifle_1P_Base'
Animations=MeshSequenceA
Rotation=(Yaw=-16384)
FOV=60.0
End Object
AttachmentClass=class'UTGameContent.UTAttachment_ShockRifle'
SkeletalMesh=SkeletalMesh'WP_ShockRifle.Mesh.SK_WP_ShockRifle_3P'
End Object
InstantHitMomentum(0)=+60000.0
WeaponFireTypes(0)=EWFT_InstantHit
WeaponFireTypes(1)=EWFT_Projectile
WeaponProjectiles(1)=class'UTProj_ShockBall'
InstantHitDamage(0)=45
FireInterval(0)=+0.77
FireInterval(1)=+0.6
63
InstantHitDamageTypes(0)=class'UTDmgType_ShockPrimary'
InstantHitDamageTypes(1)=None
WeaponFireSnd[0]=SoundCue'A_Weapon_ShockRifle.Cue.A_Weapon_SR_Fir
eCue'
WeaponFireSnd[1]=SoundCue'A_Weapon_ShockRifle.Cue.A_Weapon_SR_Alt
FireCue'
WeaponEquipSnd=SoundCue'A_Weapon_ShockRifle.Cue.A_Weapon_SR_Rais
eCue'
WeaponPutDownSnd=SoundCue'A_Weapon_ShockRifle.Cue.A_Weapon_SR_
LowerCue'
PickupSound=SoundCue'A_Pickups.Weapons.Cue.A_Pickup_Weapons_Shock
_Cue'
MaxDesireability=0.65
AIRating=0.65
CurrentRating=0.65
bInstantHit=true
bSplashJump=false
bRecommendSplashDamage=false
bSniping=true
ShouldFireOnRelease(0)=0
ShouldFireOnRelease(1)=1
ShotCost(0)=1
ShotCost(1)=1
64
FireOffset=(X=20,Y=5)
PlayerViewOffset=(X=17,Y=10.0,Z=-8.0)
AmmoCount=20
LockerAmmoCount=20
MaxAmmoCount=40
FireCameraAnim(1)=CameraAnim'Camera_FX.ShockRifle.C_WP_ShockRifle_
Alt_Fire_Shake'
WeaponFireAnim(1)=WeaponAltFire
MuzzleFlashSocket=MF
MuzzleFlashPSCTemplate=WP_ShockRifle.Particles.P_ShockRifle_MF_Alt
MuzzleFlashAltPSCTemplate=WP_ShockRifle.Particles.P_ShockRifle_MF_Alt
MuzzleFlashColor=(R=200,G=120,B=255,A=255)
MuzzleFlashDuration=0.33
MuzzleFlashLightClass=class'UTGame.UTShockMuzzleFlashLight'
CrossHairCoordinates=(U=256,V=0,UL=64,VL=64)
LockerRotation=(Pitch=32768,Roll=16384)
IconCoordinates=(U=728,V=382,UL=162,VL=45)
WeaponColor=(R=160,G=0,B=255,A=255)
InventoryGroup=4
65
GroupWeight=0.5
IconX=400
IconY=129
IconWidth=22
IconHeight=48
Samples(0)=(LeftAmplitude=90,RightAmplitude=40,LeftFunction=WF_Const
ant,RightFunction=WF_LinearDecreasing,Duration=0.1200)
End Object
WeaponFireWaveForm=ForceFeedbackWaveformShooting1
}
Referinta:Codul sursa UTTeleport
/**
* Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
*/
66
/**
* The base of the teleporter. We hold a reference to it so that
* it gets serialized to disk, and so we can statically light it.
*/
var() StaticMeshComponent TeleporterBaseMesh;
SceneCapture2DComponent(PortalCaptureComponent).SetCaptureParameter
s(TextureTarget);
SceneCapture2DComponent(PortalCaptureComponent).SetView(Dest.Locatio
n + vector(Dest.Rotation) * 15.0, Dest.Rotation);
PortalEffect.SetMaterialParameter('Portal', PortalMaterialInstance);
}
}
defaultproperties
{
Components.Remove(Sprite)
67
TeleportingSound=SoundCue'A_Gameplay.Portal.Portal_WalkThrough01Cue'
68
StaticMesh=StaticMesh'Pickups.Base_Powerup.Mesh.S_Pickups_Base_Power
up01'
Translation=(X=0.0,Y=0.0,Z=-30.0)
CollideActors=true
BlockActors=true
CastShadow=true
bCastDynamicShadow=false
bForceDirectLightMap=true
LightingChannels=(BSP=TRUE,Dynamic=FALSE,Static=TRUE,CompositeDyna
mic=TRUE)
Scale=1.25
BlockNonZeroExtent=false
End Object
Components.Add(StaticMeshComponent0)
TeleporterBaseMesh=StaticMeshComponent0
Template=ParticleSystem'Pickups.Base_Teleporter.Effects.P_Pickups_Telepo
rter_Base_Idle'
End Object
Components.Add(ParticleSystemComponent0)
69
Template=ParticleSystem'Pickups.Base_Teleporter.Effects.P_Pickups_Telepo
rter_Idle'
End Object
Components.Add(ParticleSystemComponent1)
PortalEffect=ParticleSystemComponent1
PortalMaterial=MaterialInterface'Pickups.Base_Teleporter.Material.M_T_Picku
ps_Teleporter_Portal_Destination'
}
Referinta: Codul sursa UTVehicle_Cicada
/**
* Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
*/
if (Mesh != None)
{
70
JetControl =
UTSkelControl_JetThruster(Mesh.FindSkelControl('CicadaJet'));
}
}
function IncomingMissile(Projectile P)
{
local UTVWeap_CicadaTurret Turret;
Super.IncomingMissile(P);
}
defaultproperties
{
Begin Object Name=CollisionCylinder
71
CollisionHeight=+70.0
CollisionRadius=+240.0
Translation=(X=-40.0,Y=0.0,Z=40.0)
End Object
DrawScale=1.3
Health=500
BigExplosionTemplates[0]=(Template=ParticleSystem'Envy_Effects.VH_Deat
hs.P_VH_Death_SMALL_Far',MinDistance=350)
BigExplosionTemplates[1]=(Template=ParticleSystem'Envy_Effects.VH_Deat
hs.P_VH_Death_SMALL_Near')
BigExplosionSocket=VH_Death
Seats.Empty
Seats(0)={(
GunClass=class'UTVWeap_CicadaMissileLauncher',
GunSocket=(Gun_Socket_02,Gun_Socket_01),
CameraTag=ViewSocket,
72
TurretControls=(LauncherA,LauncherB),
CameraOffset=-400,
CameraBaseOffset=(Z=25.0),
SeatIconPos=(X=0.48,Y=0.25),
GunPivotPoints=(Main),
WeaponEffects=((SocketName=Gun_Socket_01,Offset=(X=80),Scale3D=(X=12.0,Y=15.0,Z=15.0)),(SocketName=Gun_Socket_02,Offset=(X
=-80),Scale3D=(X=12.0,Y=15.0,Z=15.0)))
)}
Seats(1)={(
GunClass=class'UTVWeap_CicadaTurret',
GunSocket=(Turret_Gun_Socket_01,Turret_Gun_Socket_02,Turret_Gun_So
cket_03,Turret_Gun_Socket_04),
TurretVarPrefix="Turret",
TurretControls=(Turret_Rotate),
CameraTag=Turret_ViewSocket,
CameraOffset=0,
GunPivotPoints=(MainTurret_Pitch),
CameraEyeHeight=0,
SeatIconPos=(X=0.48,Y=0.56),
ViewPitchMin=-14000.0,
ViewPitchMax=1.0,
WeaponEffects=((SocketName=Turret_Gun_Socket_04,Offset=(X=80),Scale3D=(X=8.0,Y=10.0,Z=10.0)),(SocketName=Turret_Gun_Socket_03,Offs
et=(X=-80),Scale3D=(X=8.0,Y=10.0,Z=10.0)))
73
)}
TurretBeamTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_2ndPr
im_Beam'
VehicleEffects.Empty
VehicleEffects(0)=(EffectStartTag=TurretWeapon00,EffectEndTag=STOP_Tur
retWeapon00,EffectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_2nd
AltFlash',EffectSocket=Turret_Gun_Socket_01)
VehicleEffects(1)=(EffectStartTag=TurretWeapon01,EffectEndTag=STOP_Tur
retWeapon01,EffectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_2nd
AltFlash',EffectSocket=Turret_Gun_Socket_02)
VehicleEffects(2)=(EffectStartTag=TurretWeapon02,EffectEndTag=STOP_Tur
retWeapon02,EffectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_2nd
AltFlash',EffectSocket=Turret_Gun_Socket_03)
VehicleEffects(3)=(EffectStartTag=TurretWeapon03,EffectEndTag=STOP_Tur
retWeapon03,EffectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_2nd
AltFlash',EffectSocket=Turret_Gun_Socket_04)
VehicleEffects(4)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,Eff
ectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_GroundEffect',Effect
Socket=GroundEffectBase)
VehicleEffects(5)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,Eff
ectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_Exhaust',EffectSocke
t=LeftExhaust)
VehicleEffects(6)=(EffectStartTag=EngineStart,EffectEndTag=EngineStop,Eff
ectTemplate=ParticleSystem'VH_Cicada.Effects.P_VH_Cicada_Exhaust',EffectSocke
t=RightExhaust)
74
VehicleEffects(7)=(EffectStartTag=DamageSmoke,EffectEndTag=NoDamage
Smoke,bRestartRunning=false,EffectTemplate=ParticleSystem'Envy_Effects.Vehicl
e_Damage.P_Vehicle_Damage_1_Cicada',EffectSocket=DamageSmoke_01)
VehicleAnims(0)=(AnimTag=Created,AnimSeqs=(InActiveStill),AnimRate=1.
0,bAnimLoopLastSeq=false,AnimPlayerName=CicadaPlayer)
VehicleAnims(1)=(AnimTag=EngineStart,AnimSeqs=(GetIn),AnimRate=1.0,
bAnimLoopLastSeq=false,AnimPlayerName=CicadaPlayer)
VehicleAnims(2)=(AnimTag=Idle,AnimSeqs=(Idle),AnimRate=1.0,bAnimLoo
pLastSeq=true,AnimPlayerName=CicadaPlayer)
VehicleAnims(3)=(AnimTag=EngineStop,AnimSeqs=(GetOut),AnimRate=1.0
,bAnimLoopLastSeq=false,AnimPlayerName=CicadaPlayer)
JetEffectIndices=(11,12)
ContrailEffectIndices=(2,3,4,5,13,14)
GroundEffectIndices=(10)
// Sounds
// Engine sound.
Begin Object Class=AudioComponent Name=RaptorEngineSound
SoundCue=SoundCue'A_Vehicle_Cicada.SoundCues.A_Vehicle_Cicada_Engin
eLoop'
End Object
EngineSound=RaptorEngineSound
Components.Add(RaptorEngineSound);
75
CollisionSound=SoundCue'A_Vehicle_Cicada.SoundCues.A_Vehicle_Cicada_C
ollide'
EnterVehicleSound=SoundCue'A_Vehicle_Cicada.SoundCues.A_Vehicle_Cica
da_Start'
ExitVehicleSound=SoundCue'A_Vehicle_Cicada.SoundCues.A_Vehicle_Cicada
_Stop'
// Scrape sound.
Begin Object Class=AudioComponent Name=BaseScrapeSound
SoundCue=SoundCue'A_Gameplay.A_Gameplay_Onslaught_MetalScrape01C
ue'
End Object
ScrapeSound=BaseScrapeSound
Components.Add(BaseScrapeSound);
IconCoords=(U=988,V=0,UL=33,VL=42)
ExplosionSound=SoundCue'A_Vehicle_Cicada.SoundCues.A_Vehicle_Cicada_
Explode'
JetScalingParam=JetScale
76
PassengerTeamBeaconOffset=(X=-125.0f,Y=0.0f,Z=-105.0f);
ReferenceMovementMesh=StaticMesh'Envy_Effects.Mesh.S_Air_Wind_Ball'
HudCoords=(U=106,V=125,UL=-106,VL=124)
TeamMaterials[0]=MaterialInstanceConstant'VH_Cicada.Materials.MI_VH_Cic
ada_Red'
TeamMaterials[1]=MaterialInstanceConstant'VH_Cicada.Materials.MI_VH_Cic
ada_Blue'
BurnOutMaterial[0]=MaterialInterface'VH_Cicada.Materials.MITV_VH_Cicada
_Red_BO'
BurnOutMaterial[1]=MaterialInterface'VH_Cicada.Materials.MITV_VH_Cicada
_Blue_BO'
SpawnMaterialLists[0]=(Materials=(MaterialInterface'VH_Cicada.Materials.MI
_VH_Cicada_Spawn_Red'))
SpawnMaterialLists[1]=(Materials=(MaterialInterface'VH_Cicada.Materials.MI
_VH_Cicada_Spawn_Blue'))
DamageMorphTargets(0)=(InfluenceBone=Lt_Gun_Yaw,MorphNodeName=n
one,Health=150,DamagePropNames=(Damage2))
DamageMorphTargets(1)=(InfluenceBone=Rt_Gun_Yaw,MorphNodeName=n
one,Health=150,DamagePropNames=(Damage2))
DamageMorphTargets(2)=(InfluenceBone=FrontGuardDamage,MorphNodeN
ame=none,Health=150,DamagePropNames=(Damage1))
DamageMorphTargets(3)=(InfluenceBone=MainTurret_Yaw,MorphNodeName
=none,Health=150,DamagePropNames=(Damage3))
DamageParamScaleLevels(0)=(DamageParamName=Damage1,Scale=3)
77
DamageParamScaleLevels(1)=(DamageParamName=Damage2,Scale=1.5)
DamageParamScaleLevels(2)=(DamageParamName=Damage3,Scale=2.5)
DrivingPhysicalMaterial=PhysicalMaterial'VH_Cicada.materials.physmat_Cica
da_driving'
DefaultPhysicalMaterial=PhysicalMaterial'VH_Cicada.materials.physmat_Cica
da'
bHasEnemyVehicleSound=true
EnemyVehicleSound(0)=SoundNodeWave'A_Character_IGMale.BotStatus.A_
BotStatus_IGMale_EnemyCicada'
}
P.S. Codul sursa la toate obiectele dinjoc, sunt prezente in mapa cu raport
ObjectScript
78