{"id":175,"date":"2024-02-22T19:42:00","date_gmt":"2024-02-22T19:42:00","guid":{"rendered":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/?p=175"},"modified":"2024-02-23T15:43:31","modified_gmt":"2024-02-23T15:43:31","slug":"gas-research-project-devlog_018","status":"publish","type":"post","link":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/2024\/02\/22\/gas-research-project-devlog_018\/","title":{"rendered":"GAS Research Project | DevLog_018"},"content":{"rendered":"\n<p>With the last week of the unit and handing in a bit early, I decided to start on a research project looking into the Gameplay Ability System framework in UE5. After attending the workshop in Lyra giving a brief overview, I saw a ton of potential in how it could be leveraged as a tool for collaboration with designers. \u00a0<br>\u00a0<br>To start, I wanted to build the basis \/ backend of this framework from scratch, as I feel like it would give me the best insight into how it works. It is supplied from the plugin provided by Unreal, with the functionality built by the developer in the Ability System Component. This is a custom actor component that is scalable, and modular, meaning it can be replicated across network and placed on any character within the game, (Player and NPCs). With the supplied component, all actors can communicate with one another with very lightweight gameplay tags. The communication is built from a shared language of Gameplay Abilities, Gameplay Effects and Attributes. All these datasets are made to be very easy to use (hardly any scripting needed aside from the backend built from the developer (me)) and can be assigned specific tags that are placed on source and target actors that are interacting in the world. These tags are recognized by the Ability System Component, which applies the correct effects to be applied when necessary. For example, a Gameplay Ability called &#8220;Attack\u201d could be fired by one character, if another is in range of that attack, a Gameplay Tag called \u201cMelee\u201d would be placed on that actor, which would trigger a TakeDamage event in the Ability System Component. BUT&#8230; If that target Actor had a previous Tag applied to it called \u201cInvulnerable\u201d the \u201cDamage\u201d Tag would not be applied, therefore no damage event would be triggered.\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"859\" height=\"502\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ASCTagHandler.png\" alt=\"\" class=\"wp-image-177\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ASCTagHandler.png 859w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ASCTagHandler-300x175.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ASCTagHandler-768x449.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><figcaption class=\"wp-element-caption\">Tag Handler in Ability System Component<\/figcaption><\/figure>\n\n\n\n<p>This is the ultimate simple form of this system in action. This can be extended into a deeply complex RPG with dozens of status effects, attack types, and Actor types. Each would have a replicated version\u00a0of the Base Ability System Component, with Base Attributes assigned. Made from these base classes, the subsets of child datasets could be tweaked very easily in whatever way necessary.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"263\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ActivateDamageEvent-1024x263.png\" alt=\"\" class=\"wp-image-178\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ActivateDamageEvent-1024x263.png 1024w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ActivateDamageEvent-300x77.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ActivateDamageEvent-768x197.png 768w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/ActivateDamageEvent.png 1309w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Trigger Gameplay Ability &#8220;Damage&#8221;<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"408\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AddTagToTargetActor-1024x408.png\" alt=\"\" class=\"wp-image-179\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AddTagToTargetActor-1024x408.png 1024w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AddTagToTargetActor-300x120.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AddTagToTargetActor-768x306.png 768w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AddTagToTargetActor.png 1166w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Add Damage Tag to Target Actor&#8217;s Ability System Component and active Gameplay Effect Damage<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"862\" height=\"488\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AttributeSetCPP.png\" alt=\"\" class=\"wp-image-180\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AttributeSetCPP.png 862w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AttributeSetCPP-300x170.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/AttributeSetCPP-768x435.png 768w\" sizes=\"auto, (max-width: 862px) 100vw, 862px\" \/><figcaption class=\"wp-element-caption\">Attributes Declared in CPP with Helper functions to direct Ability System Component<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-1024x409.png\" alt=\"\" class=\"wp-image-181\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-1024x409.png 1024w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-300x120.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-768x307.png 768w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-1536x613.png 1536w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities-1568x626.png 1568w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/InitialCharacterAbilities.png 1646w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Attributes Attached to Any Actor, with those attributes defined easily with scalable floats and Tags<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"660\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/CharactersInWorld-1024x660.png\" alt=\"\" class=\"wp-image-182\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/CharactersInWorld-1024x660.png 1024w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/CharactersInWorld-300x193.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/CharactersInWorld-768x495.png 768w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/CharactersInWorld.png 1210w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Two Characters with Replicated Ability System Components<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"991\" height=\"764\" src=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/GetMeleedNerd.png\" alt=\"\" class=\"wp-image-183\" srcset=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/GetMeleedNerd.png 991w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/GetMeleedNerd-300x231.png 300w, https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2024\/02\/GetMeleedNerd-768x592.png 768w\" sizes=\"auto, (max-width: 991px) 100vw, 991px\" \/><figcaption class=\"wp-element-caption\">Ability System Component recognizes Tag and initiates replicated damage event<\/figcaption><\/figure>\n\n\n\n<p>Here is the ultimate simple form working below. Two characters built from the same Class. The other difference between them is the skeletal mesh to differentiate between them. With no written blueprints or code, the player character can attack this character. Triggering the tagged event and affecting its health. \u00a0<br>\u00a0<br>This research project is just starting, but I would like to continue it on the side as a portfolio piece and see if I can implement this functionality into future collaborative projects with a larger scale.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the last week of the unit and handing in a bit early, I decided to start on a research project looking into the Gameplay Ability System framework in UE5. After attending the workshop in Lyra giving a brief overview, I saw a ton of potential in how it could be leveraged as a tool&hellip; <a class=\"more-link\" href=\"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/2024\/02\/22\/gas-research-project-devlog_018\/\">Continue reading <span class=\"screen-reader-text\">GAS Research Project | DevLog_018<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-175","post","type-post","status-publish","format-standard","hentry","category-devlog","entry"],"_links":{"self":[{"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=175"}],"version-history":[{"count":2,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/175\/revisions"}],"predecessor-version":[{"id":184,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/175\/revisions\/184"}],"wp:attachment":[{"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/andrewdalaimo.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}