Announcement

Collapse
No announcement yet.

Able Ability System Info and Support Thread

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Originally posted by AngeIV View Post
    I've downloaded the plugin today and I got only 4.15 and 4.16 didn't update the project. I see it on all the assets.

    I will test everything before coming back with questions. However as for now I must say its in the TOP 3 best assets I've got from marketplace. Funny thing is all of those 3 are plugins And many "project templates" that are extremely popular are literaly useless.
    Hmm, that's really weird... Yea, let me know if it causes you any problems. It could be a display thing, but that still scares me a bit since I've never heard of that happening before (and most of that is just straight engine code).

    Thanks for the praise. Let me know if you have any questions. I'm going to get another video hopefully sometime this weekend (I have a work thing on Sunday, so it'll likely be a Monday thing since its a holiday in the US and I have a rare day of nothing planned).

    EDIT: To be clear, if you download one of the Showcases and didn't update that - then it would make sense. But if its on your own project, then please report back with any issues.
    Able Ability System - A high performance, robust ability system for UE4. Now Available!

    Comment


      Excellent product your timing on the release was perfect as I just started using Unreal about a week before you launched =)

      I'm curious as to how you envision channelling abilities with a start / loop / end to them. For testing before jumping into Able I set up a Montage for a Block with the start animation moving into idle which would loop. The end was on a separate section in the montage and would play once the key was released. This works fine using the animation controller to tell the montage to jump to a new section once the blocking has been stopped.

      In Able I see no way to control the sections of a Montage so it seems right now it is just a good way to control a single animation against a slot. Which led me to drop the montage for the moment and at least try sequences to get this to work. The first attempt was placing all three animations in the ability and setting dependencies, with the ability on a loop with the Loop Start + Loop End set to the values of the Idle animation. This didn't work at all and wasn't looping the correct spot.

      Next I tried branching with the BlockAbility only playing the initial block animation then branching to the BlockingAbility set up with the idle animation and loop/channelled on the same button. That almost worked however the issue with this approach is the BlockingAbility never lets go, with a quick set of Print nodes in the graph I see that Idle starts but never ends.

      Thoughts? Need more info?



      Thanks!

      Comment


        Hey there, this time i'm back with few suggestions . So i wanted to make my hit boxes a little bit more accurate and decided to playing with the collisions a little bit and, so i tried to the collision sweep task and my problem with it is that it needs a socket so i can control it.
        I tried attaching it to my current main weapon socket, but the results was not what i hoped for. So i went back to collision query, and i rotated my cone shape to match the slash direction manually. (More on this after in a second)
        The problem with this approach is that the cone query ended a little bit earlier than what i want, so my suggestion is the following.

        Add an End time to collision query task, so that the collision query stays for the time it's required. "Note that i don't know much in UE4 about the subject of collisions, so this might not be possible, but it doesn't hurt to suggest."

        Ok so back to the slash shape direction, i found it hard to align the rotation of the cone with the slash direction, and that's because each time i rotate the cone, the location offset changes in relation to the world and it becomes harder to get the source of the cone query to be at my hand. Note that i tried attaching the source of the cone to my "which tbh is much faster" but when i rotate the cone it rotates in relation to the world, which gives me a result as seen in the following image.
        Click image for larger version

Name:	Capture2.PNG
Views:	1
Size:	535.9 KB
ID:	1128706

        So my next suggestion is to be able to rotate the cone query in the local space of the query (i hope that makes sense). so it will be much easier to have a slash shape query.

        Also in the next image you can see the values i used to get the cone to the shape of the slash "without attaching it to the socket" which took quite a bit of trial and error
        Click image for larger version

