Nicht eingeloggt
Registrieren

Eine Assault Map erstellen

Tutorial Assault

Einführung:
In diesem Tutorial werde ich erklären wie man AssaultMaps erstellt. (Editor 3.0)
Man sollte schon einige Vorkenntnisse von dem Editor haben! Siehe dazu das Einsteiger Tutorial.
Außerdem wäre es bestimmt eine Hilfe, wenn man den Editor gleich offen hält, um die hier genannten Dinge gleich umzusetzen.

Vorbereitung:
Zuerst braucht ihr eine Map, die für eine Assaultmap geeignet ist. Beispielsweise ein längliche Map, bei der sich die Angreifer durch einige Gänge kämpfen müssen, aber das ist jedem selbst überlassen.
Außerdem müsst ihr den Gametyp ändern: UT2k4Assault.ASGameInfo
Ihr solltet euch das ganze Tutorial durchlesen, weil mache Sachen woanders erklärt werden, weil sie zu zwei Themen gehören!
Jetzt könnt ihr eigentlich schon loslegen!

Die verschieden Objekte:
Es gibt folgende Objekte:
1. Das Objekt, bei dem man sich neben einen Hebel oder Ähnliches stellen muss und einige Sekunden dort stehen bleiben, um das Ziel zu erfüllen. (Fachbegriff: HoldObjective)
2. das Objekt, das man einfach nur zerstören muss, um das Ziel zu erfüllen. (Fachbegriff: DestroyableObjective_SM)
3. Das Objekt, das man einfach nur berühren muss, um das Ziel zu erfüllen. (Fachbegriff: ProximityObjective)
4. Das Objekt, bei dem man den Use-Button (E-Taste) betätigen muss, um das Ziel zu erfüllen. (Fachbegriff: UseObjective)
5. das Objekt, bei man ein bestimmtes Objekt aufheben muss und es an einen bestimmten Ort bringen muss, um das Objekt zu erfüllen. (Fachbegriff: ASOBJ_EnergieCore_Spawn; ASOBJ_EnergieCore_Delivery)

Zu 1.:
Den Actor findet man unter ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> ProximityObjective -> HoldObjective. Den addet ihr jetzt in die Map!
Der Actor allein reicht aber nicht, man braucht nämlich noch einen Mover, den ihr ebenfalls in die Map addet! (Beispel.: AS-Convoy, 1. Objekt ist "verbunden" mit der BordingPlattform. Sobald die BordingPlattform ausgefahren ist, ist das Objekt erfüllt!) Diesen Mover musst ihr zuerst einstellen, wohin er sich bewegen soll. wenn man auf dem HoldObjective steht, siehe dazu in dem Mover Tutorial!
Ihr könnt in den Properties des HoldObjectives auch noch einstellen, ob man nur in der Nähe des HoldObjectives stehen brauch oder ob man genau drauf stehen muss. Das macht ihr unter Collision. Dort stellt ihr die CollisionHight ein, das heißt, ob man auch z.B. 2 Meter darüber stehen kann und den CollisionRadius, das heißt, ob man auch z.B. 10 Meter entfernt das Objekt auslösen kann. Um zu sehen, wie groß, bzw. wie klein euer Gebiet ist, klickt ihr bitte auf die graue Leiste über dem 3D-Fenster (dort wo die ganzen Ansicht-Einstellungen sind) mit der rechten Maustaste und geht auf Actors -> RadiiView. Jetzt wird euer Gebiet, von dem markierten HoldObjective durch einen roten Zylinder angezeigt.

proof_assault_1.jpg

Diese Objekte müsst ihr jetzt "verbinden", dazu geht ihr wie folgt vor:
Ihr nehmt das HoldObjective und tragt dort in den Properties unter Event einen Tag ein und unter HoldObjective einen MoverTag!
Jetzt geht ihr in die Moverproperties und tragt dort unter Event den Tag ein, den ihr bei dem Holdobjective eingetragen habt und unter Tag tragt ihr den MoverTag ein, den ihr ebenfalls bei dem HoldObjective eingetragen habt!

z.B. proof_assault_2.jpg

