- Home /
CharacterController vs Rigidbody (photo included)
Hi,
I have a player from 2D platformer tutorial (Lerpz) with set on it characterController and 2d platformer script. Now i Have this situation:
I mean what the hell ?! CharacterController has a capsule collider, those two sphere have a sphere collider, a rigidbody and attached simple script:
...
var stepHeight :float = 0.05f;
var currentHeight :float = 0.0f;
//zero for Up Direction, 1 for Right direction
var upOrDownDirection : int = 0;
var direction : Vector3;
@HideInInspector
var myRigidbody : Rigidbody;
var start = true;
var stopped = false;
var constantSpeed : float = 130.0f;
function Start()
{
myRigidbody = rigidbody;
MovementSpeed = Random.Range(100.0f, 130.0f);
//stepHeight *= MovementSpeed;
if( upOrDownDirection == 0)
{
direction = transform.TransformDirection(Vector3(0, 1.0, 0));
}
else
{
direction = transform.TransformDirection(Vector3(0.0, -1.0, 0));
}
}
function Update ()
{
}
//for RigidBody movement
function FixedUpdate ()
{
currentHeight = transform.position.y;
//stepHeight *= -1;
//myRigidbody.AddForce(direction * stepHeight, ForceMode.VelocityChange);
//myRigidbody.velocity = direction * stepHeight * MovementSpeed;
myRigidbody.velocity = direction * stepHeight * constantSpeed;
}
...
Answer by BigBlob · Apr 15, 2012 at 06:33 PM
The problem is is that the other two ones have to be a child of an empty GameObject. Also the rigidbody will not go together with character motor because the how are you suppose to move it, if it rolls down the hill.
Maybe this script will help with the rigid player:
var speed = 10.0;
var gravity = 10.0;
var maxVelocityChange = 10.0;
var canJump = true;
var jumpHeight = 2.0;
private var grounded = false;
@script RequireComponent(Rigidbody, CapsuleCollider)
function Awake ()
{
rigidbody.freezeRotation = true;
rigidbody.useGravity = false;
}
function FixedUpdate ()
{
if (grounded)
{
// Calculate how fast we should be moving
var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
var velocity = rigidbody.velocity;
var velocityChange = (targetVelocity - velocity);
velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
velocityChange.y = 0;
rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
// Jump
if (canJump && Input.GetButton("Jump"))
{
rigidbody.velocity = Vector3(velocity.x, CalculateJumpVerticalSpeed(), velocity.z);
}
}
// We apply gravity manually for more tuning control
rigidbody.AddForce(Vector3 (0, -gravity * rigidbody.mass, 0));
grounded = false;
}
function OnCollisionStay ()
{
grounded = true;
}
function CalculateJumpVerticalSpeed ()
{
// From the jump height and gravity we deduce the upwards speed
// for the character to reach at the apex.
return Mathf.Sqrt(2 * jumpHeight * gravity);
}
And heres a LINK to download an actual scene and the script with the player
Answer by chesterman · Apr 15, 2012 at 09:17 PM
I cannot clearly understand what exactly did you mean by saying: "The problem is is that the other two ones have to be a child of an empty GameObject. Also the rigidbody will not go together with character motor because the how are you suppose to move it, if it rolls down the hill." When I add those 2 spheres(which are standalone objects with rigidbodies) into empty gameObject it does not makes any changes - the result is the same as above picture. Do you propose to abandon the characterController and whole implementation from 2d Platformer script and use RigidFPS instead ?
Your answer
Follow this Question
Related Questions
Activate physics when animation ends 0 Answers
attached.Rigidbody isn't working with a ChactacterController? -1 Answers
Character collides with object so text pops up 0 Answers
force before ragdoll 1 Answer
Picking up items with Rigidbodies 2 Answers