This might take some trial and error on your end but I definitely think it’s doable. I’ll run with the example of archery upgrading through use in blueprints.
In your main character I would create a float variable for the Archery Skill and another float variable called something like "Archery practice. Alright so where your code lies for the archery attack, wheather the attack works on a line trace or off whatever the projectile hits gets damaged. You should want to get the archery practice variable and plug that into an addition that goes up one (for testing purposes) and plug what comes out of the addition node into a set archery practice variable.
I don’t know if I’m describing this well, but at this point, that archery practice variable should be going up each time archery is successful.
From here I would go back in the main character and get an event tick node (This isn’t reccomended I’m sure this can be done better).And get the archery practice variable and connect that to >= node, and set the number at like 10 or higher and connect that to a branch. if false nothing, if true set archery skill variable plus1 (get archery variable and addition node and send it up 1)
This is really really basic set and I’m sure this could be improved upon, and I didn’t touch on having any event, higher archery damage/accuracy or lights flash from the main character or something on level up. But with some trial and error there’s a lot you could do with this.
When you can try to move away from using an event tick for this, it can kill your games framerate.