Wichtig beim Mover sind jetzt folgende Einstellungen:

Mover Properties -> Mover -> MoverEncroachType -> ME_ReturnWhenEncroach
-> MoveTime (Die Zeit, die man auf dem HoldObjective stehen muss, damit das Ziel erfüllt ist)
-> Object -> InitialState -> TriggerAdvance

proof_assault_3.jpg

Zu 2.:
Den Actor findet man unter ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> DestroyableObjective -> DestroyableObjective_SM.
Wenn ihr den Actor ihn die Map addet, dann erscheint ein Cube ohne Textur (bzw. die Standard Textur). Damit man auch eine Tür oder ähnliches zerstören kann, muss man erst einen StaticMesh auswählen und in den Properties unter Display -> StaticMesh auf den "Use"-Button klicken.
Dann sind bei dem DestroyableObjective noch einige Einträge zu beachten:

DestroyableObjective_SM Properties -> DestroyableObjective -> bCanDefenderDamage (True= Verteidiger können das Objekt auch zerstören; False= Nur Angreifer können das Objekt zerstören)
-> DamageCapacity (Der Schaden, der dem Objekt zugefügt werden muss, um das Objekt zu zerstören)
-> DestroyableObjective_SM -> DestroyedStaticMesh -> (Der StaticMesh, der erscheint, wenn das Objekt zerstört wird. Dieser Eintrag ist nicht zwingend)

proof_assault_4.jpg

Wichtiger Zusatz dazu, s. bitte unter ScripedTrigger!
Zu 3.:
Den Actor findet man unter ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> ProximityObjective! Den Actor braucht ihr einfach nur in die Map zu adden und fertig! Schon ist das Objekt funktionstüchtig!
Man kann, wenn man möchte, auch noch den CollisionRadius ändern, siehe dazu bitte bei Zu 1.!

Zu 4.:
Den Actor findet ihr unter ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> ProximityObjective -> UseObjective! Das Objekt braucht ihr auch nur lediglich in die Map zu adden und schon funktioniert es!
Man kann, wenn man möchte, wie beim ProximityObjective, auch noch den CollisionRadius ändern, siehe dazu bitte bei Zu 1.!

Zu 5.:
Den Actor findet ihr unter 1. ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> ASOBJ_EnergieCore_Spawn,
2. ActorClassBrowser -> Actor -> NavigationPoint -> JumpDest -> JumpSpot -> GameObjective -> ProximityObjective -> ASOBJ_EnergieCore_Delivery!
Das Objekt hört sich vielleicht kompliziert an, ist es aber nicht! Es ist immernoch mit einer der einfachsten!
Den ersten Actor addet ihr dorthin, wo man den "Energiekern" aufheben soll und den zweiten dorthin, wo man ihn hinbringen soll!
Eigentlich würde er schon funktionieren, aber es gibt noch ein paar Einstellungen, die man ändern kann und auch ganz nützlich sind:
ASOBJ_EnergieCore_Spawn Properties -> ASOBJ_EnergieCore_Spawn -> FlagMesh (Der StaticMesh, den man aufheben muss, bei AS-Junkyard ist es ein Teil des Hellbenders)
-> Collision -> CollisionHigh (die Höhe, in der man stehen muss, damit man das Objekt aufheben kann. Ist genau wie bei Zu 1.)
-> Collision Radius ( der Radius, in dem man stehen muss, damit man das Objekt aufheben kann. Ist genau wie bei Zu 1.)

proof_assault_5.jpg

ASOBJ_EnergieCore_Delivery Properties -> Collision -> CollisionHigh (die Höhe, in der man mit dem Objekt stehen muss, damit das Ziel erfüllt ist . Ist genau wie bei Zu 1.)
-> Collision Radius ( der Radius, in dem man mit dem Objekt stehen muss, damit das Ziel erfüllt ist. Ist genau wie bei Zu 1.)


proof_assault_6.jpg


Die PlayerSpawnManager:
Das ist eine recht komplizierte Sache in dem Assault-Mod! Aber wenn man sie einmal verstanden hat, dann ist es ganz einfach!
Ich nehme ein Bild zur Hand dann ist es besser verständlich:


proof_assault_7.jpg


Also ihr startet bei der Zahl 1 müsst zu 2, wo aber Verteidiger aktiv sind. Wenn ihr das geschafft habt, dann startet ihr bei 2 und müsst zu 3, wo wiederrum die Verteidiger verteidigen!

Ihr setzt zu allen drei Stationen eine beliebige Anzahl von Playerstarts (z.B. 10). In den Properties geht ihr nun unter Playerstart und gibt dort unter TeamNumber ein:
Alle Playerstarts bei Station 1 müssen ein und dieselbe Zahl zugewiesen bekommen (z.B. 1), alle Playerstarts bei Station 2 müssen auch ein und dieselbe zugewiesen bekommen, aber eine andere als bei Station 1 (z.B. 2). Bei Station 3 gebt ihr auch unter TeamNumber bei allen Playerstarts die gleiche Zahl ein, aber wiederrum eine andere, als bei Station 1 und 2 (z.B. 3)!
Mehr müsst ihr bei den Playerstarts nicht ändern.
Nun addet ihr über jeden der "Playerstart Stationen" einen PlayerSpwanManager! zu finden unter ActorClassBrowser -> Actor -> Info -> PlayerSpawnManager!
Achtung:Bei Station 2 müsst ihr zwei PlayerSpawnManager adden, weil ja einmal dort die Attacker und einmal die Defender spawnen sollen!
Das ist der schwierige Teil! Dort müsst ihr nämlich relativ viel einstellen und es verstehen:
1. Unter PlayerSpawnManager Properties -> PlayerSpawnManager -> PlayerStartTeam gebt ihr die TeamNumber von den PlayerStarts ein, die unter dem PlayerSpawnManager sind, da ihr ihn ja eben über jeden PlayerStart Station geaddet habt!
Z.B. ihr hab bei Station 1 den PlayerStarts unter TeamNumber die Zahl 1 verpasst, dann müsst ihr in dem PlayerSpawnManager Properties unter PlayerSpawnManager -> PlayerStartTeam auch die Zahl 1 eintragen! d.h., dass dann der PlayerSpawnManager die Playerstarts mit der TeamNumber 1 kontrolliert!

2. Unter PlayerSpawnManager Properties -> PlayerSpawnManager -> AssaultTeam müsst ihr einstellen, ob die Attacker oder Defender spawnen sollen. EPSM_Attackers = Angreifer; EPSM_Defenders = Verteidiger. Also müsst ihr bei dem PlayerSpawnManager bei Station 1 auch EPSM_Attacker eintragen. Bei einem bei Station 2 müsst ihr ebenfalls EPSM_Attacker eintragen und bei dem anderen EPSM_Defender, weil, wie schon oben genannt, spawnen ja einmal dort die Angreifer und einmal die Vertediger! Und bei Station 3 müsst ihr EPSM_Defender eintragen, weil dort ja nie die Angreifer spawnen! (Ist klar, oder?)

3. Unter PlayerSpawnManager Properties -> PlayerSpawnManager -> bEnabled müsst ihr einstellen, ob ie PlayerStarts, bzw. der PlayerSpwanManager, schon beim Start der Map aktiv ist. (bEnabled dürft ihr nur bei Station 1 und bei dem PlayerSpawnManager mit dem Eintrag EPSM_Defenders bei Station 2 auf True stellen, da ja nur die Angreifer bei Station 1 und die Verteidiger bei Station 2 am Start der Map aktiv sind. der Rest muss auf False!)

4. Unter PlayerSpawnManager Properties -> PlayerSpawnManager -> bAllowTeleporting müsst ihr einstellen, ob man sich zu der Stelle teleportieren kann, wenn das jeweilige Team ihren "Spawn Platz" ändert. (z.B. bei AS-RobotFactory, wenn ihr dort das erste Objekt (die Satellitenschüssel ausrichten) erfüllt habt, dann spawnen die Angreifer ja bei der Satellitenschüssel und die Verteidiger bei der Ionenkanone. In dem Fall könnt ihr euch an diese Stelle teleportieren. D.h., wenn ihr bei den Panzern startet und die Satellitenschüssel wurde ausgerichtet (das Ziel wurde erfüllt), dann könnt ihr die Taste Q drücken und ihr spawnt bei der Satellitenschüssel, damit ihr nicht mehr den ganzen Weg laufen müsst) True = ja, man kann sich hinteleportieren; False = Nein, man kann sich nicht hinteleportieren.



