Der Text ist noch WIP!!!
Ich bin mir nicht ganz sicher ob dies das richtige Forum hierfür ist, da es Teils Projektvorstellung ist, teils Workflow/DevDiary. Da man hier ja auf Deutsch schreibt geht das ja ohne Aufwand und es könnte für etwas Lese/Diskussions Stoff oder Fragen sorgen. Was Fragen angeht will ich das ganze relativ Transparent entwickeln, daher habe ich außer Zeit, kaum Hindernisse eine Frage zu dem ganzen auch zu beantworten:
Einführung
Ich habe schon seit längerem an einem "kleinem" Übrungsprojekt gearbeitet. Es gab im letztem halben Jahr auf Grund von Studien- und Diplomarbeit eine Pause und nun Arbeite ich wieder daran. Hauptsächliche Ziele sind für mich folgende:
- Lernen des Erstellens einer AI mit BehaviorTrees und EQS als Hauptkomponenten
- Programmieren eines recht allgemein gehaltenen Engine Moduls, was die Grundlagen für Menüs, Networking, etc für mich enthält und daneben auch Blueprint Libraries mit funktionen, die ich as nützlich erachte. Dieses sollte so sein dann ich es in so viel wie möglich Pojekten weiterverwenden kann.
- Programmieren der Grundlagen eines FPS, der vom Player Featureset eher Richtung Tactical FPS geht. Eine etwas realistischere Anwendungssituation schien mir sinnvoll für meine Übungen als nur kleinere Studien zur AI.
Anzumerken ist, dass es sich nur, um ein Hobbyprojekt handelt. Daher gibt es kaum richtige Zeitpläne oder substanzielle Pläne in welcher Form und wie ich es veröffentliche, wobei ich ab irgendeinen Punkt mindestens eine coocked Version irgendwo regulär hosten würde. Dieser thread soll in erster Linie als eine Art Devblog dienen in dem ich meine Gedanken und herangehensweise dokumentiere und die resultate zeige. Ich hoffe dass ich hiermit auch etwas meine Gedanken dazu Ordnen kann, oder vielleicht auch von euch etwas dazukommt.
Abkürzungen: FPS - first person shooter, FPP - first person perspective, TPP - third person perspective, BT - behavior tree, OSS - online subsystem, NYI - not yet implemeted
Der FPS Teil:
In diesem ersten Post gehe ich auf die schon bestehenden Features des FPS Teils ein. Je nach nachfrage schreibe ich vielleicht einen etwas detaillierteren Post zum Aufbau bestimmer systeme, aber wahrscheinlich keine richtigen Tutorials. Hier geht es hauptsächlich, um die Vorstellung dessen, was ich schon habe.
Allgemein
Statt wie normal in einem FPS habe ich mich an einer True FPP gewagt. Hierbei wird für FPP und TPP dasselbe Mesh verwendet. Zum einen hatte ich dafür schon ein setup für einen Prototypen für ein Parkour game erstellt, zum anderen wollte ich experimentieren wie doll ein Spiel davon profitiert, da in vielen FPS für mich Beine und Arme Perspektivisch falsch vorkamen, falls der Charakter überhaupt in der FPP Beine hatte. Ein recht neues Beispiel wo es Merkwürdig wirkt ist z.B. Rainbow Six Siege.
Hauptinspiration ist Rainbow Six Ravenshield. Das heißt meine ersten Ziele sind ein Coopfähiger "Terrorist"hunt Mode, Waffenanpassung, mindestens eine Waffe jeden Typs der existieren soll, mindestens ein Attachment jedes Typs das existieren soll, ein oder zwei kleinere Levels.
Ich habe mich für ein eher modernes Setting entschieden, damit ich für eventuelle Assets einfach Fotos als referenz nutzen kann. Das spart mir Konzeptzeichnungen, die ich eh nicht so gut kann.
Movement
Das Movement des Spiels ist relativ simpel und dicht an den schon bestehenden CharacterMovementComponent gehalten. Hinzu kamen das Kriechen und Sprinten. Als weitere Animationsbasierte Manöver gibt es auch Vaulting und Climbing, um kleinere Hindernisse zu überwinden. Des Weiteren kann man mit dem Scrollrad die Laufgeschwindigkeit des Charakters verringern/erhöhen. Es wurde auch dafür gesorgt, dass die AI auch auf diese Features zugriff hat. Zum einen funktioneren Climb und Vault nur über bestimme im Level platzierte Marker. Eine prozedurale Lösung wäre zwar möglich gewesen, jedoch kann ich so über ConstructionScripts automatisch NavLinks generieren, über die ich diese Movement Features ins NavMesh integrieren kann. Dadurch ist der AI schon beim Pathfinding klar, dass es diese Movements ausführen muss bzw. können die Movements von der AI getriggert werden, wenn die NavArea Class sich verändert. Die Grundidee dazu kam von diesem Tutorial von Mieszko Zielinski. Derzeitig läuft die Vault und Climb Bewegung über Root Motion ab, jedoch kann es sein, dass ich auf ein Pseudo-Root-Motion system umsteige, falls es probleme im Multiplayer damit gibt. (Näheres dazu ist in Videos zu Paragon von Epic erklärt)
Dazu gibt es das für Tactical FPS typische zur Seite lehnen. Dies ist jedoch eher ein Animation Feature.
[Demonstationsvideo folgt]
Die AI hat dazu noch zugriff auf ein simples Coversystem, wobei dieses eher als Verbindungselement zwischen AI-Movement und Animationen zu sehen ist.
Waffen
Das Waffensystem ist in C++ geschrieben. Der Zielworkflow soll am Ende so sein, dass man für eine standard-waffe nur Werte im Blueprint verändern muss und keine Zusätzlichen Nodes erstellen muss. Jedoch die möglichkeit hat über Funktionoverrides jegliche Funktionalität über Blueprint zu verändern. Will man also eine Waffe die beim Schießen nicht nur HitScan oder ein Projektil abfeuert, dann kann man z.B. die OnFire Funktion in Blueprint verändern. Soll es statt einen Muzzleflash vielleicht einen Effect am Waffenmaterial gehen (blinken, etc) dann erweitert man eben die SimulateFire Funktion.
Über Waffenattachments sollen, stats der Waffe verändert werden können. Dazu gehören eben Sights, Griffe, Laserpointer, etc, wie man es aus solchen Games kennt.
Ich nutze hauptsächlich die Waffe von Ironbelly studios aus dem Marketplace, da diese FPP Animationen besitzt, was für mich den Preis, recht gut kompensiert.
Animationsystem
Für die Animationen habe ich Kubolds Motion Capture Animationen genutzt. Diese decken das nötige Spektrum an Animationen für einen Shooter gut ab, jedoch sind diese hauptsächlich für TPP gemacht. Daher musste ich für die FPP über Skeletalcontrols die Waffe vor dem Kopf (und damit vor der Kamera) stabilisieren. Dies hatte zwar einen gewissen Aufwand an Arbeit, jedoch ermöglicht es mir noch folgende weitere Dinge:
Prozedurales Recoil/Weapon Swaying oder allgemein prozedurale Waffenanimationen und das Steuern der Arme über externe Objekte. Im jetzigen Status werden Recoilanimationen in den Waffen in Form von mehreren Float-Kurven festgelegt und Reload Animationen in der FPP werden von einem versteckten FPPMesh gesteuert, damit diese in der FPP gut bzw. wie in einem regulären FPS aussehen. Auch für Aim Down Sight kann ich die position der Waffe im Editor tweaken, statt es in einem Animationsprogramm tun zu müssen.
Als weiter Experimente habe ich vor, dass die Genauigkeitsverluste durch Bewegung in der Animation dargestellt werden, statt des derzeitigen Random Cone of Fire Systems.
Dazu gibt es auch Skeletalcontrols welche die Wirkelsäule steuern für das Lehnen nach rechts und links und SkeletalControls, mit denen ich Footplacement auf unebenem Untergrund vornehmen kann.
Man kann sich jetzt schon denken, dass diese Systeme zum Teil störend sein können in bestimmen Animationen. Will man z.B. die Vault Animation abspielen möchte man z.B. nicht unbedingt die Hände an der Waffe haben. Dazu habe ich zusätzliche Animation-Curves eingeführt, über die der Blend-Wert jeder dieser Controls gesteuert werden kann, falls eine Animation diese Funktionen nicht benötigen.
[Demonstationsvideo folgt]
UI/Menüs
Während ich das Ingame UI so minimal wie möglich halten will, möchte ich ein robustes UI system haben, welches auch Contoller Input gut unterstützt. Dabei will ich vorallem ein Gutes zusammenspiel zwischen C++ und UMG haben. Das Ideale Ziel für mich ist hierbei, wenn der Designspezifische Teil in UMG abläuft und nur sehr spezielle Logik dort in Blueprint Programmiert werden muss, während der Hauptteil der Logik in C++ stattfindet. Derzeitig läuft es so, dass ich für bestimmte Menüs C++ Basisklassen für die UMG Widgets erstellt habe und in den UMG Widgets bei Kopfdruck events die entsprechende Funktion aufrufe.
Geplante Menüs sind:
- Grafikoptionsmenü. Einstellen aller Scalability Settings und der nötigen DisplayFlags für Effekte wie Chromatic Abberation, Motion Blur, etc. (done)
- Sound options menü. Einstellen der Lautstärken (done), Verschiedene Sound Profile für Kopfhörer und Speaker betrieb. (NYI)
- Keybindings und Einstellen der Achsensensitivität für Maus. (done)
- Controllerbindungs und Einstellen der Achsensensitivitätskurven und Deadzones der Sticks. (NYI)
- HUD Customization (NYI)
- NewGame/HostGame Menü, Serverbrowser (WIP)
- Hauptmenü (done) mit Welcomescreen (NYI)
- Friendslist (integriert mit OSS) (WIP, anzeige der freunde und des online statuses funktioniert)
Jetziger Fokus:
Zurzeit strukturiere ich die AI gerade etwas neu, da ich nun das Prinzip der Behavior Trees besser verstanden habe, und erweitere die AI um Funktionen wie das in Deckung gehen, etc. Damit sollte vorallem das Problem gelöst werden können, dass man als Spieler wenige Chancen hat gegen die AI zu gewissen, wenn man überrascht wird.
Bevor ich ins Bett gehe lasse ich euch ein Video hier von dem, was ich habe in Aktion:
Mehr ist z.T. auf meinem Youtube Kanal zu finden. So einige neuere Videos sind noch nicht gelistet, da es recht kurze feature demonstrations für Kumpels im chat sind, da kommt später noch etwas.