2D Physics-Based Movement - Rigidbody, Character Controller, or DIY?

I’m new to Unity and am currently working on a 2D physics-based puzzle platformer. I’ve been doing a ton of reading, research, and Google searching and while I’m leaning towards rigidbody, I’d like a second opinion.

Players control a character that cycles among three settings - heavy, default, and light. The idea is that if the player is in light mode, the player will be able to jump higher, move faster, and fall slower - regular and heavy are then self-explanatory. Switching from setting to setting will retain the velocity of the previous state, but will change the rate at which the character falls, jumps, or runs by adding or subtracting forces rather than translation.

So, I assume since I want to use forces I should use rigidbody. I have a background in math and physics, so I should be able to work it out. I don’t necessarily want as tight of a feel as Super Mario Bros, but I’d like it to get in that vicinity.

I’m using the free version of Unity with 2DToolkit, and I implemented an orthographic camera with a 1:1 unit to pixel ratio. So automatically I’m having to adjust all sorts of gravity and friction settings. The issues I have right now is trying to get the feel right (it’s very floaty) and determining the direction of collisions.

So how much control does Unity actually give over the physics engine? Should I look into raycasting? Is there a better way to go about this or should I just keep working with it? Thanks in advance!

The physics engine does a great job of automatically giving objects a realistic spin when they hit at odd places, or simulating the wobbling of a bottom-weighted punching balloon, or having friction skew a sliding long object around until it can roll over the short axis… . All that realistic-looking 3D stuff.

If you have a 2D player, who will stay upright and will only bounce and fall, hand-done vs. rigidbodies seems like a toss-up.

The built-in physics/rigidbody system does let you control quite a bit, and you can slip in code (there is no maximum fall speed, but you can write code to manually keep forcing it back.) But hand-coding all the physics yourself might feel less klugy, and you should still be able to use all the same collision detection.

A character controller requires you to hand-compute the movement, hand-add gravity… . The advantage is it has a slope limit, and will adjust movement to properly slide around obstacles. Things you probably won’t need.

Thanks for the input. Character controller is definitely out, and I think since I’m already working with Rigidbody, I’ll just continue. If I hit a wall, I’ll look into hand-coding it myself.