Able Ability System Info and Support Thread

I actually prefer the shared skeleton approach, I was just trying anything I could think of to get the distinction made, and I definitely wouldn’t suggest up-ending the system as is. Could the animation asset binding expose a hook to grab an anim instance override using the dynamic identifier, maybe? I could absolutely be wrong, but I’d guess if you’re digging in far enough to be binding the asset, you can probably manage an interface call for which anim instance is gonna play it.


I implemented that fix as you suggested, however, that is making my animation play twice as fast. It also didn’t fix the blending issue. You probably implemented that missing delta time elsewhere already as it wasn’t progressing properly, so now it’s added twice. That’s my assumption anyways.
I’m curious how that has gone under the radar for so long? Aren’t people using the ability animation node for combos? Or for anything really?

@MichaelLiew
Just not using an option is not a good… option. I’d rather help fixing it.

Yea, looks like 4.25 / 4.26 update that value elsewhere - which is why you see it going twice. Interesting. So the original way was correct, I wonder if the guy that reported that bug is using an earlier engine version. I’ll double check with him.

You may want to put your branch just a bit before your Ability actually ends, so you never leave the Ability Anim state in your Animation Blueprint. If you queue up the next animation, your “Has Ability Animation” bool should never return false until the 2nd animation is done.

My branch is already set up like that, and it never evaluates to false after the first attack has started.
Even plugging in only the ability anim node into the anim BP results in it, so the idle animation is not even considered. It appears to be the starting frame(s) of the first attack (which starts from the idle).

From my perspective everything is set up correctly, just the blending is simply put…broken.

Hello! I’ve been loving ABLE so far! I saw a reply earlier stating it was easy for ABLE to hook into existing Stat systems, like AttributeSet from Unreals GAS.

What is the best way to do this? Should I be including “AttributeSet.h” into “ablAbility.h” or “ablAbilityComponent.h” or something entirely different? When I attempted this II ran into issues with the compiler, where it could not find attributeSet classes or "cannot open source file “attributeSet.generated.h”. Am I missing a step here?
Example - #include “…/…/…/…/…/Runtime/GameplayAbilities/Source/GameplayAbilities/Public/AttributeSet.h”]

My goal is to utilize curve tables for unique abilities and having that attached to my Able ability blueprints seems like a great method. So far it looks like curve tables are heavily interwoven within the GAS/Attribute system and since I’ve been running into problems exposing that to the able system I am at a loss for how to progress.

What would be a better method of extracting data from a curve table into the Able system?

The code looks correct, but I have things in a lot of pieces right now for the upcoming update, so I can’t verify things at the moment. I’ll schedule some time to look at it this weekend. If you have a demo project or whatever, that shows your setup and the issue, you can submit it here Dropbox and I’ll use it to verify things or find what’s going wrong.

Uploaded, it’s called “AbleBlendingBug.7z”.

I set it up so you only need to press Play and do one left click, the branch will automatically trigger.
The AnimBP has only the ability node feeding into the output pose. One bit of info: I’m also extracting root motion from those anim sequences instead of montages only. I don’t think it should matter here but I felt I should point it out regardless.

Also, Ability 3 and 4 were migrated too, but only 1 and 2 are relevant here.

Perfect! I’ll let you know what I find.

Sounds like your missing a module reference somewhere. I don’t use GAS so I can’t help you there, but there should be plenty of posts on how to properly enable GAS on the forums / youtube / google.

Once you have that, you can just reference those values when you go to calculate cooldown, damage, or whatever in the Ability Blueprints. You don’t need to add any includes or modify Able’s code in any way. Able will just ask “What should this Cooldown/Damage value be?” and that’s where you can do whatever logic and reference GAS if you want.

@Herdinstinct Try marketplace free “attributes extension”. It’s good, it’s multiplayer. It’s easy to work with. it works great with able. doesn’t have dependencies.

Thanks! I’ll look into that today!

Hmm Ok I will also look into this, so I can develop a better understanding of Unreal.

Maybe I am running into a similar issue when I attempt to inherit UAblAbility with a custom class from my project solution.