Name:	Capture.PNG
Views:	1
Size:	396.7 KB
ID:	1128705

        Cheers.
        Attached Files

        Comment


          [MENTION=741122]RodentGames[/MENTION]

          There's a couple ways you can setup looping animations for an infinitely channeled ability. The easiest way I've personally found is to simply break the animations out into 3 separate clips; start, loop, end. You then simply create Abilities for each that branch from one another, so. StartBlock (Plays the start animation, sets some flag saying you're blocking, etc) -> LoopBlock (Channeled Ability that loops and simply plays the loop animation while checking for inputs) -> EndBlock (Manually called when the LoopBlock Ability is interupted/stopped, plays the end clip and removes the "I'm blocking" flag). If you want to do it all in 1 Ability you can use the approach I outlined here where you simply set a boolean/flag on your character and simply have the Animation state machine take it over from there.

          [MENTION=764407]IronSuit[/MENTION]

          Hmm, I'll look at that rotation, it should be in local space rather than world space. That said, I don't think it'll give you the results since a 2D cone is always on the flat X/Z axis (rather than the plane you've setup by rotating it). That assumption is why its so fast. If you want super accurate, you probably need to use a box the size of your weapon, attach it to your hand socket, and then do multiple sweeps (a sweep is always from start -> end, directly, so if you have any curves in your animation - it'll be skipped unless you break it out over multiple sweeps).
          Able Ability System - A high performance, robust ability system for UE4. Now Available!

          Comment


            Originally posted by ExtraLifeMatt View Post
            [MENTION=741122]RodentGames[/MENTION]

            There's a couple ways you can setup looping animations for an infinitely channeled ability. The easiest way I've personally found is to simply break the animations out into 3 separate clips; start, loop, end. You then simply create Abilities for each that branch from one another, so. StartBlock (Plays the start animation, sets some flag saying you're blocking, etc) -> LoopBlock (Channeled Ability that loops and simply plays the loop animation while checking for inputs) -> EndBlock (Manually called when the LoopBlock Ability is interupted/stopped, plays the end clip and removes the "I'm blocking" flag). If you want to do it all in 1 Ability you can use the approach I outlined here where you simply set a boolean/flag on your character and simply have the Animation state machine take it over from there.
            .
            The first way you suggested is what I tried however the LoopBlock (as Channelled Ability w/ Looping on Input = Block) never lets go after the key is released. I used the video you did with ShooterGame and the automatic weapon as the basis for this setup but I've obviously done something wrong =). With some tweaks I can either make the branch fail to work or the LoopBlock to never end. Ideas?

            Thanks!

            Comment


              Originally posted by RodentGames View Post
              The first way you suggested is what I tried however the LoopBlock (as Channelled Ability w/ Looping on Input = Block) never lets go after the key is released. I used the video you did with ShooterGame and the automatic weapon as the basis for this setup but I've obviously done something wrong =). With some tweaks I can either make the branch fail to work or the LoopBlock to never end. Ideas?

              Thanks!
              It's hard to diagnose without seeing your setup. If I had to guess, I'd say its likely something broken in your Branching condition, or your looping condition. I'd take things a step at a time and see where the problem is. Start with just doing the Start -> Loop (without the Loop ability actually looping). Then setup the looping logic on the Loop Ability (but don't add the final branch). The only "trick" with the final branch (to the End ability), is you likely don't want to use a Branch Task. Instead, just add some logic in the OnAbilityEnd method in your Ability blueprint that manually calls Activate Ability on the Self Actor with the End Ability, that way you avoid any potential issues with conditionals that rely on the same input press or anything like that.
              Able Ability System - A high performance, robust ability system for UE4. Now Available!

              Comment


                Okay I attempted to approach this in a different way based on a post in this thread I completely missed!

                I set up an Animation State that will transition to the Block_Start animation if IsBlocking is set to true. I set the transition to Block_Loop on the ending of Block_Start and transition to Block_End if IsBlocking is false. IsBlocking is set up in the animation event graph to be read from the controller.

                I created a new ability and set it up only to have a GamePlayTag as a task roughly landing with the animation Block_Loop to start, with it Looping + Channelling on the input of Block. In the event graph I set the value of IsBlocking on the controller with the Ability Start Event.

                I've tested this without looping and it works perfectly so my guess is in the looping + channeling that is causing me the issue and I'm just blind to what I'm setting up incorrectly =)

                Is there any specific screenshots that would be helpful?


                Thanks!
                Last edited by RodentGames; 05-29-2017, 09:11 PM.

                Comment


                  Originally posted by ExtraLifeMatt View Post
                  It's hard to diagnose without seeing your setup. If I had to guess, I'd say its likely something broken in your Branching condition, or your looping condition. I'd take things a step at a time and see where the problem is. Start with just doing the Start -> Loop (without the Loop ability actually looping). Then setup the looping logic on the Loop Ability (but don't add the final branch). The only "trick" with the final branch (to the End ability), is you likely don't want to use a Branch Task. Instead, just add some logic in the OnAbilityEnd method in your Ability blueprint that manually calls Activate Ability on the Self Actor with the End Ability, that way you avoid any potential issues with conditionals that rely on the same input press or anything like that.
                  This is exactly how I had it set up, the BlockStart ability branches to the BlockIdle ability and the BlockIdle ability Event Graph was firing the Ability BlockEnd. Without looping this all worked fine it is as soon as I enable looping the chaneling just wouldn't stop =)

                  Comment


                    Originally posted by RodentGames View Post
                    This is exactly how I had it set up, the BlockStart ability branches to the BlockIdle ability and the BlockIdle ability Event Graph was firing the Ability BlockEnd. Without looping this all worked fine it is as soon as I enable looping the chaneling just wouldn't stop =)
                    Hmmmm.... Can you a screenshot of your Loop + Condition settings? I doubt I'll see anything but you never know.
                    Able Ability System - A high performance, robust ability system for UE4. Now Available!

                    Comment


                      Hah no worries! You can see the set up below and "Block" input is set up in the project settings to Left Shift.
                      Click image for larger version