Da das jetzt alles etwas schwierig ist zu verstehen, habe ich mal ein Beispiel gemacht, wie das bei meinem Beispiel aussehen sollte!
Ist zwar etwas durcheinander, aber für viele ist es bestimmt eine Hilfe, um das System der PlayerSpawnManager zu verstehen:

proof_assault_9.jpg
proof_assault_9_2.jpg

Wichtiger Zusatz dazu, s. bitte unter ScripedTrigger!

Jetzt kommt ein komplizierter Teil, der ScripedTrigger:
der ScripedTrigger, ist zwar auch kompliziert, aber soviel müsst ihr gar nicht beachten:
Zu finden unter ActorClassBrowser -> Actor -> KeyPoint -> AIScript -> ScripedSequence -> ScripedTrigger!
Den werdet ihr oft brauchen! Denn den verwendet man z.B. beim DestroyableObjective_SM oder beim PlayerSpawnManager.
So, nun aber zu den Verwendungen:
1. Beim DestroyableObjective_SM, dort verwendet man ihn, um einen Sound abzuspielen, nachdem das Objekt zerstört wurde, geht dazu wie folgt vor:
-Addet einen ScripedTrigger in die Map, am besten dorthin, wo das DestroyableObjective_SM ist! Dann geht in die Properties und dort unter AIScriped -> Actions und tragt dort erst mal eine neue Action ein, Action_Waitforevent! Dann klickt auf New! So, nun tragt ihr dort unter ExternalEvent ein beliebiges Wort oder eine Zahl ein! Dann geht ihr in die Properties des DestroyableObjective_SM und dort unter Event -> Event! Dort tragt ihr exakt das Selbe ein!
Nun geht ihr wieder in die Properties von dem ScripedTrigger unter AIScriped -> Actions und dort addet ihr eine neue Action (Action_PlaySound)! Wenn euer Objekt explodiert, wenn man es zerstört, dann gibt dort bitte einen Sound ein, der wie eine Explosion klingt! (z.B. Sound'ONSVehicleSounds-S.Explosions.Explosion09')
Das ganze könnte dann so aussehen:

proof_assault_10.jpg

2. Man verwendet es bei PlayerSpawnManagern, um sie aktivieren oder zu deaktivieren!
Geht dazu wie folgt vor:
-Addet einen ScripedTrigger in die Map! Dort tragt ihr jetzt fünf Aktionen ein, in genau dieser Reihenfolge:
1. Action_WaitForEvent
2. Action_TriggerEvent
3. Action_TriggerEvent
4. Action_TriggerEvent
5. Action_TriggerEvent

Zum besseren Verständnis:
Ihr habt ein Objekt, z.B. ein ProximityObjective, wenn das erfüllt wurde, spawnen die Angreifer und Verteidiger woanders. Damit das geschieht, muss erstmal darauf gewartet werden, dass das Objekt erfüllt wird. Das macht man mit der Action_WaiForEvent.
Dann müssen die beiden PlayerSpawnManager ( 1 Attacker; 1 Defender), die zu dem Zeitpunkt benutzt werden deaktiviert werden, das macht man mit den ersten beiden TriggerEvents, dort tragt ihr die beiden Events der beiden PlayerSpawnManagern ein (die Reihenfolge ist hierbei egal!)
Dann müssen die beiden “neuen“ PlayerSpawnManager aktiviert werden ( 1 Attacker; 1 Defender), dazu tragt ihr auch die Events der beiden PlayerSpawnManagern ein! (die Reihenfolge ist hierbei auch egal!)
Das ganze könnte folgendermaßen aussehen:

proof_assault_11.jpg
proof_assault_12.jpg

