I cannot see where EMI is referenced in this conversation? Perhaps someone edited a previous post and took it out, but for now this is a rather cryptic reference.
Anyway, for the OP, personally I don’t like set in variable declarations anyway. It can get very messy and for me the UI is a purly reactive thing. So I would have it only react to signals anyway.
Here I would use an autoloaded signal_manager (or most people seem to call it a signal bus).
signal coins_collected(number_of_coins: int)
signal coins_spent(number_of_coins: int)
So anywhere a coin is collected or spent the relevant signal is emitted (no need for any additional signal declarations). You could combine these into one (coin_amount_changed signal) but I like to keep my signals purpose as clear as possible.
Lets say 5 coins are collected in your player scene. Then to alert the UI or any other scene that needs to know:
SignalManager.coins_collected.emit(5)
The UI then just deals with the signal by listening for it.
However, I too don’t like to have too rapid a build up of signals. So the other thing I might do (which you mentioned) is if coins will be changing rapildy, is to have a ‘data_store’ autoload, that stores the current number of coins. Now anywhere this globally accessible number can be changed by any scene for any reason. Then in the UI update the coins value in the _process function by just checking the current data_store value.
Which is more performant? I don’t know. Is a simple _process function going to cause too much overhead, probably not. Is sending possibly four or five coin update signals going to be too bad, probably not either. If you are going to have tons of variables then sending a tons of signals for maintainability is not really great. But as you probably know, you would have to send literally a ‘shit ton’ of cascading signals across vastly distant scenes to have any noticeable impact on performance. For me it is more about maintainability and in a big var list, setters can really confuse any script IMHO.
So I think the answer is that either way is fine, there is no ‘correct’ way but it comes down to your coding style preferences. Mine is to have a list of vars be just that, without setters and getters all mixed in. And to have a UI that is purely reactive, not have it double as a data store.