I would say that player.health is acceptable (barring public variables, of course!), but not only would player.gun.ammo.reoundsLeft be potentially dangerous, it also wouldn’t work in this code. gun & ammo are undefined, so there is no way that roundsLeft can be accessed. You would need a FindObjectOfType() (or similar) in player and an ammo = new Ammo() in Gun. I would then chain a PrintRoundsLeft() method (one in Player, one in Gun) which ends up with print(ammo.roundsLeft.ToString()) and begins with player.PrintRoundsLeft() in the GunUI.
I would then start to second guess myself on cohesion/coupling.