Die Reihenfolge der Objekte:
Damit man nicht alle Objekt nach Lust und Laune wild durcheinander erfüllen kann, muss man eine Reihenfolge festlegen! Das geschieht unter Objekt Properties -> GameObjective -> DefensPriority. Das Objekt, das man als letztes erledigen soll, bekommt die Zahl 0. Das Objekt, das man als vorletztes erledigen soll, bekommt die Zahl 1. Und so weiter und so fort!
z.B. AS-Robotfactory:
0 = AI-Generator
1 = ShieldGenerators x 3
2 = DataKabels
3 = MainGate
4 = Satellitenschüssel ausrichten

Ende der Runde:
Damit die Runde auch ein Ende hat, gibt es einen speziellen Actor, den Trigger_ASRoundEnd Actor! Zu finden unter ActorClassBrowser -> Actor -> Triggers -> Trigger_ASRoundEnd!
Den addet ihr jetzt in eure Map und tragt dort, in den Properties, unter Tag den Event des letzten Objekts ein!

proof_assault_13.jpg


Die Platzierung der Positionen der Verteidiger:
Das ist auch ein sehr wichtiger Teil!
Dazu benötigt ihr eine UnrealScripedSequence, zu finden unter ActorClassBrowser -> Actor -> KeyPoint -> AIScript -> ScripedSequence -> UnrealScripedSequence!
Den Actor addet ihr exakt dorthin, wo ein Verteidiger verteidigen soll!. Für jeden Verteidiger eine UnrealScripedSequence! Dort müsst ihr nicht viel Eintragen, aber ihr müsst in jedem eurer Objekt Properties noch einen zusätzlichen Eintrag vornehmen, unter GameObjektive -> DefenseScripedTags, dort gebt ihr etwas beliebiges ein. Ich nehme jetzt mal als Beispiel die Zahl 01. Der Eintrag muss aber bei jedem Objekt anders sein!
Dann geht ihr wieder in die Properties der UnrealScripedSequence unter Events -> Tag und gebt dort das ein, was ihr bei dem Objekt, das von dieser UnrealScripedSequence “verteidigt“ werden soll, eingetragen habt, in dem Falls jetzt 01!
Bsp.:

proof_assault_14.jpg

Der Weg der Angreifer:
Ein weiterer wichtiger Teil, der aber nicht schwer zu verstehen ist!
Dazu braucht ihr einen AssaultPath. Er wird sehr oft verwendet, z.B. in CTF oder BR!
Dort zeigt so was wie einen Alternativweg an. Aber hier zeigt er oft auch nur den normalen Weg an, denn es kommt oft vor, dass die Angreifer oft nicht wissen, wo sie langlaufen sollen! Dafür verwendet man in Assault den AssaultPath, zu finden unter ActorClassBrowser -> Actor -> NavigationPoint -> AssaultPath! Den addet ihr dorthin, wo die Angreifer hinsollen, am besten zu dem Objekt, zu dem sie hinsollen, die Nähe reicht! Dann geht ihr in den Properties unter AssaulPath -> ObjectiveTag! Dort gebt ihr einfach nur den Tag des Objekt ein, wo die Angreifer hinsollen!

proof_assault_15.jpg


Letzter Schliff:
Jetzt geht’s langsam aber sicher zum Ende und damit zum ausschmücken, was auch nicht gerade wenig ist, aber nicht gerade notwendig! Aber gerade so was zeichnet eine gute AS-Map aus! Also nicht aufhören, sondern weiterlesen! :-)


1. Die Info:
Die Info ist das, was immer oben rechts steht.
Die Info ist ganz einfach zu erstellen, bzw. einzutragen.
Geht dazu bitte in die Properties des jeweiligen Objekts und dort könnt ihr unter Assault, bzw. GameObjective die ganzen Infos eintragen. Hierzu einige Screenshots:

proof_assault_16.jpg
proof_assault_17.jpg