Name:	AbleImage1.PNG
Views:	1
Size:	19.1 KB
ID:	1128766

                      I've moved the plugin into the project source so I can start muddling around and finding out where I've gone wrong so if this doesn't help I'll let you know what I find!

                      Comment


                        Originally posted by RodentGames View Post
                        Hah no worries! You can see the set up below and "Block" input is set up in the project settings to Left Shift.
                        [ATTACH=CONFIG]142895[/ATTACH]

                        I've moved the plugin into the project source so I can start muddling around and finding out where I've gone wrong so if this doesn't help I'll let you know what I find!
                        That looks correct. This isn't a passive (if it is, uncheck passive and see what you get) or anything is it? I was actually just looking at that code just to see if I could spy anything that might cause this and I didn't see anything off the top of my head. Have you verified it's the Ability that never stops looping and not the animation or some visual issue?
                        Able Ability System - A high performance, robust ability system for UE4. Now Available!

                        Comment


                          Originally posted by ExtraLifeMatt View Post
                          That looks correct. This isn't a passive (if it is, uncheck passive and see what you get) or anything is it? I was actually just looking at that code just to see if I could spy anything that might cause this and I didn't see anything off the top of my head. Have you verified it's the Ability that never stops looping and not the animation or some visual issue?
                          Oh I'm sorry I didnt mention that! As you can see below I have print strings as some debug for the abilities and Ability End / Ability Interrupt never fire. If those don't fire I don't currently have a way to remove the blocking flag so I'm relying on the Channeling of a Loop to still fire Ability End. Passive is not set up for this ability that seemed like the wrong approach =)


                          Click image for larger version

