There are two different ways you could go about this:
Making a StarterCharacter. You could create a fish StarterCharacter that would run off the default Roblox character scripts. Then you could add custom movement animations and more.
You could create a custom character system. This would have no limitations but you would have to create everything from scratch. It’s longer and more difficult but better in the long run.
I’ve made a custom character system in the past, and I can say that although it wasn’t easy, it allows for massive flexibility and has no limitations. Obviously you want to start with a fish character model, which is welded and animatable. Get a quick swimming and idle animation ready. You can use the physics ownership system to set the model ownership to the client, so from a localscript in StarterPlayerScripts, you can make a movement system. Use some type of body mover to move the primary part (since it’s welded it’ll work) and move your fish around. For camera control, you can use camera.CameraSubject. There’s not much else, really… just focus on the main points of a character system, like movement and camera. Later on you can add cooler animations, sound effects, etc.