I have managed to get character swimming to work as intended. I created physics volume as water volume, added use controller pitch to be able to swim up, set “can swim” to true. Controller pitch breaks regular walking mode(player can’t walk when looking on the floor). Settings for getting out of the water are sort of working, but they are very jittery and it’s hard to get out of the water as you except in other games.
I can live with these problems, but I want the ability to be able to change character movement mode without the use of physics volume. There is no physics volume component in actor blueprint and I tried to cast to character the message to change movement mode to swimming on collision overlap with my custom volume. That worked for only a single frame and did not change anything. Then I tried to cast to character every frame and that indeed turned on the swimming movement mode, but that mode appears to be broken when activated that way. Probably every frame somewhere in C++ OnMovementModeUpdate is executed triggering only initial part of swimming movement mode. That behavior results in a broken movement mode very different from the intended one with a physics volume.
Can I use a character swimming without physics volume? Why swimming mode is not working as intended out of the box? If there is no way to enable it correctly, I will probably try using flying movement for swimming, but that seems like a bad workaround of some inconsistency or error in character controller.