Name:	AbleImage2.PNG
Views:	1
Size:	252.6 KB
ID:	1128767

                          Comment


                            Okay I've got a fix in but I'm not sure it is the right fix. It turns out I'm in an Authoritative mode and the ability pointer is reset without ever telling the instance to finish. I added the else/FinishAbility() which allows it to cancel out of the ability properly. The question I have is what have I done differently in my ability/project settings that might not react in a way you anticipated?

                            Code:
                            		if (!ActiveChanged && m_ActiveAbilityInstance->IsChanneled())
                            		{
                            			if (!m_ActiveAbilityInstance->CheckChannelConditions())
                            			{
                            				// Condition(s) failed
                            				if (!IsAuthoritative())
                            				{
                            					// Pass things along to the server.
                            					ServerCancelAbility(m_ActiveAbilityInstance->GetAbilityNameHash(), m_ActiveAbilityInstance->GetChannelFailureResult());
                            				}
                            				else {
                            					m_ActiveAbilityInstance->FinishAbility();
                            				}
                            				m_ActiveAbilityInstance.Reset();
                            
                            				ActiveChanged = true;
                            			}
                            		}
                            Thanks again!

                            Comment


                              Originally posted by RodentGames View Post
                              Okay I've got a fix in but I'm not sure it is the right fix. It turns out I'm in an Authoritative mode and the ability pointer is reset without ever telling the instance to finish. I added the else/FinishAbility() which allows it to cancel out of the ability properly. The question I have is what have I done differently in my ability/project settings that might not react in a way you anticipated?

                              Code:
                              		if (!ActiveChanged && m_ActiveAbilityInstance->IsChanneled())
                              		{
                              			if (!m_ActiveAbilityInstance->CheckChannelConditions())
                              			{
                              				// Condition(s) failed
                              				if (!IsAuthoritative())
                              				{
                              					// Pass things along to the server.
                              					ServerCancelAbility(m_ActiveAbilityInstance->GetAbilityNameHash(), m_ActiveAbilityInstance->GetChannelFailureResult());
                              				}
                              				else {
                              					m_ActiveAbilityInstance->FinishAbility();
                              				}
                              				m_ActiveAbilityInstance.Reset();
                              
                              				ActiveChanged = true;
                              			}
                              		}
                              Thanks again!
                              Good catch. That change appears to be fine, although I'm curious why I haven't hit this issue locally when testing channeled abilities. I'll dig into my perforce history. Likely I'll add that change in the next update sometime this week (waiting to see if any other issues arise), assuming I don't run into issues locally.

                              Glad you were able to figure things out so quickly!

                              EDIT: Small change, you need to preserve the failure result:

                              Code:
                              				// Condition(s) failed
                              				if (!IsAuthoritative())
                              				{
                              					// Pass things along to the server.
                              					ServerCancelAbility(m_ActiveAbilityInstance->GetAbilityNameHash(), m_ActiveAbilityInstance->GetChannelFailureResult());
                              				}
                              				else
                              				{
                              					InternalCancelAbility(&m_ActiveAbilityInstance->GetAbility(), m_ActiveAbilityInstance->GetChannelFailureResult());
                              				}
                              Last edited by ExtraLifeMatt; 05-29-2017, 10:23 PM.
                              Able Ability System - A high performance, robust ability system for UE4. Now Available!

                              Comment


                                Originally posted by ExtraLifeMatt View Post
                                Good catch. That change appears to be fine, although I'm curious why I haven't hit this issue locally when testing channeled abilities. I'll dig into my perforce history. Likely I'll add that change in the next update sometime this week (waiting to see if any other issues arise), assuming I don't run into issues locally.

                                Glad you were able to figure things out so quickly!

                                EDIT: Small change, you need to preserve the failure result:

                                Code:
                                				// Condition(s) failed
                                				if (!IsAuthoritative())
                                				{
                                					// Pass things along to the server.
                                					ServerCancelAbility(m_ActiveAbilityInstance->GetAbilityNameHash(), m_ActiveAbilityInstance->GetChannelFailureResult());
                                				}
                                				else
                                				{
                                					InternalCancelAbility(&m_ActiveAbilityInstance->GetAbility(), m_ActiveAbilityInstance->GetChannelFailureResult());
                                				}
                                Thanks! I'll tweak my local copy for the time being then switch back after the next update.

                                Comment

                                Working...
                                X