I’m not sure you should be honored but I appreciate the sentiment. It’s just an old programmer helping other (probably younger) programmers 
There are almost no “crappy but no better solutions”. Some I’m sure but they are rare and are typically introduced when a platform doesn’t implement (or expose) a better solution. Not passing parameters to a custom event in VRChat for instance.
Nothing I see in InWaterObserverChanger suggests that a setter is required to process anything. Keep in mind that getters and setters are what is known as “syntactic sugar”. I like the sugar but they don’t expose any new functionality.
Quick review of this code reveals that you have 4 public “InWater” floats. These are a) constants and should be marked as such and b) you do not seem to have the equivalent “NotInWater”. I’m staring at the values and they seem to be identical. In any case you should not reference them as -1.0f in half the cases.
You’ve named one thing “set_walk_speed” and 3 others with a pattern that looks like “SetJumpPowerFactor”. Why not be consistent and use SetWalkSpeed?
Any time you see sets of lines that are almost identical consider a function that will reduce the exposure to bugs and probably increase testability. So the 4 GlobalMessenger.BroadcastMsg lines surely can be a private method. If you pass inWater as a parameter it should be able to handle the setting in either case.
I don’t see how enable gets set but you can make it private and and add a public SetEnable() method. Anything that would set the property would now just call the method. That method can set the property and execute whatever was needed.
A good compromise would be a 1 second period coroutine
Definitely a bad compromise and I would again reject your pull request. 
As that all gets cleaned up consider “as a rule” to not add code directly to an event. Your OnTriggerEnter and OnTriggerExit (again) do almost identical work with the only variant being a true or false value.
Call a method like ProcessTrigger(bool inWater) and call it from those events with the value you need.
Finally (and I know I’m pushing a limit here)
Consider not commenting the obvious.
bool InWater=false; // Is player in water ( true ) or not ( false )
The field is named InWater, if it isn’t clear enough then name it playerInWater. You don’t have comments on the other bools like what prevEnable is used for…
And it is good idea to explicitly add scope so private bool inWater is better. Yes it is private but there is nothing lost by explicitly writing it and you might question yourself whether something needs to be public or private as you are typing it.
And again, don’t add a 1 second period coroutine. It won’t make it through the review process 