Trouble with CharacterController RigidBody - Should I roll my own?

I’m trying to make a very ‘arcade-y’ racer game, and I’m having a couple issues:

I have a very specific idea in my head for how I want the physics to work, and I tried getting it to work with a RigidBody for a couple days, but I couldn’t even get anywhere close, so I gave up on that. But a CharacterController comes with a built in CapsuleCollider that I don’t want. A vertical capsule doesn’t fit the shape of my cars at all.

So… I’m halfway through rolling my own; I’ve got the driving and turning physics pretty much exactly where I want them, but I’m banging my head against Gravity - specifically, detecting collisions with the ground. Without characterController.Move() I’m not sure how to test for collisions, because I don’t get the return values to check for things. And I can’t find a definitive answer for if CharacterController.Move() will use any collider other than it’s built in capsule.

So I’m a bit stuck and not sure what I should do…

  • Without a RigidBody, I lose auto-gravity. (and some convenient side-to-side springyness that would handle body-rocking, but that’s simple-ish)
  • Without a CharacterController, I can’t use .Move() and more importantly it’s collision return values, but with it, I’m stuck with a collider I can’t use and don’t want.

Am I SOL here? Do I have to just brute force my way though the gravity problem? Or is there some way of contorting CharacterController to do what I want, so I can use Move() instead of “transform.position += blah;” like I am now? Or should I just suck it up and write my own gravity system from scratch.

My current car avatar setup is like this, so people can see sorta where I’m going:

CAR (Rigidbody [for the side-to-side springy sway] / ArcadeRaceCarController [homebrew controller])
--- Body (mesh for the body)
--- Wheel_FL (mesh for the wheel / WheelCollider )
--- Wheel_FR ( Same )
--- Wheel_BL ( Same )
--- Wheel_BR ( Same )

my ArcadeRaceController script currently doesn’t have much other than some vector math in FixedUpdate to determine which way the car goes, and then a ‘transform.position += vector’ to move.

Don’t use CharacterController for Racing game.
Just attach Rigidbody to Car GameOBject Parent use RigidBody.AddRelativeForce() to move your car in FixedUpdate()
Although, CharacterController will work for you, but its not a good practice.

About Gravity, WheelCollider are meant for Wheel Physics, they will take default gravity. Also you can control suspension, damping, drifting, etc from WheelCollider. Don’t forget to change Mass. It should be around 100-150.

Also, please refer a UnityCar example available on Unity Example resources. Its should be a good start for your game.

My first attempt was using a Rigidbody (and I went through the UnityCar tutorial as well, it was very helpful, but it seemed very geared towards a much more realistic game that I’m trying to make). The problem is that I spent two days (well, evenings) doing nothing but tweaking the numbers for the Rigidbody and for AddRelativeForce() and still couldn’t get the car to behave even close to how I wanted it to.

It seemed to be very hard to get a Rigidbody to handle in a more loose cartoonish way. For reference, I’m drawing my inspiration for car handling from old console racing games like Rock Roll Racing. And I couldn’t figure out how to get that feel using a Rigidbody. But I got the feel I want using just straight transform movement in like 45 minutes though once I started attempting to do it that way.

I can go back and play with the numbers on Rigidbody some more and see if I can get close to what I want, I guess.