2. EndCamera:
Ihr habt sicherlich schon gemerkt, dass, wenn eine Runde aufhört, ohne dass das Team, das gerade angreift, erfolgreich angegriffen hat, das aktuelle Ziel nochmal gezeigt wird.
Dafür braucht ihr die AS-CinematicCamera, zu finden: ganz oben im ActorClassBrowser unter Actor! Die “Kamera“ addet ihr jetzt dorthin, von wo aus man das Ziel sehen soll und richtet sie per RotateActor aus. Dann geht ihr in die Properties und gebt unter Event -> Tag etwas ein, z.B. den Buchstaben A! Dann geht ihr in die Properties des Objekts und geht dort unter Assault und gebt dort das selbe ein, in meinem Beispiel wäre das A!

proof_assault_18.jpg

Fahrzeuge reinbauen:
Darauf sind bestimmt schon einige ganz wild! ;-)
Dafür braucht ihr die ASVehcileFactory, zu finden unter ActorClassBrowser -> Actor -> SvehicleFactory -> ASVehicleFactory! Die addet ihr jetzt dorthin, wo das Fahrzeug sein soll. Es erschient ein kleines rotes Auto! Dort geht ihr in die Properties unter SVehicleFactory, dort könnt ihr einstellen, was das für ein Fahrzeug sein soll!
ONSAttackCraft = Raptor
ONSHoverBike = Manta
ONSHoverTank = Goliath-Panzer
ONSMobileAssaultStation = Leviathan
ONSPRV = Hellbender
ONSRV = Scorpion

Und unter ASVehicleFactory könnt ihr mehrere Sachen einstellen:
bRespawnWhenDestroyed -> True = Das Fahrzeug erscheint immer wieder neu, wenn man es zerstört!
BVehicleTeamLock -> True = Das Fahrzeug kann nur von Leuten aus dem jeweiligen Team genutzt werden für andere ist es gesperrt!
VehicleHealth = Die Lebenspunkte des Fahrzeugs
VehicleLinkHealMult = die Schnlleigkeit, mit der es per LinkGun wieder aufgeladen wird!
VehicleTeam = Das Team ( 0 = Angreifer; 1 = Verteidiger)

Dem MinigunTurret könnt ihr auch so einfügen, zu finden unter ActorClassBrowser -> Actor ->SvehicleFactory -> ASVehicleFactroy -> ASVehicleFactory_MinigunTurret!
Es gelten die selben Einstellungen, wie oben!
Achtung: Man muss unter ASVehicleFactory_MinigunTurret -> ObjektiveTag den Tag des Objekts angeben, dass verteidigt werden soll, sonst benutzen die Bots die Turrets nicht!

proof_assault_19.jpg

Die Volumes:
Ihr habt bestimmt schon bemerkt, dass sobald man in die Nähe des Objekt kommt, fängt die ObjektInfo oben an stärker zu leuchten und wenn man ganz Nahe ist, erscheint ein blinkendes Ausrufezeichen!
Das macht ihr mit einem normalen Volume und dem ASCriticalObjectiveVolume!
Dazu geht wie folgt vor:
Setzt das normale Volume an den Bereich, wo , wenn man dort hineinkommt, die Objektinfo anfangen soll zu blinken! Dann gebt ihr in den Properties des Volumes unter Event -> Tag einen Begriff oder eine Zahl ein, mein Bsp.: XYZ! Dann geht in die Properties des betroffenen Objekts und geht dort unter GameObjective! Ganz oben ist ein Eintrag (AreaVolumeTag) Dort gebt ihr das selbe ein, bei meinem Beispiel wäre das XYZ!
Setzt das ASCriticalObjectiveVolume an den Bereich, wo , wenn man dort hineinkommt, das Ausrufezeichen erscheinen soll! Dann gebt ihr in den Properties des Volumes unter Event -> Tag einen Begriff oder eine Zahl ein, mein Bsp.: Assault! Dann geht in die Properties des betroffenen Objekts und geht dort unter GameObjective! Dort ist ein Eintrag (CriticalObjectiveVolumeTag) Dort gebt ihr das selbe ein, bei meinem Beispiel wäre das Assault!


So, das wars, bei Fragen wendet euch bitte an mich
Den Autoren
Proof