One of GetPropertyChangedSignal’s most common uses is to display an player’s stats on the client. You use it on a NumberValue inside the player’s data.
Use the 0.5s loop because what you are doing is polling and it will be easier to maintain the polling loop over time. Also polling gives you a chance to consider how various stats may interact or influence one another. With signals, you will probably have to reference other properties anyway in order to determine how the stat should be updated. Signals, on the other hand are better for triggering state driven things.
In sumarry: use a loop when polling, use a signal when you need to trigger an event
One of the ways I use a status system is to handle stuns, reason why I don’t just do “player stunned = true, wait(3) stunned = false” is because I want stuns to stack, if there’s several people attacking you I don’t want their stuns to cancel each other out.
One of the ways I solved this was having a basic loop running on the client, the client has full control of their physics so I realized it didn’t matter if I handled this on the client. I can’t seem to figure out how using GetPropertyChangedSignal can avoid this.
A more “efficient” (if you can even call it that) is having a stun function is basically just constantly setting it to true until the stun ends.
function = (stun time,…)
stun = true
while stunned = true do
stun = true
task.wait(.1)
end
stun = false
(This post better describes what I meant)
The reason why I brought up the idea of a 0.5s loops is because my game isn’t too heavy on the PVP side of things, I would naturally use RunService but I figured if I wanted to use a loop I might as well put several other things inside it.