I saw your reply the other day about including module dependencies in my project .build.cs file -

yet in this new c++ class I am getting errors. I’ve got to be missing something important here but I just can’t see it :frowning:

Or should I go about this in a different way? Should I not inherit into a wrapper class around anything in able or am I just doing so incorrectly? Should I be trying to use UAblAbility or maybe ablAbilityComponent instead?

That error is saying there’s no default constructor - which is correct, AblAbility does not use the default constructor. You have to use the constructor that passes in the object initializer:



// Header
URPGAblAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

//Source
URPGAblAbility(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{

}


BUT you should really only do that if you plan to modify the Ability behavior and the normal hooks don’t work for you (or if you have a solid understanding of C++ and want to establish your own basic behaviors in your Abilities).

I would highly suggest you just use it out of the box with the normal hooks until you learn the C++ side a bit more. It’ll probably save you a lot of headache and work just as well.

@AngeIV This extension looks great for working within blueprints! Definitely an upgrade compared to the GAS attribute system! I am still unsure on how to go about using a curve table or data tables with this system.

My goal is to incorporate a data driven system to work with Able. For example I want to emulate a data system that scales off of levels to use with many different abilities - where I can export this data from a spreadsheet. [level number] + [Key name] = [value] curve tables do exactly this but so far I am finding no way of accessing this data within blueprints and my attempts at re-creating this via C++ have not been successful. But I am still wrapping my head around C++ with unreal and feel like I am inching closer. I guess at this point I need to create my own curve table reader and accompanying blueprint nodes to access. I am probably better off doing this in my project file for now and if it works out then making a plugin of it’s own? - Thinking out loud here, sorry. Using Attribute extension might be very helpful for me in getting this set up faster.

I think it might be really interesting to have some of these keynames as able gameplay tags, hopefully I can figure out a good way to wrap it together for a modular design experience, where we can add tags in a spreadsheet and have them propagate onto able abilities when imported.

Example of a data set I would like to emulate and connect with able

Looked at this today and I can’t repro it on my local changes (channeling with an input condition works fine on Server/Client/Listen Server for all observers). I changed quite a bit locally (this update is a big one), so it’s possible it got inadvertently fixed - but I’m not sure. If you have a project you can share, I can try it on my local stuff and verify things. Otherwise I’ll share my Test project once 4.26 is out and you can compare your setup vs mine.

@Herdinstinct Just store them in a data-table and save datatable row in character itself. Make interface to read directly from character (you need to store it in character not ability- as you need to SAVE values unless you restart game every time ;))
Then just BIND values in ability to data from this datatable row. EASY.

Reproduction here

Sorry for the late reply. Got incredibly waylaid by life stuff.

Looking forward to the update. I’ve reproduced the issue on a clean third-person template. It simply uses a passive, looping, channeled, HideMesh ability that sets the skeletal mesh component to hidden-in-game on start, and un-hidden on end. It also prints a string for good measure. It’s simply channeled on a “HideMesh” input, mapped to right mouse button. The behavior is consistent with what I’ve described and experienced in other projects.

It should be noted that I always test with network emulation active. However, the issue is consistent whether I’m using network emulation or not so I suppose it’s not too relevant.

Got it. I’ll verify things on this and let you know.

Looked at this a bit last night. Able is actually doing everything correct, it’s the Player controller that is coming back and saying the button isn’t held down after the first frame (so the client cancels it and then the server cancels it as well). Not sure why this is happening with your sample and not mine, but I’m still investigating.

Hmm. As you know, I didn’t touch anything with the player controller. This is beginning to sound like a “random checkbox somewhere in the default Unreal PlayerController needs to be ticked” kind of issue. If so, my apologies. I always do my best to check all documentation and and cover all my bases before I contact a developer about their product.

Yea, I don’t know if this is a 4.23 thing (which is what your project was originally targeting), or what. I’m also not sure why it’s just the client when playing locally with a listen server. Like I said, I have a project that uses pretty much a similar setup (it just plays an animation as long as the right mouse button is held) - and that works fine. But, again, still testing stuff. But yea, so far, Able is doing things correctly.